Office365 – Unable to update object

Pobujamy w chmurach, króciutko, ale mam nadzieję, że treściwie. Nie dawno miałem przyjemność dokonać migracji usługi Live@Edu do Office365 i jak można się domyślić idealna migracja występuje tylko w teorii. Owszem samo przeniesienie danych pomiędzy usługami zostało przeprowadzone bardzo sprawnie przez Microsoft, jednakże problemy pojawiły się po integracji usługi z własnymi kontrolerami domeny poprzez AD FS 2.0.
Mianowicie dla wszystkich użytkowników, a było ich około kilkanaście tysięcy, podczas każdorazowej synchronizacji przy użyciu Synchronization Service Manager zwracany był następujący kod błędu:

„Nie można zaktualizować tego obiektu, ponieważ nie znaleziono identyfikatora użytkownika.”

czyli

„Unable to update this object because the user ID is not found.”

Analiza problemu wykazała, iż konta usługi Active Directory oraz Office365 mimo iż posiadają wspólny atrybut UserPrincipalName nie są ze sobą powiązane, dlatego nie można odnaleźć odpowiedniego ID konta Active Directory w usłudze Office365. Jednocześnie, z racji iż odpowiedni UserPrincipalName jest już wykorzystany w systemie nie można założyć takiego konta dla Office365. Problem był dość uciążliwy, gdyż włączenie synchronizacji z usługą Active Directory uniemożliwia ręczne zakłada kont, a usuwanie duplikatów po stronie Office365 nie wchodziło w grę.

Po przejrzeniu w sieci ton dokumentacji, natrafiłem na prezentację z konferencji TechEd i wszystko stało się jasne:

„Cloud objects hard matched through sourceAnchor (Base64 AD ObjectGUID)”

Z racji, iż kont do zsynchronizowania było dość sporo, dlatego z pomocą tutaj przyszedł właśnie PowerShell, a mianowicie jego dwa moduły Active Directory oraz MSOnline.

Metodologia naprawy problemu:

1. Odczytanie GUID konta naszego przykładowego Kowalskiego

$ADUser = Get-ADUser jkowalski

2. Przekonwertowanie GUID do enigmatycznego sourceAnchor

$Base64 = [System.Convert]::ToBase64String($ADUser.ObjectGUID.ToByteArray())

3. Przypisanie sourceAnchor dla konta Office365

Set-MsolUser -UserPrincipalName $ADUser.UserPrincipalName -ImmutableId $Base64

I tak kilka tysięcy razy :), dlatego w ramach ułatwienia przedstawiam gotowe rozwiązanie:

Import-Module ActiveDirectory
Import-Module MSOnline
Connect-MsolService -Credential $OfficeCred

$ADUsers = Get-ADUser -Filter * -SearchBase "OU=jednostka,DC=contoso,DC=com"
$ADUsers | ForEach-Object {
  $Base64 = [System.Convert]::ToBase64String($_.ObjectGUID.ToByteArray())
  Set-MsolUser -UserPrincipalName $_.UserPrincipalName -ImmutableId $Base64
}

Oczywiście rozwiązanie to można by dowolnie rozwijać, jednakże starałem się zminimalizować je tak by ukazać tylko sedno sprawy.

Powyższa aktualizacja identyfikatorów, sprawiła iż problem synchronizacji stał się tylko historią do opisania.

Źródła:
http://media.ch9.ms/teched/na/2011/ppt/SIM320.pptx
http://media.ch9.ms/teched/na/2011/ppt/OSP325.pptx

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s