我想在AD DS对象1上运行Set-ACL ,将“Domain Admins”设置为我构build的ACL对象中的所有者。 代码看起来基本上是这样的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 R2pipe理工作站(Powershell v4)运行时出现更一般的“访问被拒绝”exception:
Set-ACL : Access is denied
我甚至没有在这个特殊情况下更改所有者,但显然,Set-ACL只是重写整个安全描述符。
“修改权限”和“修改所有者”已经被明确地设置在目标对象上,并且我完全能够使用gpmc.msc GUI将这个对象的所有者改变为在DC和pipe理站上的任何我想要的这不是一个明显的权限问题。 另一方面,我也看到,代码正在由Domain Admins组成员的用户运行。
我使用的帐户故意缺less“域pipe理员”成员本身(它是“BUILTIN \服务器pipe理员”组的成员),但需要自由地设置对象的所有者。 我看到MSDN文章中涉及这个错误信息是build议“了解哪些用户和组有权利指定为所有者” ,这在我的情况下是没有帮助的。
那么我做错了什么?
1在我的情况下GPO,但对象的types并不重要,我也看到它发生在OU,例如。
2 Set-Acl -AclObject $targetAcl -Path "AD:\$($targetObject.DistinguishedName)"调用看起来像一个黑客,它确实是。 我不能将-InputObject $targetObject传递给Set-ACL因为InputObject需要一个实现SetSecurityDescriptor方法的对象types,[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上运行代码的初始testing中,我被一个事实certificate,即如果我想将所有者设置为自己(拥有所有权),但又无法将所有者设置为Domain Admins,
Exception calling "CommitChanges" with "0" argument(s): "A constraint violation occurred.
幸运的是,我偶然发现了一个关于“链接为”相关“的SF 的”设置ACL失败“问题的答案 。 这个答案提到了特定于令牌的特权限制1作为问题的可能原因,所以我继续在pipe理站上testing同样的方法,在本地交互式DC令牌限制不适用。 它的工作原理 – 我可以根据自己的喜好在PowerShell中设置DS对象的所有者(只要我不想在DC上这样做)。
TechNet论坛中的另一个主题是提供基于.NET类的解决scheme,将此特权添加到当前的进程令牌中,而不需要像PSCX这样的第三方Cmdlet,但是我还没有find一种方法使其在我的特例。
1此处的相关特权可能是SeRestorePrivilege – 默认情况下,交互式login过程令牌被禁用。
这也意味着需要更改AD DS对象所有权的帐户需要通过默认BUILTIN组中的组成员身份(如DC中的Server Operators和Backup Operators)或通过更改默认域控制器策略分配来获得此权限“还原文件和目录”用户权限。