Почему Set-Acl в корневом каталоге диска пытается установить владельца "объекта"?

Я хотел бы изменить ACL C: привод. Что я пытаюсь сделать, это удалить разрешение, что пользователь может создать папку прямо на диске. Я тестировал скрипт в другой папке, когда писал его. Работало без проблем. После завершения я попробовал скрипт в нашей тестовой среде на реальном диске. Я получаю ошибку, которую не могу понять. Если я удаляю разрешение вручную, оно работает без проблем. У кого-нибудь есть идея?

$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 ответов

Решение

Я нашел ответ. Microsoft говорит

к несчастью Get-Acl отсутствует некоторые функции. Он всегда читает полный дескриптор безопасности, даже если вы просто хотите изменить DACL. Вот почему Set-ACL Также хочет написать владельцу, даже если вы его не меняли. С использованием GetAccessControl Метод позволяет указать, какую часть дескриптора безопасности вы хотите прочитать.

Заменить Get-Acl позвонить с

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

Вам нужно SeRestorePrivilege установить владельца. Я использовал сценарий Ли Холмса из приведенного ниже URL-адреса, чтобы поднять свой процесс с помощью этой дополнительной привилегии, и смог назначить владельца кому-то, кроме меня.

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

Я попробовал (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\"

Люди могут найти это проще:

icacls c:\ /remove "authenticated users"

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

Работал на меня. Я запускаю свой PS-скрипт из CMD, и в этом PS-скрипте я запускаю другой PS-скрипт, все работает нормально, пока я делаю это со своим собственным пользователем. Когда я использую другого пользователя, я получаю ту же ошибку: Set-Acl: идентификатор безопасности не может быть владельцем этого объекта.

Просто изменил Get-ACL на эту строку выше, и он работал нормально. Еще раз спасибо.

Другие вопросы по тегам