两个 OU 上的不同 ACL 具有相同的“保护对象不被删除”设置

Nic*_*Nic 5 permissions active-directory delegation windows-server-2008-r2

背景

在我配置了我们的 Active Directory 以便将移动计算机的能力委托给服务台人员之后,我开始听到有关计算机将“卡在”特定 OU 中的报告。他们可以将计算机移入,但在尝试移出计算机时会收到“拒绝访问”消息。该问题 100% 可重现,并且仅存在于我们域中的少数 OU 中。

两个 OU 都已Protect object from accidental deletion启用。

我已经知道的

使用检查 ACLldp.exe确实揭示了一个微小但重要的区别。出于某种原因,只有一个 OU 的属性 ACTRL_DS_DELETE_CHILD 被拒绝Everyone

切换的Protect object标志和关闭在任OU不能解决问题。它确实按预期修改了 ACL,但ACTRL_DS_DELETE_CHILD在任何一种情况下都完全未修改该标志。

我可以使用此解决方案来“修复”特定的 OU:

  1. 关闭Protect object标志
  2. 删除与Everyone 关联的拒绝ACE。
  3. 打开Protect object
  4. 现在 ACL 匹配。

是否可能是不同版本的 Active Directory 或远程服务器管理工​​具可能对Protect object标志在 OU 上的实际表示方式有不同的行为?

问题

什么可能导致这种差异,我该怎么做才能确保它在 Active Directory 域中的所有 OU 上得到纠正?

细节

统一差异如下所示:

18c18
<       Ace Mask:  0x00010042
---
>       Ace Mask:  0x00010040
20d19
<           ACTRL_DS_DELETE_CHILD
Run Code Online (Sandbox Code Playgroud)

轻微的 ACE ACL 差异可防止移动计算机对象

如何识别受影响的组织单位

编辑:我编写了一个 PowerShell 脚本来定位设置了此标志的组织单位。

$Base = "OU=MyOU,DC=your,DC=domain,DC=com"
Import-Module ActiveDirectory
Set-Location AD:
Get-ADOrganizationalUnit -SearchBase $Base -filter * |
    ForEach-Object {
        $matches = @(
            (Get-ACL $_.DistinguishedName).access |
            Where-Object {
                $_.IdentityReference -eq "Everyone"
            } |
            Where-Object {
                $_.ActiveDirectoryRights -like "*DeleteChild*"
            }
        )
        if ($matches.length -gt 0) {
            Write-Output $_
        }
    } |
    Format-Table DistinguishedName
Run Code Online (Sandbox Code Playgroud)

Nic*_*Nic 2

解释

当您在组织单位上启用该标志时,它会影响该对象及其父对象Protect object from accidental deletion的 ACL 。

  1. 受保护的 OU 获取 {Deny,Everyone,Delete+DeleteSubtree}
  2. 父 OU 获取 {Deny,Everyone,DeleteChildObjects}

父级上的访问控制条目对于实施保护是必要的,但确实会产生意外的结果,如此处观察到的。无论您切换protect标志多少次,父级上的拒绝访问控制条目都不会自动删除。

因此,在我使用的 Active Directory 中,任何曾经包含受保护 OU(基本上是任何非叶 OU)的 OU 都具有 Deny DeleteChild ACE,从而从用户的角度“捕获”该 OU 中的计算机对象具有委派权限。

通过:Technet 论坛上的保护对象免遭意外删除

解决方案

通过确保用于委派权限的基本 OU 在 ACL 中具有这两个访问控制条目,可以轻松解决此问题。

  1. {允许、分组、创建/删除计算机对象、该对象及其所有后代}*
  2. {允许、GROUP、删除+DeleteSubtree、后代计算机对象}

我已经在目录中的相关 OU 上配置了第一个访问控制条目,但现在我知道这还不够。每当创建受保护的 OU 时,第一条规则就会被设置的自动拒绝ACE取消。第二条规则允许直接删除对象,从而绕过保护子 OU 时设置的拒绝条目。

*(第一条规则现在可能是多余的。有人可以确认吗?)