2011-07-04 12 views
6

Soy bastante nuevo en secuencias de comandos PowerShell (cerca de 1 mes desde que empecé a aprender PowerShell.)Extracción toda ACL en carpeta con PowerShell

estoy trabajando actualmente en un guión con PowerShell 2.0 para limpiar carpeta NTFS ACL. Quiero eliminar cada acl excepto el administrador.

Mi problema es que no puedo encontrar la manera de eliminar cada acl que no sea administrador, sin conocerlos.

Así que vine aquí en busca de PowerShell Pro.

Respuesta

8

esta ACL Quitar código:

$acl = Get-Acl \\remote_server\share_folder\HAL.9000 
$acl.Access | %{$acl.RemoveAccessRule($_)} 

Este código administrador add acl:

#BUILTIN administrator 

$acl = Get-Acl \\remote_server\share_folder\HAL.9000 
$permission = "BUILTIN\Administrators","FullControl", "ContainerInherit,ObjectInherit","None","Allow" 
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission 
$acl.SetAccessRule($accessRule) 
Set-Acl \\remote_server\share_folder\HAL.9000 $acl 

#Domain controller administrator 

$acl = Get-Acl \\remote_server\share_folder\HAL.9000 
$permission = "DOMAINCONTROLLER\Administrators","FullControl", "ContainerInherit,ObjectInherit","None","Allow" 
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission 
$acl.SetAccessRule($accessRule) 
Set-Acl \\remote_server\share_folder\HAL.9000 $acl 

Esperamos que esto ayude a alguien :)

+1

¿No tiene que deshabilitar la herencia antes de que sean capaces de eliminar las reglas heredadas? –

+0

Bueno, ciertamente tiene que desactivar la herencia, pero usar la herencia es un mal movimiento para compartir el servidor, lo arruinará todo con esto, así que siempre los desactivo cuando creo un nuevo servidor, de esta manera no hay problema. En cuanto a mi script, la herencia no fue un problema, el script elimina el acl y crea uno nuevo que está limpio. Tratará de encontrar una forma de desactivar la herencia si surge un problema. –

2

Este código de eliminación acl: $ acl = Get-Acl \ remote_server \ share_folder \ HAL.9000 $ acl.Access | % {$ acl.RemoveAccessRule ($ _)}

no funciona hasta que lo haga

Set-Acl \\remote_server\share_folder\HAL.9000 $acl 
3

Por conveniencia he copiar/pegar todas estas cosas juntas en una función. Si puede ser de utilidad para nadie, aquí está:

Function Remove-ACL {  
    [CmdletBinding(SupportsShouldProcess=$True)] 
    Param(
     [parameter(Mandatory=$true,ValueFromPipeline=$true,Position=0)] 
     [ValidateNotNullOrEmpty()] 
     [ValidateScript({Test-Path $_ -PathType Container})] 
     [String[]]$Folder, 
     [Switch]$Recurse 
    ) 

    Process { 

     foreach ($f in $Folder) { 

      if ($Recurse) {$Folders = $(Get-ChildItem $f -Recurse -Directory).FullName} else {$Folders = $f} 

      if ($Folders -ne $null) { 

       $Folders | ForEach-Object { 

        # Remove inheritance 
        $acl = Get-Acl $_ 
        $acl.SetAccessRuleProtection($true,$true) 
        Set-Acl $_ $acl 

        # Remove ACL 
        $acl = Get-Acl $_ 
        $acl.Access | %{$acl.RemoveAccessRule($_)} | Out-Null 

        # Add local admin 
        $permission = "BUILTIN\Administrators","FullControl", "ContainerInherit,ObjectInherit","None","Allow" 
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission 
        $acl.SetAccessRule($rule) 

        Set-Acl $_ $acl 

        Write-Verbose "Remove-HCacl: Inheritance disabled and permissions removed from $_" 
       } 
      } 
      else { 
       Write-Verbose "Remove-HCacl: No subfolders found for $f" 
      } 
     } 
    } 
} 

Uso:

# For only one folder: 
Remove-ACL 'C:\Folder' -Verbose 

# For all subfolders: 
Remove-ACL 'C:\Folder' -Recurse -Verbose 

# Pipe stuff 
'C:\Folder 1', 'C:\Folder 2' | Remove-ACL -Verbose 
0

Por qué no crear una nueva lista. Por ejemplo:

$identity = New-Object System.Security.Principal.NTAccount('NT AUTHORITY\SYSTEM') 
$acl = New-Object System.Security.AccessControl.DirectorySecurity 
$acl.SetOwner($identity) 
$acl.SetGroup($identity) 
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule('NT AUTHORITY\SYSTEM', ’FullControl’, ’ContainerInherit, ObjectInherit’, ’None’,’Allow’) 
$acl.AddAccessRule($rule) 
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule('BUILTIN\Administrators', ’FullControl’, ’ContainerInherit, ObjectInherit’, ’None’, ’Allow’) 
$acl.AddAccessRule($rule) 
Set-Acl -LiteralPath "C:\MyFolder" -AclObject $acl 
Get-Acl -LiteralPath "C:\MyFolder" | Format-List 
Cuestiones relacionadas