Microsoft Defender for Endpoint: System Tags con Microsoft Intune
Microsoft Defender for Endpoint è una piattaforma di sicurezza volta a proteggere i dispositivi aziendali progettata per aiutare le aziende a prevenire, rilevare, analizzare e rispondere alle minacce avanzate nei propri Endpoint.
Questa soluzione di casa Redmond protegge la totalità degli Asset aziendali in quanto è multipiattaforma, che comprende:
- Laptop
- Smartphone
- Computer Fissi
- Tablet
- Server
Microsoft Defender for Endpoint permette quindi di avere una copertura totale degli asset aziendali, proprio in ottica Zero Trust.
Cosa è quindi l’approccio Zero Trust?
Zero Trust è un “modello” in Sicurezza informatica, che di fatto può essere riassunto in un’unica frase “non fidarsi mai, verificare sempre”.
Questo modello si basa su un’architettura che non considera attendibile nessun utente o dispositivo per impostazione predefinita, richiedendo invece autenticazione continua e rigorosi controlli di accesso, basati su identità, stato del dispositivo e altri fattori di rischio.
La casa di Redmond applica questo approccio con tecnologie come Microsoft Entra e Microsoft Defender, focalizzandosi su identità avanzate, verifica dei dispositivi, integrità delle app e accesso con privilegi minimi.
Perché utilizzare i System Tags in Microsoft Defender for Endpoint?
Ora che avete un’overview completa di come Microsoft vada incontro alla sicurezza delle organizzazioni, vorrei parlavi di una funzionalità che può essere veramente utile per le organizzazioni che decidono di intraprendere l’adozione di Microsoft Defender for Endpoint per la componente di Endpoint Protection, ovvero i Tag di Sistema per identificare in modo rapido i device all’interno del portale di Microsoft Defender XDR.
Vorrei darvi evidenza di come poter recuperare il “Company Name” dell’utente loggato in quell’Endpoint ed in automatico venga assegnato il tag con il nome della company, tutto questo in modo automatizzato attraverso script custom e Microsoft Intune.
Quali licenze sono necessarie?
Per poter sfruttare appieno le funzionalità che vengono descritte all’interno di questo articolo dovrete essere in possesso di Microsoft Defender in uno dei seguenti piani o suite che lo contengano:
- Microsoft Defender for Endpoint P1
- Microsoft Defender for Business
- Microsoft Defender for Endpoint P2
Vi riporto come sempre il sito di Aaron Dinnage, che svolge un lavoro eccezionale per le licenze Microsoft 365 Home | M365 Maps
Inoltre, una licenza per l’uso di Microsoft Intune per eseguire gli script.
Quali prerequisiti devo rispettare?
Per sfruttare le funzionalità presenti all’interno di questo articolo, dovrete rispettare alcuni prerequisiti, che per comodità vi riporto qui:
- Device gestito in Microsoft Defender for Endpoint
- Device Entra Join o Hybrid Entra Join
- Device gestito da Microsoft Intune
- Utente in Microsoft Entra
Questo perché il tag viene applicato agli endpoint all’interno del portale di Microsoft Defender XDR e lo script viene eseguito attraverso Microsoft Intune.

Figura 1: Licenze utilizzate per la demo, Microsoft 365 E5 che contengono l’uso di Microsoft Defender for Endpoint P2 e Microsoft Intune

Figura 2: Device che utilizzerò per darvi evidenza di questa funzionalità e che risulta essere onbordato in Microsoft Intune
Vi riporto gli step che faremo per creare lo script che legga la company name dell’utente che è loggato sull’Endpoint e poi configuri la chiave di registro in modo automatico:
- Creazione App Microsoft Entra per leggere il parametro “Company Name” dell’utente
- Creazione Script Powershell
- Caricamento Powershell in Microsoft Intune
Come prima attività rechiamoci in Microsoft Entra Admin Center

Figura 3: Creazione nuova APP per leggere la company dell’utente

Figura 4: Assegniamo un nome alla app, che sia parlante, e poi click su Register

Figura 5: Copiatevi ClientID, TenantID serviranno per lo script nelle fasi successive

Figura 6: Configuriamo un nome per il secret e impostiamo una scadenza dello stesso

