You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

输入用户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关联的域外组"
}

代码说明:

  1. 获取用户SID:直接提取SID.Value得到纯字符串,方便后续对比
  2. 遍历目标组:逐个处理每个符合条件的组,避免集合传入Get-ADGroup报错
  3. 精准提取SID:用正则表达式匹配外部安全主体的SID格式,比字符串替换更可靠
  4. 匹配逻辑:找到用户SID对应的成员后,记录组信息并跳出当前成员循环,避免重复记录

内容的提问来源于stack exchange,提问作者Toon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:24:24