我正在将用户从一个 AD 移动到另一个 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 获得的值,这似乎给了我正确的结果。
然而,我必须为 100 多个用户执行此操作,因此我宁愿拥有一些可以编写脚本的东西。
更新:
我尝试将 ImmutableID 转换为十六进制,因为正确的实现似乎显示十六进制(用 \ 分隔对),然后再次运行 Set-ADObject cmdlet,但改用十六进制值。但同样,它似乎只是显示十六进制的明文值并在后台进行转换,当您直接打开属性时就会看到它。
答案1
两个都objectGUID
和ms-Ds-ConsistencyGuid
存储为类型System.Byte[]
(单击包含 Syntax=Object(Replica-Link) 的行)。
如果通过 PowerShell 查询属性,则会objectGUID
检索为类型Guid
和ms-Ds-ConsistencyGuid
System.Byte[]
您有两个选择。
- 将其转换
Guid
为System.Byte[]
并将其存储在ms-Ds-ConsistencyGuid
新用户对象的属性中,如下所示:
$olduser = Get-ADUser olduser
Set-ADUser newuser -Replace @{ "ms-Ds-ConsistencyGuid" = $olduser.ObjectGUID.ToByteArray() }
- 从 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 }