Подтвердить что ты не робот

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

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

$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
4b9b3361

Ответ 1

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

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

Замените вызов Get-Acl

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

Ответ 2

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

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

Я попробовал метод (get-item $path).getaccesscontrol("access"), но все же получил ту же ошибку, поскольку у моего процесса не было SeRestorePrivilege.

Ответ 3

Следующий код работает для меня:

$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\"

Ответ 4

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

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

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