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

PowerShell查询跨林嵌套AD组用户遇认证错误求助

解决跨林AD组递归成员查询的认证问题

我之前碰到过好几次这种跨林AD组递归查询的坑——Get-ADGroupMember -Recursive这个cmdlet在跨林嵌套组的场景下,经常会因为身份验证链断裂抛出认证错误,它没办法自动处理跨林访问的凭据切换。你能获取直接成员说明源林的权限没问题,但递归到目标林(in.new.domain)的组时,当前上下文没有足够的权限或者cmdlet本身不支持跨林递归的认证传递。

下面给你两个可行的解决思路和对应的脚本:

思路1:手动递归遍历组成员,按需指定跨林凭据/域控制器

这个方法避开Get-ADGroupMember -Recursive的局限性,手动遍历每个成员,遇到组就继续递归,碰到跨林对象时指定目标林的域控制器和有权限的凭据。

改进后的脚本

Import-Module ActiveDirectory

# 递归获取嵌套成员的函数
function Get-NestedADGroupMembers {
    param(
        [Parameter(Mandatory=$true)]
        [string]$GroupDistinguishedName,
        [PSCredential]$CrossForestCredential = $null
    )

    # 获取当前组的成员属性
    $getADObjectParams = @{
        Identity = $GroupDistinguishedName
        Properties = 'member'
        ErrorAction = 'Stop'
    }
    if ($CrossForestCredential) {
        $getADObjectParams['Credential'] = $CrossForestCredential
    }

    $currentGroup = Get-ADObject @getADObjectParams

    foreach ($memberDN in $currentGroup.member) {
        $memberParams = @{
            Identity = $memberDN
            Properties = 'objectClass'
            ErrorAction = 'SilentlyContinue'
        }
        if ($CrossForestCredential) {
            $memberParams['Credential'] = $CrossForestCredential
        }

        # 尝试获取成员对象
        $member = Get-ADObject @memberParams
        if (-not $member) {
            # 若获取失败,尝试解析目标域并指定对应DC
            $targetDomainParts = ($memberDN -split ',DC=') | Where-Object { $_ } | Select-Object -Skip 1
            $targetDomain = $targetDomainParts -join ',DC='
            $targetDC = (Get-ADDomain -Identity $targetDomain -Credential $CrossForestCredential).ReplicaDirectoryServers[0]
            $member = Get-ADObject @memberParams -Server $targetDC -ErrorAction Stop
        }

        # 如果是用户就输出,是组就继续递归
        if ($member.objectClass -eq 'user') {
            $member | Select-Object Name, SamAccountName, DistinguishedName, ObjectClass
        } elseif ($member.objectClass -eq 'group') {
            Get-NestedADGroupMembers -GroupDistinguishedName $member.DistinguishedName -CrossForestCredential $CrossForestCredential
        }
    }
}

# 配置参数
$GroupName = "XXapplication-access-group1"
$ExportFile = "\\server\script\$GroupName members.csv"
# 弹出窗口让你输入in.new.domain林的有权限账号凭据
$crossForestCred = Get-Credential -Message "请输入in.new.domain域中拥有AD读取权限的账号凭据"

# 获取源组的DN(如果已经知道DN可以直接替换)
$sourceGroup = Get-ADGroup -Identity $GroupName -Server "vs.old.domain"

# 执行查询并导出
Get-NestedADGroupMembers -GroupDistinguishedName $sourceGroup.DistinguishedName -CrossForestCredential $crossForestCred |
    Export-Csv $ExportFile -NoTypeInformation

思路2:检查跨林信任与权限配置

在跑脚本之前,先确认几个基础配置:

  • 确认vs.old.domain和in.new.domain之间是双向可传递信任,如果是单向信任,需要确保当前运行脚本的账号在目标林有读取AD用户/组对象的权限。
  • 测试基础跨林访问是否正常:比如运行Get-ADUser -Identity "目标林用户名" -Server "in.new.domain" -Credential $crossForestCred,如果这个命令失败,先解决跨林认证的基础问题(比如信任是否生效、账号权限是否足够)。

原错误的原因解释

Get-ADGroupMember -Recursive在处理跨林嵌套组时,会尝试用当前登录上下文访问目标林的AD对象,但跨林场景下这个上下文往往没有权限,而且cmdlet本身不会提示你输入跨林凭据,直接抛出认证失败的错误。手动递归的方式可以精准控制每个对象的访问凭据和目标域控制器,从而绕过这个限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:38:04