DanpLab · Lab NoteArchitettura operativa
Microsoft Entra ID, Azure & Intune: gestione identità moderna
Guida pratica alla gestione identità con Microsoft Entra ID (ex Azure AD), Intune per il device management e automazione con PowerShell e Graph API. Esempi reali di onboarding, Conditional Access e compliance.
4 min di letturaNota basata su utilizzo operativo reale
microsoftentraintuneazurepowershell
Il modello di identità Microsoft moderno
Microsoft ha unificato la gestione identità sotto Microsoft Entra ID (precedentemente Azure Active Directory). In ambiente ibrido, Entra ID si sincronizza con l'Active Directory on-premise tramite Entra Connect.
On-Premise Cloud
┌───────────────┐ ┌───────────────────────┐
│ Active │ Entra │ Microsoft Entra ID │
│ Directory │◄──Connect──►│ (ex Azure AD) │
│ Domain │ │ │
└───────────────┘ │ ┌─────────────────┐ │
│ │ Microsoft 365 │ │
│ │ Intune │ │
│ │ Azure │ │
│ └─────────────────┘ │
└───────────────────────┘
Entra Connect: configurazione ibrida
Installazione e sincronizzazione
Import-Module ADSync
Get-ADSyncConnectorRunStatus
Start-ADSyncSyncCycle -PolicyType Delta
Start-ADSyncSyncCycle -PolicyType Initial
Verifica utenti sincronizzati
Connect-MgGraph -Scopes "User.Read.All"
Get-MgUser -Filter "onPremisesSyncEnabled eq true" |
Select DisplayName, UserPrincipalName, OnPremisesSyncEnabled
Conditional Access: policy di accesso
Il Conditional Access è il sistema di policy che decide chi può accedere a cosa, da dove e con quali condizioni.
Policy base: MFA per accessi esterni
{
"displayName": "Require MFA - External Access",
"state": "enabled",
"conditions": {
"users": {
"includeGroups": ["All Users"]
},
"locations": {
"excludeLocations": ["Named Location - Office"]
}
},
"grantControls": {
"operator": "OR",
"builtInControls": ["mfa"]
}
}
Policy: blocca paesi ad alto rischio
$params = @{
"@odata.type" = "#microsoft.graph.countriesAndRegionsNamedLocation"
DisplayName = "Allowed Countries"
CountriesAndRegions = @("IT", "US", "GB", "DE")
IncludeUnknownCountriesAndRegions = $false
}
New-MgIdentityConditionalAccessNamedLocation -BodyParameter $params
Intune: Device Management
Enrollment automatico Windows
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\MDM" `
-Name "AutoEnrollMDM" -Value 1 -Type DWord
Compliance Policy Windows 10/11
Configura da Intune → Devices → Compliance policies:
{
"displayName": "Windows Compliance - Standard",
"scheduledActionsForRule": [{
"ruleName": "NonCompliant",
"scheduledActionConfigurations": [{
"actionType": "block",
"gracePeriodHours": 48
}]
}],
"settings": {
"bitLockerEnabled": true,
"codeIntegrityEnabled": true,
"secureBootEnabled": true,
"defenderEnabled": true,
"osMinimumVersion": "10.0.19041",
"passwordRequired": true,
"passwordMinimumLength": 12,
"passwordRequiredType": "alphanumeric"
}
}
Automazione con PowerShell e Graph API
Script: onboarding completo
param(
[string]$Nome,
[string]$Cognome,
[string]$Reparto,
[string]$Ruolo,
[string]$Manager
)
Connect-MgGraph -Scopes "User.ReadWrite.All", "Group.ReadWrite.All"
$username = "$($Nome.ToLower()).$($Cognome.ToLower())"
$upn = "[email protected]"
$password = [System.Web.Security.Membership]::GeneratePassword(14, 3)
$newUser = New-MgUser -DisplayName "$Nome $Cognome" `
-UserPrincipalName $upn `
-MailNickname $username `
-AccountEnabled $true `
-Department $Reparto `
-JobTitle $Ruolo `
-PasswordProfile @{
Password = $password
ForceChangePasswordNextSignIn = $true
}
Write-Host "✅ Utente creato: $upn"
$skuId = (Get-MgSubscribedSku | Where {$_.SkuPartNumber -eq "SPB"}).SkuId
Set-MgUserLicense -UserId $newUser.Id `
-AddLicenses @{SkuId = $skuId} `
-RemoveLicenses @()
Write-Host "✅ Licenza assegnata"
$groupId = (Get-MgGroup -Filter "displayName eq '$Reparto'").Id
New-MgGroupMember -GroupId $groupId -DirectoryObjectId $newUser.Id
Write-Host "✅ Aggiunto al gruppo $Reparto"
Write-Host "`n=== CREDENZIALI ==="
Write-Host "Username: $upn"
Write-Host "Password temporanea: $password"
Script: report licenze
Connect-MgGraph -Scopes "Directory.Read.All"
Get-MgSubscribedSku | ForEach-Object {
[PSCustomObject]@{
Prodotto = $_.SkuPartNumber
Acquistate = $_.PrepaidUnits.Enabled
Assegnate = $_.ConsumedUnits
Disponibili = $_.PrepaidUnits.Enabled - $_.ConsumedUnits
}
} | Format-Table -AutoSize
BitLocker con Intune
Policy BitLocker automatica
$devices = Get-MgDeviceManagementManagedDevice -All
foreach ($device in $devices) {
if ($device.OperatingSystem -eq "Windows") {
$compliance = Get-MgDeviceManagementManagedDeviceCompliancePolicyState `
-ManagedDeviceId $device.Id
[PSCustomObject]@{
Device = $device.DeviceName
User = $device.UserDisplayName
BitLocker = ($compliance | Where {$_.DisplayName -match "BitLocker"}).State
OS = $device.OsVersion
}
}
} | Export-Csv "bitlocker-report.csv" -NoTypeInformation
Best Practice
- ✅ Entra ID P2 per Privileged Identity Management (PIM) — accesso privilegiato just-in-time
- ✅ Naming convention chiara per gruppi e app registrations
- ✅ Breakglass account — almeno 2 account admin esclusi da Conditional Access
- ✅ Audit log abilitati e monitorati (almeno 90 giorni)
- ✅ App registrations con permessi minimi necessari
- ❌ Evita Global Admin per operazioni quotidiane — usa ruoli specifici
- ❌ Non sincronizzare account di servizio AD on-prem in cloud