如何使用PowerShell移除离职AD用户所属组,仅保留指定安全组
AD离职用户组清理脚本修改方案
核心调整逻辑
- 新增保留组白名单配置,无需逐个指定要移除的组,自动过滤需保留的2个固定组
- 优化组移除逻辑,支持批量移除用户所属的所有非保留组,大幅提升数千账号的清理效率
- 保留原脚本的日志记录、不存在用户提示等能力,新增移除操作的错误提示
修改后的完整脚本
Start-Transcript -Path ".\AD用户组清理日志.log" -Append # -------------------------- 请修改以下配置项 -------------------------- # 导入离职用户的CSV文件路径,CSV需包含UserPrincipalName列 $Users = Import-Csv ".\离职用户列表.csv" # 配置需要保留的组名称,必须和AD中组的显示名称完全一致 $keepGroups = @("域用户", "许可授权组") # -------------------------- 配置项结束 -------------------------- foreach ($User in $Users) { $UPN = $User.UserPrincipalName # 获取AD用户对象 $ADUser = Get-ADUser -Filter "UserPrincipalName -eq '$UPN'" -ErrorAction SilentlyContinue if ($null -eq $ADUser) { Write-Host "$UPN 不存在于AD中" -ForegroundColor Red continue } # 获取用户当前所属的所有组 $ExistingGroups = Get-ADPrincipalGroupMembership $ADUser.SamAccountName -ErrorAction SilentlyContinue # 过滤出需要移除的组(排除保留组) $groupsToRemove = $ExistingGroups | Where-Object { $_.Name -notin $keepGroups } if ($groupsToRemove.Count -eq 0) { Write-Host "$UPN 没有需要移除的额外组" -ForegroundColor Yellow continue } # 逐个移除非保留组,当前带-WhatIf参数仅做预览,确认无误后删除该参数即可执行实际移除 foreach ($group in $groupsToRemove) { try { Remove-ADGroupMember -Identity $group.DistinguishedName -Members $ADUser.SamAccountName -Confirm:$false -WhatIf -ErrorAction Stop Write-Host "已将 $UPN 从组 $($group.Name) 中移除" -ForeGroundColor Green } catch { Write-Host "移除 $UPN 所属组 $($group.Name) 失败:$_" -ForegroundColor Red } } } Stop-Transcript
使用注意事项
- 首次运行时脚本默认带
-WhatIf参数,只会输出要执行的操作不会实际修改AD,确认所有移除操作符合预期后,删除-WhatIf参数再执行实际清理 - 请确保
$keepGroups中的组名称和AD内的组显示名称完全匹配,避免误删需要保留的组 - 操作前建议先抽取少量测试用户验证脚本逻辑,验证通过后再批量执行全量离职用户清理
- 如果不需要从CSV导入用户,而是直接读取指定OU下的所有用户,可以将
$Users = Import-Csv行替换为$Users = Get-ADUser -SearchBase "OU=离职用户,DC=你的域名,DC=后缀" -Filter * | Select-Object UserPrincipalName即可
内容的提问来源于stack exchange,提问作者Dameaus
相关产品推荐
相关产品推荐

