如何修复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
相关产品推荐
相关产品推荐

