You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:47:34