Figura 7: Salviamo la value del secret, sarà visualizzabile una sola volta quindi prendetene nota

Figura 8: Aggiungiamo le permission per Microsoft Graph

Figura 9: Configuriamo “Application Permission”

Figura 10: Impostiamo il permesso “User.Read.All”

Figura 11: Concediamo i diritti al permesso appena configurato

Figura 12: Permessi configurati correttamente
Ora vi fornisco anche evidenza della company name di due utenti, con cui eseguirò la login sull’Endpoint in questione, in modo tale da far cambiare il tag assegnato al rispettivo Endpoint

Figura 13: Company Name dell’utente principale con cui stò utilizzando il dispositivo

Figura 14: Secondo utente, questa volta con nome di fantasia, che eseguirà la login sull’Endpoint
Ora possiamo predisporre lo script PowerShell, vi spiegherò ogni singola componente dello stesso in modo approfondito.
La prima parte dello script Powershell è la configurazione di TenantID, ApplicationID e Secret creati in precedenza:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# ===================================================================== # Configurazione app registration (Microsoft Entra ID) # ===================================================================== $TenantId = "Vostro Tenant ID" $ClientId = "Vostro ClientID" $ClientSecret = "Vostro Secret" |
Specifico che lo script è strutturato in parti o meglio funzioni che hanno un compito ben preciso.
Ora vi mostrerò una funziona utile ad ottenere un access token per il collegamento via Client_Credentials, necessario per il collegamento tramite Microsoft Graph, questa funzione richiama i parametri configurati all’interno dello step precedente
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# ===================================================================== # Funzione: Ottiene un access token per Microsoft Graph via client_credentials # ===================================================================== function Get-GraphAccessToken { param ( [string]$TenantId, [string]$ClientId, [string]$ClientSecret ) $body = @{ grant_type = "client_credentials" client_id = $ClientId client_secret = $ClientSecret scope = "https://graph.microsoft.com/.default" } $tokenEndpoint = "https://login.microsoftonline.com/$TenantId/oauth2/v2.0/token" try { $response = Invoke-RestMethod -Method POST -Uri $tokenEndpoint -Body $body -ContentType "application/x-www-form-urlencoded" return $response.access_token } catch { Write-Error "Errore nel recupero dell'access token: $($_.Exception.Message)" return $null } } |
Ora si renderà necessario recuperare il SAMName tramite explorer.exe
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# ===================================================================== # Funzione: recupera il SAMName dell'utente loggato usando explorer.exe # (funziona anche in contesto SYSTEM) # ===================================================================== function Get-LoggedOnSamNameFromExplorer { try { $explorerProcs = Get-Process explorer -IncludeUserName -ErrorAction SilentlyContinue } catch { Write-Warning "Impossibile leggere i processi explorer: $($_.Exception.Message)" return $null } if (-not $explorerProcs) { Write-Warning "Nessun processo explorer trovato: probabilmente nessun utente è loggato." return $null } # Prendiamo il primo explorer (utente console principale) $explorer = $explorerProcs | Select-Object -First 1 $userNameFull = $explorer.UserName # es. 'AzureAD\GuidoImperatore-MVPM' o 'DOMINIO\utente' if ([string]::IsNullOrWhiteSpace($userNameFull)) { Write-Warning "UserName non valido ottenuto da explorer." return $null } Write-Host "Utente loggato (grezzo da explorer): $userNameFull" # Se arriva come DOMINIO\utente → prendiamo solo 'utente' (SAMName) if ($userNameFull -like "*\*") { $samName = $userNameFull.Split("\")[-1] } else { $samName = $userNameFull } Write-Host "SAMName (senza dominio) rilevato: $samName" return $samName } |
Ora cerca nella chiave di registro IdentityStore\Cache il SAMName passato dalla precedente funzione
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# ===================================================================== # Funzione: cerca in IdentityStore\Cache una voce con SAMName = quello # passato e restituisce il valore 'UserName' (UPN) da quella chiave # # Percorso: # HKLM:\SOFTWARE\Microsoft\IdentityStore\Cache\<SID>\IdentityCache\<GUID>\ # valori: SAMName, UserName, ecc. # ===================================================================== function Get-UpnFromIdentityStoreBySamName { param( [string]$SamName ) $cacheRoot = "HKLM:\SOFTWARE\Microsoft\IdentityStore\Cache" if (-not (Test-Path $cacheRoot)) { Write-Error "La chiave $cacheRoot non esiste." return $null } Write-Host "Cerco in IdentityStore\Cache una voce con SAMName='$SamName'..." try { $sidKeys = Get-ChildItem -Path $cacheRoot -ErrorAction Stop } catch { Write-Error "Errore nella lettura di $cacheRoot : $($_.Exception.Message)" return $null } foreach ($sidKey in $sidKeys) { $identityCachePath = Join-Path $sidKey.PSPath "IdentityCache" if (-not (Test-Path $identityCachePath)) { continue } try { $identityEntries = Get-ChildItem -Path $identityCachePath -ErrorAction Stop } catch { Write-Warning "Impossibile leggere $identityCachePath : $($_.Exception.Message)" continue } foreach ($entry in $identityEntries) { try { $props = Get-ItemProperty -Path $entry.PSPath -ErrorAction Stop } catch { Write-Warning "Impossibile leggere le proprietà di $($entry.PSPath): $($_.Exception.Message)" continue } if ($props.SAMName -and $props.SAMName -eq $SamName) { Write-Host "Trovata voce IdentityCache con SAMName='$SamName' in $($entry.PSPath)" if ($props.UserName) { $upn = $props.UserName Write-Host "UserName (UPN) letto da IdentityCache: $upn" return $upn } else { Write-Warning "La voce trovata ha SAMName='$SamName' ma nessun valore 'UserName'." } } } } Write-Error "Nessuna voce IdentityCache trovata con SAMName='$SamName'." return $null } |
Ora è presente la parte dello script che richiama le funzioni per recuperare l’utente
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# ===================================================================== # 1. Recupera il SAMName dell'utente loggato # ===================================================================== $samName = Get-LoggedOnSamNameFromExplorer if ([string]::IsNullOrWhiteSpace($samName)) { Write-Warning "Nessun SAMName rilevato per un utente loggato. Esco senza modificare il registro." exit 0 } Write-Host "SAMName usato come chiave di lookup in IdentityStore: $samName" # ===================================================================== # 2. Recupera l'UPN dal registry IdentityStore\Cache usando SAMName # ===================================================================== $upn = Get-UpnFromIdentityStoreBySamName -SamName $samName if ([string]::IsNullOrWhiteSpace($upn)) { Write-Error "Impossibile determinare l'UPN per il SAMName '$samName'." exit 1 } Write-Host "UPN utente (da IdentityStore\Cache -> UserName): $upn" |
Ora otteniamo l’access Token e cerchiamo tramite Graph la companyName dell’utente loggato sul dispositivo
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# ===================================================================== # 3. Ottiene access token per Microsoft Graph # ===================================================================== $accessToken = Get-GraphAccessToken -TenantId $TenantId -ClientId $ClientId -ClientSecret $ClientSecret if (-not $accessToken) { Write-Error "Impossibile procedere senza access token." exit 1 } $headers = @{ "Authorization" = "Bearer $accessToken" } # ===================================================================== # 4. Recupera companyName dell’utente da Microsoft Graph usando l’UPN # ===================================================================== # Escape eventuali apici nell'UPN per usarlo nel filtro OData $filterUpn = $upn.Replace("'", "''") $graphUserUrl = "https://graph.microsoft.com/v1.0/users?`$filter=userPrincipalName eq '$filterUpn'&`$select=companyName" Write-Host "Chiamata Graph a: $graphUserUrl" try { $userResponse = Invoke-RestMethod -Method GET -Uri $graphUserUrl -Headers $headers } catch { Write-Error "Errore nella chiamata Graph per l'utente ${upn}: $($_.Exception.Message)" exit 1 } if (-not $userResponse.value -or $userResponse.value.Count -eq 0) { Write-Error "Nessun utente trovato in Graph con userPrincipalName = '$upn'." exit 1 } $companyName = $userResponse.value[0].companyName if ([string]::IsNullOrWhiteSpace($companyName)) { Write-Warning "L'attributo companyName per l'utente $upn è vuoto o non impostato. Nessuna modifica al registro." exit 0 } Write-Host "Company Name recuperato da Entra per l'utente: '$companyName'" |
Ora con tutti i parametri recuperati viene creata la chiave di registro per la System Tag
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# ===================================================================== # 5. Scrive/sovrascrive la chiave di registro per DeviceTagging in HKLM # HKLM\SOFTWARE\Policies\Microsoft\Windows Advanced Threat Protection\DeviceTagging # Valore REG_SZ: Group = companyName # ==================================================================== $regPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows Advanced Threat Protection\DeviceTagging" $regName = "Group" try { if (-not (Test-Path $regPath)) { Write-Host "La chiave di registro non esiste. La creo: $regPath" New-Item -Path $regPath -Force | Out-Null } if (Get-ItemProperty -Path $regPath -Name $regName -ErrorAction SilentlyContinue) { Write-Host "Il valore '$regName' esiste già. Lo sovrascrivo con: $companyName" Set-ItemProperty -Path $regPath -Name $regName -Value $companyName } else { Write-Host "Il valore '$regName' non esiste. Lo creo con: $companyName" New-ItemProperty -Path $regPath -Name $regName -Value $companyName -PropertyType String | Out-Null } Write-Host "Scrittura in HKLM completata con successo." exit 0 } catch { Write-Error "Errore nella scrittura della chiave di registro HKLM: $($_.Exception.Message)" exit 1 } |
Vi fornisco anche lo script definitivo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# ===================================================================== # Configurazione app registration (Microsoft Entra ID) # ===================================================================== $TenantId = "Vostro Tenant ID" $ClientId = "Vostro ClientID" $ClientSecret = "Vostro Secret" # ===================================================================== # Funzione: Ottiene un access token per Microsoft Graph via client_credentials # ===================================================================== function Get-GraphAccessToken { param ( [string]$TenantId, [string]$ClientId, [string]$ClientSecret ) $body = @{ grant_type = "client_credentials" client_id = $ClientId client_secret = $ClientSecret scope = "https://graph.microsoft.com/.default" } $tokenEndpoint = "https://login.microsoftonline.com/$TenantId/oauth2/v2.0/token" try { $response = Invoke-RestMethod -Method POST -Uri $tokenEndpoint -Body $body -ContentType "application/x-www-form-urlencoded" return $response.access_token } catch { Write-Error "Errore nel recupero dell'access token: $($_.Exception.Message)" return $null } } # ===================================================================== # Funzione: recupera il SAMName dell'utente loggato usando explorer.exe # (funziona anche in contesto SYSTEM) # ===================================================================== function Get-LoggedOnSamNameFromExplorer { try { $explorerProcs = Get-Process explorer -IncludeUserName -ErrorAction SilentlyContinue } catch { Write-Warning "Impossibile leggere i processi explorer: $($_.Exception.Message)" return $null } if (-not $explorerProcs) { Write-Warning "Nessun processo explorer trovato: probabilmente nessun utente è loggato." return $null } # Prendiamo il primo explorer (utente console principale) $explorer = $explorerProcs | Select-Object -First 1 $userNameFull = $explorer.UserName # es. 'AzureAD\GuidoImperatore-MVPM' o 'DOMINIO\utente' if ([string]::IsNullOrWhiteSpace($userNameFull)) { Write-Warning "UserName non valido ottenuto da explorer." return $null } Write-Host "Utente loggato (grezzo da explorer): $userNameFull" # Se arriva come DOMINIO\utente → prendiamo solo 'utente' (SAMName) if ($userNameFull -like "*\*") { $samName = $userNameFull.Split("\")[-1] } else { $samName = $userNameFull } Write-Host "SAMName (senza dominio) rilevato: $samName" return $samName } # ===================================================================== # Funzione: cerca in IdentityStore\Cache una voce con SAMName = quello # passato e restituisce il valore 'UserName' (UPN) da quella chiave # # Percorso: # HKLM:\SOFTWARE\Microsoft\IdentityStore\Cache\<SID>\IdentityCache\<GUID>\ # valori: SAMName, UserName, ecc. # ===================================================================== function Get-UpnFromIdentityStoreBySamName { param( [string]$SamName ) $cacheRoot = "HKLM:\SOFTWARE\Microsoft\IdentityStore\Cache" if (-not (Test-Path $cacheRoot)) { Write-Error "La chiave $cacheRoot non esiste." return $null } Write-Host "Cerco in IdentityStore\Cache una voce con SAMName='$SamName'..." try { $sidKeys = Get-ChildItem -Path $cacheRoot -ErrorAction Stop } catch { Write-Error "Errore nella lettura di $cacheRoot : $($_.Exception.Message)" return $null } foreach ($sidKey in $sidKeys) { $identityCachePath = Join-Path $sidKey.PSPath "IdentityCache" if (-not (Test-Path $identityCachePath)) { continue } try { $identityEntries = Get-ChildItem -Path $identityCachePath -ErrorAction Stop } catch { Write-Warning "Impossibile leggere $identityCachePath : $($_.Exception.Message)" continue } foreach ($entry in $identityEntries) { try { $props = Get-ItemProperty -Path $entry.PSPath -ErrorAction Stop } catch { Write-Warning "Impossibile leggere le proprietà di $($entry.PSPath): $($_.Exception.Message)" continue } if ($props.SAMName -and $props.SAMName -eq $SamName) { Write-Host "Trovata voce IdentityCache con SAMName='$SamName' in $($entry.PSPath)" if ($props.UserName) { $upn = $props.UserName Write-Host "UserName (UPN) letto da IdentityCache: $upn" return $upn } else { Write-Warning "La voce trovata ha SAMName='$SamName' ma nessun valore 'UserName'." } } } } Write-Error "Nessuna voce IdentityCache trovata con SAMName='$SamName'." return $null } # ===================================================================== # 1. Recupera il SAMName dell'utente loggato # ===================================================================== $samName = Get-LoggedOnSamNameFromExplorer if ([string]::IsNullOrWhiteSpace($samName)) { Write-Warning "Nessun SAMName rilevato per un utente loggato. Esco senza modificare il registro." exit 0 } Write-Host "SAMName usato come chiave di lookup in IdentityStore: $samName" # ===================================================================== # 2. Recupera l'UPN dal registry IdentityStore\Cache usando SAMName # ===================================================================== $upn = Get-UpnFromIdentityStoreBySamName -SamName $samName if ([string]::IsNullOrWhiteSpace($upn)) { Write-Error "Impossibile determinare l'UPN per il SAMName '$samName'." exit 1 } Write-Host "UPN utente (da IdentityStore\Cache -> UserName): $upn" # ===================================================================== # 3. Ottiene access token per Microsoft Graph # ===================================================================== $accessToken = Get-GraphAccessToken -TenantId $TenantId -ClientId $ClientId -ClientSecret $ClientSecret if (-not $accessToken) { Write-Error "Impossibile procedere senza access token." exit 1 } $headers = @{ "Authorization" = "Bearer $accessToken" } # ===================================================================== # 4. Recupera companyName dell’utente da Microsoft Graph usando l’UPN # ===================================================================== # Escap eventuali apici nell'UPN per usarlo nel filtro OData $filterUpn = $upn.Replace("'", "''") $graphUserUrl = "https://graph.microsoft.com/v1.0/users?`$filter=userPrincipalName eq '$filterUpn'&`$select=companyName" Write-Host "Chiamata Graph a: $graphUserUrl" try { $userResponse = Invoke-RestMethod -Method GET -Uri $graphUserUrl -Headers $headers } catch { Write-Error "Errore nella chiamata Graph per l'utente ${upn}: $($_.Exception.Message)" exit 1 } if (-not $userResponse.value -or $userResponse.value.Count -eq 0) { Write-Error "Nessun utente trovato in Graph con userPrincipalName = '$upn'." exit 1 } $companyName = $userResponse.value[0].companyName if ([string]::IsNullOrWhiteSpace($companyName)) { Write-Warning "L'attributo companyName per l'utente $upn è vuoto o non impostato. Nessuna modifica al registro." exit 0 } Write-Host "Company Name recuperato da Entra per l'utente: '$companyName'" # ===================================================================== # 5. Scrive/sovrascrive la chiave di registro per DeviceTagging in HKLM # HKLM\SOFTWARE\Policies\Microsoft\Windows Advanced Threat Protection\DeviceTagging # Valore REG_SZ: Group = companyName # ===================================================================== $regPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows Advanced Threat Protection\DeviceTagging" $regName = "Group" try { if (-not (Test-Path $regPath)) { Write-Host "La chiave di registro non esiste. La creo: $regPath" New-Item -Path $regPath -Force | Out-Null } if (Get-ItemProperty -Path $regPath -Name $regName -ErrorAction SilentlyContinue) { Write-Host "Il valore '$regName' esiste già. Lo sovrascrivo con: $companyName" Set-ItemProperty -Path $regPath -Name $regName -Value $companyName } else { Write-Host "Il valore '$regName' non esiste. Lo creo con: $companyName" New-ItemProperty -Path $regPath -Name $regName -Value $companyName -PropertyType String | Out-Null } Write-Host "Scrittura in HKLM completata con successo." exit 0 } catch { Write-Error "Errore nella scrittura della chiave di registro HKLM: $($_.Exception.Message)" exit 1 } |
Prima di una qualsiasi esecuzione vi fornisco anche evidenza che all’interno dell’Endpoint non è presente nessuna chiave di registro configurata

