Active-Directory

Powershell:為 AD DS 對象設置所有者失敗

  • March 11, 2020

我想在我構造的 ACL 對像中將*“域管理員”*設置為所有者Set-ACL的 AD DS 對象1上執行。程式碼看起來基本上像這樣2:

Function SetDSAcl {
      Param (
       [Microsoft.ActiveDirectory.Management.ADObject]$targetObject   # target object
   )

   $targetACL = Get-Acl "AD:\$($targetObject.DistinguishedName)"
   # [some voodoo to get the values for my new ACE]
   # Create a new AccessRule using the object constructor
   # $newAce = New-Object System.DirectoryServices.ActiveDirectoryAccessRule([...])

   # Add the generated ACE to target's ACL
   $targetAcl.AddAccessRule($newAce)

   # Persist the changed ACL to the object
   Set-ACL -AclObject $targetAcl "AD:\$($targetObject.DistinguishedName)"
}

但在 Server 2008 R2 DC (Powershell v5) 上執行程式碼時,Set-ACL 呼叫會返回此錯誤:

Set-ACL : This security ID may not be assigned as the owner of this object

或更通用的“拒絕訪問”異常,當使用相同的安全主體從 Server 2012 R2 管理站 (Powershell v4) 執行它時:

Set-ACL : Access is denied

在這種特殊情況下,我什至沒有更改所有者,但顯然 Set-ACL 只是重寫了整個安全描述符。

“修改權限”“修改所有者”已在目標對像上明確設置,我完全能夠使用 gpmc.msc GUI 將這個對象的所有者更改為我想要在 DC 和管理站上的任何內容,所以這不是一個明顯的權限問題。另一方面,我還看到程式碼在由Domain Admins組成員的使用者執行後立即執行。

我使用的帳戶故意缺少“域管理員”成員身份(它是“BUILTIN\Server Admins”組的成員),但需要能夠自由設置對象的所有者。我看到涵蓋此錯誤消息的 MSDN 文章建議*“了解您有權將哪些使用者和組分配為所有者”*,這對我的情況沒有幫助。

那麼我做錯了什麼?


1在我的例子中是一個 GPO,但對象的類型並不重要,例如,我也看到它發生在 OU 中。

2呼叫看起來像一個黑客,Set-Acl -AclObject $targetAcl -Path "AD:\$($targetObject.DistinguishedName)"它確實是。我不能像期望的那樣傳遞一個實現該方法的對像類型,-InputObject $targetObjectSet-ACL``InputObject``SetSecurityDescriptor

$$ Microsoft.ActiveDirectory.Management.ADObject $$沒有做一些神秘的原因。

當我認為我看到的效果可能是特定於 Set-ACL 的實現時,我嘗試獲取

$$ System.DirectoryServices.ActiveDirectorySecurity $$代替類並使用其 .SetOwner 方法:

$adsiTarget = [adsi]"LDAP://$($targetObject.DistinguishedName)"
$idRef = New-Object System.Security.Principal.NTAccount("CONTOSO", "Domain Admins")
$adsiTarget.PSBase.ObjectSecurity.SetOwner($idRef)
$adsiTarget.PSBase.CommitChanges()

在我在 DC 上執行程式碼的初始測試中,如果我想將所有者設置為我自己(取得所有權)但再次未能將所有者設置為Domain Admins ,我感到很震驚:

Exception calling "CommitChanges" with "0" argument(s): "A constraint violation occurred.

對我來說幸運的是,我在 SF 上偶然發現了“Set-ACL failed”問題的答案,該問題被連結為“相關”。這個答案提到了特定於令牌的權限限制1 作為問題的可能原因,因此我繼續在管理站上測試相同的方法,其中本地互動式 DC 令牌限制不適用。它起作用了——我現在可以根據自己的喜好在 Powershell 中設置 DS 對象的所有者(只要我不想在 DC 上這樣做)。

TechNet 論壇中的另一個主題是提供基於 .NET 類的解決方案,無需像 PSCX 這樣的 3rd 方 Cmdlet 即可將此權限添加到目前程序令牌,但我還沒有找到一種方法讓它在我的特定情況下工作.


1這裡的相關權限可能是SeRestorePrivilege - 預設情況下,互動式登錄程序令牌禁用它。

這也意味著需要更改 AD DS 對象所有權的帳戶需要通過預設 BUILTIN 組(如 DC 上的伺服器操作員和備份操作員)中的組成員身份或通過更改預設域控制器策略分配來分配此權限“恢復文件和目錄”使用者權限。

引用自:https://serverfault.com/questions/831330