2011-07-08 21 views
28

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?¿Por qué Set-Acl en la raíz de la unidad intenta establecer la propiedad del "objeto"?

$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 
+0

Encontré la respuesta. Perdón por publicarlo aquí. No tengo el permiso para publicar una respuesta a mi propia pregunta en las próximas 4 horas. Reemplazar $ objACL = Get-ACL $ ruta Con $ objACL = (ítems obtener $ path) .getaccesscontrol ("Acceso") –

Respuesta

55

he encontrado la respuesta. Microsoft dice

Unfortunately Get-Acl is missing some features. It always reads the full security descriptor even if you just want to modify the DACL. That’s why Set-ACL also wants to write the owner even if you have not changed it. Using the GetAccessControl method allows you to specify what part of the security descriptor you want to read.

reemplaza la llamada Get-Acl con

$acl = (Get-Item $path).GetAccessControl('Access') 
8

Es necesario el SeRestorePrivilege para establecer 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/

He probado el método (get-item $path).getaccesscontrol("access") pero todavía tiene el mismo error desde mi proceso no tenía la SeRestorePrivilege.

+1

Muchas gracias por esto. Encontré a través de Google y me ayudó a resolver un problema completamente diferente. –

+1

Gracias, este fue el punto para mí. También descubrí que una posible solución para configurar el propietario es usar la versión de la ruta "local UNC", p. si desea configurar el propietario para C: \ test.txt, necesita llamar al método SetAccessControl en el elemento (get-item "\\ localhost \ C $ \ test.txt") –

+0

Aunque esto funciona, prefiero la solución seleccionada sobre usar en su lugar (Get-Item $ path) .GetAccessControl ('Access') para obtener el objeto ACL – bergmeister

1

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\" 
0

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

trabajado para mí. 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 utilizo un usuario diferente, obtengo el mismo error: Set-Acl: el identificador de seguridad no puede ser el propietario de este objeto.

Acabo de cambiar de Get-ACL a esa línea de arriba y funcionó bien. Gracias de nuevo.

Cuestiones relacionadas