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

如何修复PowerShell脚本实现Out-GridView展示选定AD组的全部成员

AD组成员查询脚本修复方案

原脚本存在的问题

  • 变量未匹配循环:遍历$groups获取的成员存储在$accounts数组中,但后续调用Get-ADUser时使用了未定义的单对象变量$account,没有遍历成员数组,导致仅返回单个结果
  • 对象类型过滤限制:仅调用Get-ADUser查询,会自动过滤掉计算机、嵌套组两类成员,无法返回全类型结果
  • 属性查询冗余:使用-Properties *拉取所有用户属性,执行效率低,仅需指定需要的属性即可

修复后的完整脚本

Import-Module ActiveDirectory

# 第一步:选择要查询的AD组
$groups = Get-ADGroup -Filter * -SearchBase "OU=Groups,DC=domain,DC=int" |
    Select-Object @{Name="组名称"; Expression={$_.Name}}, DistinguishedName |
    Sort-Object "组名称" |
    Out-GridView -Title "请选择需要查询的AD组,多选可按住Ctrl,选完点击确定" -PassThru

if ($null -eq $groups) {
    Write-Host "未选择任何组,脚本退出"
    exit
}

# 第二步:获取选中组的所有递归成员
$allMembers = foreach ($group in $groups) {
    Get-ADGroupMember -Identity $group.DistinguishedName -Recursive
}

# 第三步:根据成员类型查询对应属性,统一输出格式
$memberReport = foreach ($member in $allMembers) {
    $memberInfo = switch ($member.objectClass) {
        "user" {
            Get-ADUser -Identity $member.DistinguishedName -Properties EmailAddress, EmployeeID, TelephoneNumber, Created, Department, City |
            Select-Object `
                @{Name="成员类型"; Expression={"用户"}},
                @{Name="显示名称"; Expression={$_.Name}},
                @{Name="登录名"; Expression={$_.SamAccountName}},
                @{Name="邮箱"; Expression={$_.EmailAddress}},
                @{Name="员工ID"; Expression={$_.EmployeeID}},
                @{Name="联系电话"; Expression={$_.TelephoneNumber}},
                @{Name="创建时间"; Expression={$_.Created}},
                @{Name="部门"; Expression={$_.Department}},
                @{Name="城市"; Expression={$_.City}},
                @{Name="所属组"; Expression={$group.Name}}
        }
        "computer" {
            Get-ADComputer -Identity $member.DistinguishedName -Properties Created, DNSHostName, Enabled |
            Select-Object `
                @{Name="成员类型"; Expression={"计算机"}},
                @{Name="显示名称"; Expression={$_.Name}},
                @{Name="登录名"; Expression={$_.SamAccountName}},
                @{Name="邮箱"; Expression={"-"}},
                @{Name="员工ID"; Expression={"-"}},
                @{Name="联系电话"; Expression={"-"}},
                @{Name="创建时间"; Expression={$_.Created}},
                @{Name="部门"; Expression={$_.DNSHostName}},
                @{Name="城市"; Expression={if ($_.Enabled) {"已启用"} else {"已禁用"}}},
                @{Name="所属组"; Expression={$group.Name}}
        }
        "group" {
            Get-ADGroup -Identity $member.DistinguishedName -Properties Created, Description |
            Select-Object `
                @{Name="成员类型"; Expression={"嵌套组"}},
                @{Name="显示名称"; Expression={$_.Name}},
                @{Name="登录名"; Expression={$_.SamAccountName}},
                @{Name="邮箱"; Expression={"-"}},
                @{Name="员工ID"; Expression={"-"}},
                @{Name="联系电话"; Expression={"-"}},
                @{Name="创建时间"; Expression={$_.Created}},
                @{Name="部门"; Expression={$_.Description}},
                @{Name="城市"; Expression={"-"}},
                @{Name="所属组"; Expression={$group.Name}}
        }
    }
    $memberInfo
}

# 第四步:输出结果到Grid视图,支持多选导出
$report = $memberReport | Out-GridView -Title "选中AD组的所有成员列表(支持Ctrl多选复制)" -PassThru

改动说明

  • 增加了未选择组时的退出逻辑,避免空值报错
  • 对三类AD对象(用户、计算机、嵌套组)分别做属性查询,统一输出字段格式,无关字段用-占位
  • 去掉了冗余的全属性查询,仅拉取需要的字段,执行效率大幅提升
  • 支持按住Ctrl多选AD组批量查询,输出结果自带所属组标记,避免多组查询时混淆成员来源
  • 如果只需要查询用户成员,删除switch语句中computer和group两个分支即可

替代工具说明

无需额外第三方工具,上述修复后的脚本完全满足需求,且兼容所有已安装AD模块的Windows设备,无需额外部署。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:54:03