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