编写PowerShell获取AD嵌套组函数报错,请求排查问题
问题原因分析
你的代码出现错误和逻辑问题主要有以下几点:
- 错误调用
Get-ADGroupMember:$ADGroup是目标组的Member属性值,里面包含用户、组、计算机等所有类型的AD对象DN。你直接遍历所有Member并传给Get-ADGroupMember,但这个cmdlet只能接收组对象作为输入,遇到用户(比如John)时自然找不到对应的组对象,抛出ADIdentityNotFoundException。 - 递归逻辑错误:你的函数定义没有接收参数,但调用
Get-NestedGroups $Groups时却传了参数;同时使用script:作用域的变量会导致递归过程中数据被覆盖混乱。 - 返回值无效:
$script:Groups存储的是AD对象的DN字符串,根本没有Name属性,最后返回$script:Groups.Name会得到空结果。
修正后的代码
function Get-NestedGroups { [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string]$GroupIdentity ) # 存储当前递归层级找到的组,避免重复 $foundGroups = @() # 获取当前组的信息,包含Member属性 $currentGroup = Get-ADGroup -Identity $GroupIdentity -Properties Member $foundGroups += $currentGroup # 遍历当前组的所有成员 foreach ($memberDN in $currentGroup.Member) { # 获取成员对象,判断是否为组 $member = Get-ADObject -Identity $memberDN if ($member.ObjectClass -eq 'group') { # 递归调用,获取嵌套组,并合并结果 $foundGroups += Get-NestedGroups -GroupIdentity $member.DistinguishedName } } # 返回去重后的组,按Name排序 return $foundGroups | Select-Object -Unique -Property DistinguishedName, Name | Sort-Object Name } # 调用示例 $targetGroup = "LGR-Test-RWX" Get-NestedGroups -GroupIdentity $targetGroup
关键改进点
- 参数化函数:明确接收
GroupIdentity参数,支持组名、DN、SID等多种标识方式。 - 先判断成员类型:用
Get-ADObject获取成员对象,先检查ObjectClass是否为group,再递归处理,避免对用户/计算机调用Get-ADGroupMember。 - 递归数据收集:用局部变量
$foundGroups收集当前层级的组,递归调用后合并结果,避免全局作用域变量的混乱。 - 有效返回值:返回去重后的组对象,包含DN和Name属性,排序后输出清晰结果。
内容的提问来源于stack exchange,提问作者Vladimir Konstantinov
相关产品推荐
相关产品推荐

