Avaliando ACEs atuais em ACLs NTFS com o PowerShell

7

Temos um sistema de gerenciamento de documentos que possui milhões de arquivos em um sistema de arquivos NTFS acessado por meio de um compartilhamento de rede. Uma única conta de serviço precisa de permissão total para todos esses arquivos e os brokers de aplicativos acessam usando essa conta de serviço.

Durante uma migração de dados, algo aconteceu e as permissões agora estão inconsistentes.

Eu tenho tentado escrever um script no PowerShell para identificar quais arquivos não têm a ACE apropriada, mas get-acl é um pouco ... doloroso.

Eu tentei várias combinações semelhantes a:

get-childitem -recurse | get-acl | select -expandproperty access | 
where { $_.$_.IdentityReference -notcontains $principal

em que $ Principal é o usuário que precisa de permissão no formato domain\user .

Tem que haver uma maneira de fazer isso, certo? O que é isso? Gostaria de mantê-lo nativo para o PowerShell e não usar icacls ou cacls , se possível.

    
por MDMarra 16.04.2014 / 16:42

1 resposta

8

Você pode fazer isso assim (dividi-lo em mais instruções ajuda na legibilidade):

# Go to the directory and find the files
Push-Location "C:\MDMarrasFiles"
$Files = Get-ChildItem -Recurse

# Create an IdentityReference and a FullControl FileSystemAccessRule for said identity
$Principal = New-Object System.Security.Principal.NTAccount("DOMAIN\user")
$FullControlACERule = New-Object System.Security.AccessControl.FileSystemAccessRule -ArgumentList ($Principal,"FullControl","Allow")

# Go through the files
foreach($File in $Files)
{
    # Get the current ACL on the file
    $ACL = Get-ACL $File

    # Extract the ACEs, both explicit on the file and inherited 
    $ACEs = $ACL.GetAccessRules($true,$true,[System.Security.Principal.NTAccount])

    # Filter the ACEs to extract those giving FullControl to your target user
    $ACEsMatching = $ACEs |Where {'
        $_.FileSystemRights -eq "FullControl" -and '
        $_.IdentityReference -eq $objUser -and '
        $_.AccessControlType -eq "Allow"' 
    }

    # Test if there where no such ACE to be found
    if($ACEsMatching.Count -eq 0)
    {
        # Add the FullControl Rule to the current ACL
        $ACL.AddAccessRule($FullControlACERule)

        # Write the new ACL back to the file
        Set-ACL $File -AclObject $ACL 
    }
}
Pop-Location

Por favor, teste isso em um subconjunto menor de arquivos antes de rodar em produção; -)

Se você quiser ter certeza de que uma nova ACE explícita seja adicionada, mesmo que a conta já tenha herdado o direito, filtre as Regras de acesso herdadas como esta:

$ACEs = $ACL.GetAccessRules($true, $false ,[System.Security.Principal.NTAccount])

Observe como o segundo argumento booleano agora é $false , indicando que as regras herdadas não devem ser retornadas

    
por 16.04.2014 / 16:57