Powershell 为什么在驱动器根目录上设置Acl会尝试设置;对象";?

Powershell 为什么在驱动器根目录上设置Acl会尝试设置;对象";?,powershell,acl,Powershell,Acl,我想更改C:驱动器的ACL。我试图做的是删除用户可以直接在驱动器上创建文件夹的权限。编写脚本时,我在另一个文件夹中测试了脚本。它毫无问题地工作了。完成后,我在实际驱动器上的测试环境中尝试了脚本。我犯了一个我无法理解的错误。如果我手动删除许可,它将正常工作。有人有主意吗 $path = "C:\" $colRights = [System.Security.AccessControl.FileSystemRights]"CreateDirectories" $InheritanceFlag =

我想更改
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
Set Acl:安全标识符不允许是此对象的所有者。
在C:\Users\mhodler\Desktop\Remove Permission.ps1:57 char:8

+Set ACL我找到了答案。微软说

不幸的是,
Get Acl
缺少一些功能。它总是读取完整的安全描述符,即使您只是想修改DACL。这就是为什么
Set ACL
即使没有更改,也希望写入所有者。使用
GetAccessControl
方法可以指定要读取的安全描述符的哪一部分

Get Acl
调用替换为

$acl = (Get-Item $path).GetAccessControl('Access')

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


我尝试了
(get item$path).getaccesscontrol(“access”)
方法,但仍然得到相同的错误,因为我的进程没有
SeRestorePrivilege
,以下代码适合我:

$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\"
$Acl=(获取项$Path).GetAccessControl('Access'))

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

只是将GetACL更改为上面的那一行,效果很好。
再次感谢。

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

icacls c:\ /remove "authenticated users"

找到了答案。很抱歉把它贴在这里。我没有权限在接下来的4小时内发布我自己问题的答案。将$objACL=Get ACL$path替换为$objACL=(Get item$path)。通过谷歌找到的,帮我解决了一个完全不同的问题。谢谢你,这就是我的重点。我还发现,设置所有者的一个可能的解决方法是使用路径的“本地UNC”版本,例如,如果要为C:\test.txt设置所有者,则需要对该项调用SetAccessControl方法(get item“\\localhost\C$\test.txt”),尽管这是可行的,但我更喜欢选择的解决方案,而不是使用(get item$path).GetAccessControl('Access')要获取ACL对象,请引用Microsoft的源代码好吗?我能找到的最早引用此内容的是2010年12月14日的一个博客,该博客引用了Microsoft,但没有引用源代码:@AnthonyKlotz MS的回复来自Microsoft员工“Babak Ramak”在旧的TechNet Powershell论坛中-无需创建答案来感谢任何人的答案