按部门筛选AD用户并排除指定安全组的PowerShell求助
解决AD部门用户安全组报告的排除组问题
修正后的完整代码
Clear-Host $Department = 'Accounts' # 定义需要排除的组名称,可根据需求添加/修改 $ExcludedGroups = @('Domain Users', 'Domain Guests', 'Accounts Department Default') # 初始化存储结果的集合(原代码未定义集合会报错) $reportTable = [System.Collections.Generic.List[PSCustomObject]]::new() # 获取指定部门的启用用户,直接获取账号名和真实姓名(提升报告可读性) $targetUsers = Get-ADUser -Filter "department -eq '$Department' -and enabled -eq 'True'" -Properties sAMAccountName, Name foreach ($user in $targetUsers) { # 获取用户的所有组,再过滤掉排除组+只保留安全组(可按需去掉安全组筛选) $userGroups = Get-ADPrincipalGroupMembership -Identity $user.sAMAccountName | Where-Object { $_.Name -notin $ExcludedGroups -and $_.GroupCategory -eq 'Security' } | Select-Object Name, GroupScope foreach ($group in $userGroups) { $reportEntry = [PSCustomObject]@{ '用户名' = $user.Name '账号名' = $user.sAMAccountName '安全组名称' = $group.Name '组作用域' = $group.GroupScope } $reportTable.Add($reportEntry) } } # 控制台输出结果,也可导出到CSV $reportTable | Format-Table -AutoSize # 导出到CSV(按需启用) # $reportTable | Export-Csv -Path "C:\Reports\Accounts_SecurityGroups.csv" -NoTypeInformation -Encoding UTF8
关键改进说明
- 补全集合初始化:原代码里
$table未定义直接调用Add()会报错,用泛型集合存储结果更高效 - 实现排除组逻辑:
Get-ADPrincipalGroupMembership没有内置过滤参数,所以先用它获取所有组,再通过Where-Object筛掉$ExcludedGroups里的目标组;额外加了安全组筛选,不需要的话删掉$_.GroupCategory -eq 'Security'即可 - 优化AD查询效率:用字符串格式的过滤器
"department -eq '$Department' -and enabled -eq 'True'"替代脚本块过滤器,符合AD模块最佳实践 - 灵活配置排除项:把要排除的组放到数组里,批量修改更方便
- 提升报告实用性:新增用户真实姓名字段,比仅显示账号名更直观
常见疑问解答
- 为什么不能直接在
Get-ADPrincipalGroupMembership里过滤?
这个cmdlet本身没有过滤参数,必须先拉取所有组再做后续筛选 - 怕组名拼写错怎么办?
先运行Get-ADGroup -Filter * | Select-Object Name导出所有组的准确名称,对照着填排除列表 - 想按组SID排除而不是名称?
把$ExcludedGroups换成SID数组,然后判断条件改成$_.SID -notin $ExcludedGroups,这样组名修改也不影响筛选
内容的提问来源于stack exchange,提问作者Rooster
相关产品推荐
相关产品推荐

