PowerShell:通过SID移除AD组中所有ForeignSecurityPrincipals
当Remove-ADGroupMember无法移除ForeignSecurityPrincipal(该命令不支持这类对象),且旧域已不存在、公司禁止使用外部模块时,以下两种原生方法可解决问题:
方法1:用Set-ADGroup替换成员列表
ForeignSecurityPrincipal通过SID标识,我们可以过滤掉目标SID后直接更新组的成员属性:
获取目标组并读取成员属性:
$group = Get-ADGroup -Identity "你的组名" -Properties Member先备份当前成员(防止误删):
$group.Member | Out-File "C:\temp\GroupMembersBackup.txt"过滤掉旧域的ForeignSecurityPrincipal(替换为你的旧域SID前缀):
$newMembers = $group.Member | Where-Object { $_ -notlike "CN=S-1-5-21-旧域SID前缀*,CN=ForeignSecurityPrincipals,DC=你的域,DC=com" }更新组的成员:
Set-ADGroup -Identity $group -Replace @{ Member = $newMembers }
方法2:用ADSI直接操作组对象
ADSI是Windows原生目录服务接口,无需额外模块,适合精准移除单个或批量ForeignSecurityPrincipal:
移除单个对象
获取组的ADSI实例:
$groupADSI = [ADSI]"LDAP://CN=你的组名,OU=组所在OU,DC=你的域,DC=com"定位要移除的ForeignSecurityPrincipal(使用完整SID):
$fspSID = "S-1-5-21-xxxxxx-xxxxxx-xxxxxx-xxxx"
$fspADSI = [ADSI]"LDAP://CN=$fspSID,CN=ForeignSecurityPrincipals,DC=你的域,DC=com"`执行移除:
$groupADSI.Remove($fspADSI.Path)
批量移除旧域所有ForeignSecurityPrincipal
$groupADSI = [ADSI]"LDAP://CN=你的组名,OU=组所在OU,DC=你的域,DC=com" $oldDomainSIDPrefix = "S-1-5-21-xxxxxx-xxxxxx-xxxxxx" # 替换为旧域的SID前缀 foreach ($member in $groupADSI.Member) { if ($member -match "CN=$oldDomainSIDPrefix-\d+,CN=ForeignSecurityPrincipals,") { $groupADSI.Remove("LDAP://$member") Write-Host "已移除: $member" } }
注意事项
- 操作前必须备份成员列表,避免误删合法成员。
- 执行操作需要拥有目标AD组的修改成员权限。
- 批量操作建议先测试单个对象,确认逻辑正确后再全量执行。
内容的提问来源于stack exchange,提问作者Joachim Otahal

