Verifica sync utenti con Office 365

Quando gli utenti Office 365 sono sincronizzati con Active Directory OnPremise, spesso capita che alcuni oggetti non vengano sincronizzati a causa di conflitti.
Ci sono varie ragioni per cui può accadere, adesso vediamo come individuarli.
Che cos’è l’ImmutableID?
E’ un attributo degli utenti su Office 365 che contiene il collegamento con l’utente OnPremise.
Un valore di esempio è “RDHiRneDPkiofrZ2nbYu7Q==”
Tramite un comando PowerShell è possibile convertire un ImmutableID in GUID[System.Guid]([System.Convert]::FromBase64String(“RDHiRneDPkiofrZ2nbYu7Q==”))

In questo modo è possibile verificare con quale oggetto OnPremise viene sincronizzato l’utente Office365.
Sulla base di questo comando ho scritto uno script che confronta tutti gli utenti Office 365 sincronizzati con i loro “gemelli” e lista quelli per cui non è corretto il collegamento.
Ecco la ricetta su un singolo utente 🙂
Il tutto va eseguito da un computer nel dominio AD OnPremise con i moduli Active Directory e Office 365 installati
Carichiamo i moduli Office 365 e Active Directory (con Windows 2012 R2 non è necessario)

Import-Module MSOnline
Import-Module ActiveDirectory

Ci connettiamo al tenant Office 365

$cred = get-credential
Connect-MSOLService -credential $cred

Mettiamo in due variabili il tenant e il dominio, potrebbero servirci dopo

$tenant = “tenant.onmicrosoft.com”
$UPNSuffix = “dominio.it”

In un’altra variabile mettiamo l’utente da verificare.

$O365User = Get-MsolUser -UserPrincipalName <utente@dominio.it>

Se l’utente Online e quello OnPremise sono uguali, impostiamo l’UPN, altrimenti, saltiamo al punto successivo

$UserUPN = $O365User.UserPrincipalName

Nel caso l’utente Online, a causa del conflitto, ha come UserPrincipalName il dominio del tenant, sostituiamo il tenant con il dominio

$UserUPN = $O365User.UserPrincipalName.Replace($tenant,$UPNSuffix)

Cerchiamo l’utente in AD OnPremise filtrando con l’UPN

$onPremUser = Get-ADUser -Filter {UserPrincipalName -eq $userUPN}

Da qui in poi è un’unica istruzione if

Controlliamo che esista la variabile precedente e convertiamo il GUID OnPremise nello stesso formato dell’ImmutableID

if ($onPremUser) {
$GUID = $onPremUser.ObjectGUID
$bytearray = $GUID.ToByteArray()
$immutableID = $null
$immutableID = [system.convert]::ToBase64String($bytearray)

Confrontiamo gli ImmutableID e, se sono diversi, ci darà un warning

if ($immutableID -ne $O365User.ImmutableId) {
Write-Warning “ID per utente $($O365User.UserPrincipalName) diverso”
Write-Host “Office365 ImmutableId: $($O365User.ImmutableId)”
Write-Host “OnPrem ImmutableId: $immutableID”

Convertiamo l’ImmutableID Online in GUID e cerchiamo con quale oggetto in AD OnPremise viene sincronizzato l’utente Online

if ($O365User.ImmutableId -ne $null) {
$decode = [system.convert]::frombase64string($O365User.ImmutableId)
$GUID365 = [GUID]$decode
$wrongUser = Get-ADUser -Identity $GUID365
Write-Host “L’utente errato è $($wrongUser.UserPrincipalName)”
}
else {
Write-Host “Probabilmente esiste già un utente Online `
$($O365User.UserPrincipalName)”
}

Chiudiamo i primi due if

}
}

Se non viene trovato l’utente OnPremise, lo segnaliamo

else {
Write-Host “UPN $userUPN non trovato”
}

Con un cliclo foreach è possibile verificare tutti gli utenti del tenant.

Arvedze