如何在PowerShell导出的通讯组列表中添加嵌套成员计数列?
解决PowerShell导出AD组/通讯组信息并统计嵌套成员总数的问题
原代码逻辑问题说明
你的原代码存在逻辑错误:Get-ADGroup遍历指定OU的组后,在ForEach-Object中执行Get-DistributionGroup -Filter *会导致每个AD组都重复导出所有通讯组的信息,而非针对当前AD组对应的通讯组进行处理。
修正并添加成员统计的代码
# 替换为你的目标OU路径 $OUpath = "OU=目标OU,DC=你的域名,DC=com" # 替换为你的CSV导出路径 $exportPath = "C:\powershell\DistributionLists\SecurityGroups.csv" Get-ADGroup -Filter * -SearchBase $OUpath | ForEach-Object { # 通过AD组的唯一标识匹配对应的通讯组 $distGroup = Get-DistributionGroup -Identity $_.DistinguishedName -ErrorAction SilentlyContinue if ($distGroup) { # 获取包含嵌套成员的总数,处理无成员或权限异常场景 $totalMembers = (Get-DistributionGroupMember -Identity $distGroup.Id -Recursive -ErrorAction SilentlyContinue).Count # 构造包含新增统计列的输出对象 [PSCustomObject]@{ Id = $distGroup.Id Name = $distGroup.Name PrimarySmtpAddress = $distGroup.PrimarySmtpAddress RequireSenderAuthenticationEnabled = $distGroup.RequireSenderAuthenticationEnabled TotalNestedMembers = $totalMembers ?? 0 } } } | Export-Csv -Path $exportPath -NoTypeInformation -Append
关键调整说明
- 逻辑修正:通过AD组的
DistinguishedName精准匹配对应的通讯组,避免重复导出所有通讯组的冗余操作 - 嵌套成员统计:使用
Get-DistributionGroupMember -Recursive获取所有层级的嵌套成员,通过Count统计总数;添加-ErrorAction SilentlyContinue避免因组无成员、权限不足等问题中断脚本执行 - 新增列处理:用
[PSCustomObject]构造输出对象,新增TotalNestedMembers列,通过?? 0确保无成员时显示0而非空值 - 性能优化:将所有结果统一通过管道导出到CSV,避免循环内重复调用
Export-Csv带来的性能损耗
内容的提问来源于stack exchange,提问作者sj1986
相关产品推荐
相关产品推荐

