输入用户ID查询其SID关联的跨域AD组成员身份
解决域外AD组中通过用户ID查询关联组的问题
你的需求是输入用户ID,找出该用户SID在域外AD组中关联的所有组。原代码存在几个关键问题导致无法得到结果:
- 获取用户SID时只返回了对象而非纯SID字符串,后续对比无法匹配
- 直接将组集合传给
Get-ADGroup会出错,需要逐个遍历组 - 用字符串替换提取SID的方式不稳定,应该用正则精准提取
- 循环逻辑错误,未正确关联组和成员的匹配关系
以下是修正后的代码:
Write-Host "请输入用户ID" $userId = Read-Host # 目标域服务器地址 $targetLDAPServer = 'wwg00m.rootdom.net' # 获取用户的SID字符串 $userSID = (Get-ADUser $userId).SID.Value # 筛选目标域中符合条件的组(名称包含_EN) $targetGroups = Get-ADObject -Server $targetLDAPServer -LDAPFilter '(&(objectCategory=group)(name=*_EN))' # 存储匹配的组名 $matchingGroups = @() foreach ($group in $targetGroups) { # 获取当前组的所有成员 $groupMembers = Get-ADGroup -Identity $group.DistinguishedName -Server $targetLDAPServer -Properties Members | Select-Object -ExpandProperty Members # 遍历成员,筛选出外部安全主体(ForeignSecurityPrincipals)的成员,提取SID并对比 foreach ($member in $groupMembers) { if ($member -match '^CN=(S-\d-\d+(-\d+)+),CN=ForeignSecurityPrincipals,') { $memberSID = $matches[1] if ($memberSID -eq $userSID) { $matchingGroups += [pscustomobject]@{ 组名 = $group.Name 组DN = $group.DistinguishedName } # 找到匹配后跳出当前成员循环,避免重复添加同一个组 break } } } } # 输出结果 if ($matchingGroups.Count -gt 0) { Write-Host "用户$userId关联的域外组:" $matchingGroups } else { Write-Host "未找到用户$userId关联的域外组" }
代码说明:
- 获取用户SID:直接提取
SID.Value得到纯字符串,方便后续对比 - 遍历目标组:逐个处理每个符合条件的组,避免集合传入
Get-ADGroup报错 - 精准提取SID:用正则表达式匹配外部安全主体的SID格式,比字符串替换更可靠
- 匹配逻辑:找到用户SID对应的成员后,记录组信息并跳出当前成员循环,避免重复记录
内容的提问来源于stack exchange,提问作者Toon
相关产品推荐
相关产品推荐

