Почему 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 на эту строку выше, и он работал нормально. Еще раз спасибо.