powershell - ¿Por qué Set-Acl en la raíz de la unidad intenta establecer la propiedad del "objeto"?
(4)
$ Acl = (Get-Item $ Path) .GetAccessControl (''Access'')
Trabajó para mi. Ejecuto mi PS Script desde CMD y en este script de PS ejecuto otro Script de PS. Todo funciona bien siempre que lo haga con mi propio Usuario. Cuando uso un Usuario diferente, obtengo el mismo Error: Set-Acl: el identificador de seguridad no puede ser el propietario de este objeto.
Acabo de cambiar Get-ACL a esa línea de arriba y funcionó bien. Gracias de nuevo.
Me gustaría cambiar la ACL de la unidad C:
. Lo que intento hacer es eliminar el permiso que un usuario puede crear una carpeta directamente en la unidad. Probé el script en otra carpeta mientras lo escribía. Funcionó sin problemas. Después de la finalización probé la secuencia de comandos en nuestro dominio de prueba en la unidad real. Me sale un error que no puedo entender. Si elimino el permiso manualmente, funciona sin problemas. Alguien tiene una idea?
$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
El error es:
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
El siguiente código funciona para mí:
$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/"
Encontré la respuesta. Dice Microsoft
Lamentablemente, a
Get-Acl
le faltan algunas características. Siempre lee el descriptor de seguridad completo incluso si solo desea modificar el DACL. Es por eso queSet-ACL
también desea escribirle al propietario, incluso si no lo ha cambiado. El uso del métodoGetAccessControl
permite especificar qué parte del descriptor de seguridad desea leer.
Reemplace la llamada Get-Acl
con
$acl = (Get-Item $path).GetAccessControl(''Access'')
Necesita el SeRestorePrivilege
para configurar el propietario. Utilicé el guión de Lee Holmes desde la URL a continuación para elevar mi proceso con este privilegio adicional y pude establecer el propietario para alguien más que yo.
http://www.leeholmes.com/blog/2010/09/24/adjusting-token-privileges-in-powershell/
(get-item $path).getaccesscontrol("access")
método (get-item $path).getaccesscontrol("access")
pero aún recibí el mismo error ya que mi proceso no tenía el SeRestorePrivilege
.