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

Я бы хотел изменить 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 ]

62 голосов
/ 11 июля 2011

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

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

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

$acl = (Get-Item $path).GetAccessControl('Access')
8 голосов
/ 10 апреля 2012

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

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

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

1 голос
/ 11 октября 2014

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

$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\"
0 голосов
/ 16 августа 2018

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

icacls c:\ /remove "authenticated users"
0 голосов
/ 03 февраля 2016

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

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

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

...