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

编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:18:22