如何通过PowerShell移除AD组中不存在的旧SID成员?
批量移除AD组中无效的Foreign Security Principal成员
问题原因
你遇到的报错是因为那些CN=S-1-...格式的条目属于Foreign Security Principals(FSP),对应的外部域对象或FSP本身已不存在,直接用Remove-ADGroupMember会因AD无法定位对象而失败。下面是无需手动操作的批量清理方案:
单个组清理脚本
针对GROUPA这类特定组,可执行以下PowerShell脚本自动识别并移除无效FSP成员:
# 定位目标组并获取成员列表 $targetGroup = Get-ADGroup GROUPA -Properties Members # 筛选出属于ForeignSecurityPrincipals容器的成员 $fspCandidates = $targetGroup.Members | Where-Object { $_ -match "CN=ForeignSecurityPrincipals," } # 排查无效成员(AD中无法找到的对象) $invalidMembers = @() foreach ($member in $fspCandidates) { if (-not (Get-ADObject -Identity $member -ErrorAction SilentlyContinue)) { $invalidMembers += $member } } # 执行移除操作 if ($invalidMembers.Count -gt 0) { # 保留有效成员,覆盖组的成员列表 $validMembers = $targetGroup.Members | Where-Object { $_ -notin $invalidMembers } Set-ADGroup $targetGroup -Replace @{ Members = $validMembers } Write-Host "已从GROUPA移除 $($invalidMembers.Count) 个无效成员" } else { Write-Host "GROUPA中无无效FSP成员" }
全域批量清理脚本
如果需要清理所有安全组中的无效FSP成员,可使用以下脚本:
# 获取域内所有安全组(可根据需求调整筛选条件,如限定OU) $allSecurityGroups = Get-ADGroup -Filter { GroupCategory -eq "Security" } -Properties Members foreach ($group in $allSecurityGroups) { Write-Host "正在检查组: $($group.Name)" $fspCandidates = $group.Members | Where-Object { $_ -match "CN=ForeignSecurityPrincipals," } $invalidMembers = @() foreach ($member in $fspCandidates) { if (-not (Get-ADObject -Identity $member -ErrorAction SilentlyContinue)) { $invalidMembers += $member } } if ($invalidMembers.Count -gt 0) { $validMembers = $group.Members | Where-Object { $_ -notin $invalidMembers } Set-ADGroup $group -Replace @{ Members = $validMembers } Write-Host "已从 $($group.Name) 移除 $($invalidMembers.Count) 个无效成员" } else { Write-Host "$($group.Name) 中无无效FSP成员" } }
注意事项
- 需使用域管理员或拥有组修改权限的账号运行脚本
- 建议先在测试环境验证脚本逻辑,避免误操作
- 成员数量较多的组会增加排查耗时,可通过
-SearchBase参数限定处理范围(如特定OU下的组)
内容的提问来源于stack exchange,提问作者TetraFlash
相关产品推荐
相关产品推荐