Figura 15: Chiave di registro per SystemTags non presente all’interno dell’Endpoint
Ora possiamo procedere a caricare lo script all’interno del portale di Microsoft Intune

Figura 16: Portale di Microsoft Intune sezione device

Figura 17: Sezione “Platform Scripts” di Microsoft Intune

Figura 18: Selezionate Windows 10 and Later in quanto il dispositivo e di quella versione di sistema operativo

Figura 19: Configuriamo un nome ed una descrizione parlante per il nostro script

Figura 20: Configuriamo in questo modo i parametri per lo script e selezioniamo lo script che abbiamo creato in precedenza

Figura 21: Una volta selezionato lo script, proseguiamo con la configurazione

Figura 22: Ora selezionato il gruppo di device a cui volete applicare lo script, nel mio caso “Intune_Internal_Cloud_Device”

Figura 23: Proseguiamo con la configurazione

Figura 24: Review e salvataggio definitivo della policy

Figura 25: Script salvato correttamente
Ora dovrete attendere che lo script “giri” all’interno del dispositivo, nel mio caso ci è voluta circa una mezz’ora, potete vedere la corretta esecuzione dello script

Figura 26: Click sul nome del Platform Scripts

Figura 27: Al momento lo script non è stato ancora eseguito
Dopo circa mezz’ora sull’Endpoint è comparsa la chiave di registro nel modo corretto

