如何批量开展Active Directory组成员审计并与权限基线比对
AD用户组成员身份与权限基线批量审计方案
前置依赖
执行脚本的设备需为域控或已安装RSAT-AD-PowerShell模块的域成员机器,使用拥有目标OU读取权限的域账号运行即可。
1. 定义权限基线与审计范围
# 定义岗位-AD组基线映射,可按需补充QA、培训师等岗位的对应组 $roleGroupBaseline = @{ "坐席" = @("A","B","C","D","E") "团队主管" = @("F","G","H","X","Y","Z") } # 按需修改为需要审计的用户OU路径 $auditOU = "OU=正式员工,DC=你的域名,DC=com"
2. 批量拉取用户与所属组数据
# 导入ActiveDirectory模块 Import-Module ActiveDirectory # 拉取目标OU下所有启用用户的基础信息与所属组列表 $allUsers = Get-ADUser -Filter {Enabled -eq $true} -SearchBase $auditOU -Properties memberOf,Department,Title
3. 基线比对生成审计结果
$auditResult = foreach ($user in $allUsers) { # 此处默认取AD用户的Title字段作为岗位标识,可根据实际业务调整为其他属性 $userRole = $user.Title # 跳过无对应基线配置的岗位 if (-not $roleGroupBaseline.ContainsKey($userRole)) { continue } # 提取用户当前所属组的纯名称(过滤DN格式前缀) $currentGroups = $user.memberOf | ForEach-Object { ($_ -split 'CN=|,OU=|,DC=')[1] } $baselineGroups = $roleGroupBaseline[$userRole] # 计算合规差异 $missingGroups = Compare-Object -ReferenceObject $baselineGroups -DifferenceObject $currentGroups | Where-Object {$_.SideIndicator -eq "<="} | Select-Object -ExpandProperty InputObject $extraGroups = Compare-Object -ReferenceObject $baselineGroups -DifferenceObject $currentGroups | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject # 结构化输出结果 [PSCustomObject]@{ 账号名 = $user.SamAccountName 姓名 = $user.Name 岗位 = $userRole 所属部门 = $user.Department 基线缺失组 = if ($missingGroups) {$missingGroups -join ","} else {"无"} 超权限组 = if ($extraGroups) {$extraGroups -join ","} else {"无"} 合规状态 = if (-not $missingGroups -and -not $extraGroups) {"合规"} else {"不合规"} } } # 导出审计结果到CSV文件 $outputPath = "AD组权限审计结果_$(Get-Date -Format 'yyyyMMddHHmm').csv" $auditResult | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8
补充说明
- 若岗位信息未存储在Title字段,可根据实际规则调整岗位识别逻辑,比如按部门+自定义扩展属性组合判断
- 如需自动清理超权限组,可筛选出
超权限组不为空的用户后调用Remove-ADGroupMember批量执行,操作前建议先备份AD数据并小范围测试 - 可将脚本配置为定期运行的计划任务,自动输出权限合规报表
- 执行脚本的账号仅需AD读取权限即可完成审计,如需修改权限则需要对应AD组的编辑权限
内容的提问来源于stack exchange,提问作者GGes
相关产品推荐
相关产品推荐

