Powershell:為 AD DS 對象設置所有者失敗
我想在我構造的 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 $targetObject
它Set-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 上的伺服器操作員和備份操作員)中的組成員身份或通過更改預設域控制器策略分配來分配此權限“恢復文件和目錄”使用者權限。