Figura 28: System Tag Presente all’interno dell’Endpoint dopo che lo script ha correttamente eseguito il lavoro

Figura 29: Script Eseguito correttamente sugli Endpoint

Figura 30: Device con il tag inserito dallo script correttamente presente all’interno del portale Microsoft Defender XDR
Ora vediamo se si logga sullo stesso Endpoint un altro utente cosa succede, lo script cambierà il tag, ho voluto così simulare il cambio di azienda del personale interno all’organizzazione

Figura 31: Con altro utente lo script sovrascrive il tag recuperando la Company dell’utente loggato in quel momento

Figura 32: Dopo la Sync il dispositivo compare con il nuovo tag
Conclusioni
In conclusione, questa funzionalità evidenzia come l’ecosistema sinergico di Microsoft sia in grado di integrare in modo efficace diversi workload ,in questo caso Microsoft Intune e Microsoft Defender, per raggiungere obiettivi concreti e di valore. La possibilità di creare gruppi dinamici direttamente da Microsoft Defender XDR e suddividere i device per azienda rappresenta un vantaggio significativo per tutte quelle organizzazioni che, all’interno di un unico tenant, gestiscono dispositivi appartenenti a differenti business unit.
Grazie a questa segmentazione avanzata, diventa inoltre possibile assegnare una visibilità mirata dei device ai referenti delle singole BU, migliorando la governance, la sicurezza e la gestione operativa dell’intero ambiente.