我想在我构造的 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
,[Microsoft.ActiveDirectory.Management.ADObject] 出于某种神秘的原因没有这样做。Set-ACL
InputObject
SetSecurityDescriptor
当我认为我看到的效果可能是 Set-ACL 的特定实现时,我尝试获取 [System.DirectoryServices.ActiveDirectorySecurity] 类并使用它的 .SetOwner 方法:
在我在 DC 上运行代码的初始测试中,如果我想将所有者设置为我自己(取得所有权)但再次未能将所有者设置为Domain Admins ,我感到很震惊:
对我来说幸运的是,我在 SF 上偶然发现了“Set-ACL failed”问题的答案,该问题被链接为“相关”。这个答案提到了特定于令牌的权限限制1 作为问题的可能原因,所以我继续在管理站上测试相同的方法,其中本地交互式 DC 令牌限制不适用。它起作用了——我现在可以根据自己的喜好在 Powershell 中设置 DS 对象的所有者(只要我不想在 DC 上这样做)。
TechNet 论坛中的另一个主题是提供基于 .NET 类的解决方案,无需像 PSCX 这样的 3rd 方 Cmdlet 即可将此权限添加到当前进程令牌,但我还没有找到使其在我的特定情况下工作的方法.
1这里的相关权限可能是SeRestorePrivilege - 默认情况下,交互式登录进程令牌禁用它。
这也意味着需要更改 AD DS 对象所有权的帐户需要通过默认 BUILTIN 组(如 DC 上的服务器操作员和备份操作员)中的组成员身份或通过更改默认域控制器策略分配来分配此权限“恢复文件和目录”用户权限。