关于Microsoft Entra Connect Sync环境中用户SID一致性及代码有效性的问询
Azure混合环境中Entra ID与本地AD用户SID一致性及PowerShell代码问题解析
核心问题解答:SID是否一致?
不一致。本地Active Directory的用户SID是域内唯一的安全标识符,由本地域控制器生成。通过Microsoft Entra Connect Sync同步到Azure Entra ID的用户,会生成一个独立的Azure AD专属SID(可通过Convert-AzureAdObjectIdToSid转换得到),这个SID和本地AD的用户SID完全不相同。这是导致你提供的四段PowerShell代码执行失败的根本原因。
各段PowerShell代码失败原因分析
代码1:SecurityIdentifier转换失败
$objSID = New-Object System.Security.Principal.SecurityIdentifier($SID); $objUser = $objSID.Translate([System.Security.Principal.NTAccount]);
Windows的SecurityIdentifier类仅能识别本地AD域账户、本地机器账户的SID,无法识别Azure AD专属SID。调用Translate方法时,系统找不到对应的NT账户,会抛出“无法将安全标识符转换为账户名”类的错误。
代码2:LDAP查询无结果
$LDAPQuery = "LDAP://<SID=$SID>"; $AdRecord = [adsi]$LDAPQuery;
LDAP查询指向的是本地Active Directory的数据库,Azure AD的SID不存在于本地AD的对象集合中,因此查询会返回空对象或直接报错“找不到对象”。
代码3:注册表路径不存在
$RegistryDrive = New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS; $RegistryFolder = "{0}:\{1}\Volatile Environment" -f $RegistryDrive.Name, $SID; $UserDomain = (Get-ItemProperty -Path $RegistryFolder).USERDOMAIN; $UserName = (Get-ItemProperty -Path $RegistryFolder).USERNAME; $objUser = ("{0}\{1}" -f $UserDomain, $UserName);
HKEY_USERS注册表分支下仅存储本地系统中登录过的用户(本地账户或域账户)的SID对应的配置项,Azure AD的SID不会出现在这里,执行时会报错“指定的路径不存在”。
代码4:WMI查询无匹配对象
$WmiQuery = "root\cimv2:win32_sid.sid='{0}'" -f $SID; $WmiObject = [WMI]$WmiQuery; $objUser = ("{0}\{1}" -f $WmiObject.AccountName, $WmiObject.ReferencedDomainName);
Win32_SID WMI类仅维护本地系统可识别的SID列表(本地/域账户),Azure AD的SID不在该列表中,查询会返回空对象,后续调用AccountName和ReferencedDomainName属性时会抛出“未将对象引用设置到对象的实例”错误。
内容的提问来源于stack exchange,提问作者A LaMark
相关产品推荐
相关产品推荐

