Active-Directory

以十進制向 AD 使用者寫入 ms-DS-ConsistencyGUID

  • November 3, 2020

我正在努力將使用者從一個 AD 轉移到另一個。由於我們從頭開始建構所有內容 - 新伺服器和客戶端,我們決定只從舊域導出使用者並導入新域,而不是通過 ADMT。

新域上的一切看起來都很好,但我在使用 AADConnect 時遇到了一些問題。我已經在暫存模式下在新域中設置了 AADConnect,並將源錨設置為 ms-DS-ConsistencyGUID - 舊域配置了 ObjectGUID。現在 ObjectGUID 對於舊域中的使用者當然是唯一的,但它們與雲身份的 ImmutableID 匹配。我從 Azure 導出了一個帶有 ImmutableID、DisplayName 和 UserPrincipalName 的 CSV,並找到了一個 powershell 工具,它將 ImmutableID 轉換為 Decimal,這似乎是 ms-DS-ConsistencyGUID 的首選格式。然後,我使用此 cmdlet 執行了一個使用者測試:

Set-ADObject -Identity 'DISTINGUISHEDNAME' -Replace @{'ms-DS-ConsistencyGUID'='123 456 78 90 1 23 456 78 901 234 5 67 890 123 45 678'}

它確實為使用者更新了 ms-DS-ConsistencyGUID,但不是以所需的格式。在屬性編輯器中查看 ms-DS-ConsistencyGUID 時,它以明文形式顯示值,但當您點擊編輯時,它顯示十六進制、二進制、十進制和八進制的不同值,但沒有一個與直接顯示的明文值匹配.

我還嘗試直接從舊 AD 導出 ObjectGUID,並嘗試執行此版本的上一個命令:

Set-ADObject -Identity 'DISTINGUISHEDNAME' -Replace @{'ms-DS-ConsistencyGUID'='[OLD_OBJECTGUID]'}

結果基本一樣。屬性編輯器中直接顯示明文值,但十進制值不匹配。

我可以進入屬性編輯器並在下拉框中選擇小數,然後添加我從上面提到的 powershell-tool 獲得的值,這似乎給了我正確的結果。

正確的 ms-DS-ConsistencyGUID

但是我必須為 100 多個使用者執行此操作,所以我真的更希望有一些我可以編寫腳本的東西。

更新:

我嘗試將 ImmutableID 轉換為 Hex,因為正確的實現似乎顯示了 Hex(用 \ 分隔對),並再次執行 Set-ADObject cmdlet,但改為使用 Hex 值。但它似乎只是顯示 Hex 的 Clear Text-value 並在後台轉換它,當您直接打開屬性時會看到。

兩者objectGUIDms-Ds-ConsistencyGuid儲存為類型System.Byte[](點擊包含 Syntax=Object(Replica-Link) 的行)。

如果您通過 PowerShell 查詢屬性,則objectGUID檢索為 typeGuidms-Ds-ConsistencyGuidasSystem.Byte[]

你有兩個選擇。

  1. 轉換GuidSystem.Byte[]並儲存在ms-Ds-ConsistencyGuid新使用者對象的屬性中,如下所示:
$olduser = Get-ADUser olduser
Set-ADUser newuser -Replace @{ "ms-Ds-ConsistencyGuid" = $olduser.ObjectGUID.ToByteArray() }
  1. 將 csv 中的 GUID 作為字元串導入,將其轉換為 Guid,然後將其System.Byte[]儲存在ms-Ds-ConsistencyGuid新使用者對象的屬性中,如下所示:
$guidString = "41a1d9c1-239f-4663-b3fb-82d7f29a0d1c"
$guid = [guid]$guidString
$guidByteArray = $guid.ToByteArray()
Set-ADUser newuser -Replace @{ "ms-Ds-ConsistencyGuid" = $guidByteArray }

引用自:https://serverfault.com/questions/1041094