为什么驱动器根目录上的Set-Acl尝试设置“对象”的所有权?

时间:2011-07-08 08:53:39

标签: powershell acl

我想更改C:驱动器的ACL。我想要做的是删除用户可以直接在驱动器上创建文件夹的权限。我在编写时在另一个文件夹上测试了脚本。它没有问题。完成后,我在我们的测试环境中尝试了实际驱动器上的脚本。我得到一个我无法弄清楚的错误。如果我手动删除权限它没有问题。有人有想法吗?

$path = "C:\"

$colRights = [System.Security.AccessControl.FileSystemRights]"CreateDirectories"

$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None 
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 

$objType =[System.Security.AccessControl.AccessControlType]::Allow 
$objUser = New-Object System.Security.Principal.NTAccount("Authenticated Users") 
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType) 

$objACL = Get-ACL $path 
$objACL.RemoveAccessRule($objACE) 

Set-ACL $path $objACL

错误是:

Set-Acl : The security identifier is not allowed to be the owner of this object.
At C:\Users\mhodler\Desktop\Remove Permission.ps1:57 char:8
+ Set-ACL <<<<  $path $objACL
    + CategoryInfo          : InvalidOperation: (C:\:String) [Set-Acl], InvalidOperationException
+ FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.PowerShell.Commands.SetAclCommand

5 个答案:

答案 0 :(得分:62)

我找到了答案。微软说

  

不幸的是Get-Acl缺少某些功能。即使您只想修改DACL,它也始终读取完整的安全描述符。这就是为什么Set-ACL也想要写主人,即使你没有改变它。使用GetAccessControl方法可以指定要读取的安全描述符的哪个部分。

替换Get-Acl来电
$acl = (Get-Item $path).GetAccessControl('Access')

答案 1 :(得分:8)

您需要SeRestorePrivilege来设置所有者。我使用了下面URL中的Lee Holmes的脚本来提升我的流程,并使用了这个额外的priv,并且能够将所有者设置为我以外的其他人。

http://www.leeholmes.com/blog/2010/09/24/adjusting-token-privileges-in-powershell/

我尝试了(get-item $path).getaccesscontrol("access")方法,但由于我的流程没有SeRestorePrivilege,因此仍然遇到同样的错误。

答案 2 :(得分:1)

以下代码适用于我:

$ApplicationPoolIdentity = "everyone"

function SetACL()
{
    param (
        [Parameter(Mandatory=$true)]
        [string]        $Path 
    )

    $Acl = (Get-Item $Path).GetAccessControl('Access')
    Write-Host "Path:" $Path "ID:" $ApplicationPoolIdentity
    $Ar = New-Object  system.security.accesscontrol.filesystemaccessrule($ApplicationPoolIdentity,"Write","Allow")
    $Acl.SetAccessRule($Ar)
    Write-Host $Acl
    $Acl | Set-Acl $Path
}

SetACL "C:\Test\"

答案 3 :(得分:0)

人们可能会发现这更容易:

icacls c:\ /remove "authenticated users"

答案 4 :(得分:-1)

$ Acl =(Get-Item $ Path).GetAccessControl('Access')

为我工作。 我从CMD运行我的PS脚本,在这个PS脚本中我运行另一个PS脚本,只要我和我自己的用户一起工作,一切正常。当我使用不同的用户我得到相同的错误: Set-Acl:安全标识符不允许是该对象的所有者。

刚刚将Get-ACL更改为上面的那行,它运行正常。 再次感谢。