使用PowerShell删除AD OU访问规则失败,请求排查原因
解决AD OU ACL条目删除失败(RemoveAccessRule返回False)的问题
问题根源
RemoveAccessRule方法要求传入的ACE(访问控制条目)与ACL中现存的条目完全匹配所有属性,包括PowerShell默认输出中未显示的细节(如AceFlags的具体值)。即使你看到的属性一致,也可能因隐藏属性不匹配导致删除失败。此外你原脚本中的嵌套循环存在冗余,可能导致逻辑混乱。
修正步骤
1. 修复脚本笔误
原代码中获取ACL时使用了未定义的变量$ADN,需改为你定义的OU路径变量$SB:
$SB = "OU=Name of OU,DC=Name,DC=of,DC=Domain" $ADUC = Get-ADOrganizationalUnit $SB $OUACL = Get-ACL AD:\$SB # 修正变量名错误
2. 简化ACE查找逻辑
原脚本中对$access.ObjectType的嵌套循环完全冗余(ObjectType是单个GUID值,而非集合),简化后更清晰:
foreach ($access in $OUACL.Access) { # 直接匹配目标权限GUID和非继承属性 if ($access.ObjectType -eq "bf967a0a-0de6-11d0-a285-00aa003049e2" -and -not $access.IsInherited) { # 使用严格匹配的RemoveAccessRuleExact方法 $removeResult = $OUACL.RemoveAccessRuleExact($access) if ($removeResult) { Write-Host "目标ACE删除成功,正在保存更改..." # 保存修改到AD OU Set-ACL -Path AD:\$SB -AclObject $OUACL Write-Host "更改已保存" } else { Write-Host "删除失败,以下是目标ACE的完整属性:" # 输出ACE所有属性,排查不匹配项 $access | Select-Object * } } }
3. 关键说明
- 使用
RemoveAccessRuleExact而非RemoveAccessRule:前者会严格匹配ACE的所有属性(包括继承标志、传播标志等细节),避免因宽松匹配导致的失败。 - 验证权限:确保运行脚本的账号拥有修改OU ACL的权限(需具备“修改权限”或更高权限)。
- 确认条目唯一性:如果存在多个属性近似的ACE,需进一步筛选精确匹配的条目(比如结合
IdentityReference缩小范围)。
内容的提问来源于stack exchange,提问作者Gerrit Grote
相关产品推荐
相关产品推荐

