powershell acl

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 que Set-ACL también desea escribirle al propietario, incluso si no lo ha cambiado. El uso del método GetAccessControl 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 .