PowerShell获取AD组及嵌套组成员数遇外部组访问问题求助
解决AD组嵌套成员统计及外部组访问问题
完整解决方案脚本
function Get-ADGroupNestedMemberCount { [CmdletBinding()] param( [Parameter(Mandatory=$true)] [Microsoft.ActiveDirectory.Management.ADGroup]$Group ) $count = 0 # 获取组的直接成员,自动跳过无法访问的外部组/无效对象 $members = Get-ADGroupMember -Identity $Group -ErrorAction SilentlyContinue if ($members) { foreach ($member in $members) { if ($member.ObjectClass -eq 'group') { # 递归统计嵌套组的成员数 $count += Get-ADGroupNestedMemberCount -Group $member } else { # 统计用户/计算机类型的成员 $count++ } } } return $count } # 筛选名称以GROUP*开头的AD组 $targetGroups = Get-ADGroup -Filter "Name -like 'GROUP*'" # 生成包含组名和嵌套成员总数的结果集 $groupsWithMemberCount = $targetGroups | Select-Object Name, @{ Name = 'NestedMemberCount' Expression = { Get-ADGroupNestedMemberCount -Group $_ } } # 输出到可视化界面或导出CSV $groupsWithMemberCount | Out-GridView # $groupsWithMemberCount | Export-Csv -Path "C:\temp\file_test4.csv" -NoTypeInformation
方案说明
- 错误处理:通过
Get-ADGroupMember -ErrorAction SilentlyContinue跳过无法访问的外部组,避免脚本因权限问题中断 - 递归统计:自定义函数会自动遍历所有嵌套组,将嵌套组内的成员数累加到父组总数中
- 简洁结果:最终输出仅包含组名和嵌套成员总数,符合需求
可选调整
- 如果只需统计用户成员,可将
else分支改为if ($member.ObjectClass -eq 'user') { $count++ } - 若需同时显示直接成员数,可在
Select-Object中添加另一个计算属性:@{Name='DirectMemberCount';Expression={@(Get-ADGroupMember -Identity $_ -ErrorAction SilentlyContinue).Count}}
内容的提问来源于stack exchange,提问作者Zhynik
相关产品推荐
相关产品推荐

