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
相关产品推荐
相关产品推荐

