Auditoria de permissões NTFS com o PowerShell

4

Estou trabalhando em um projeto no qual preciso poder auditar vários usuários e permissões de grupos de usuários em um servidor de arquivos Windows formatado em NTFS. Eu gostaria de usar o PowerShell e fazer uma pesquisa recursiva através do compartilhamento de arquivo remoto ou ele poderia ser executado no próprio servidor e fazer com que ele exiba todas as permissões que encontrar para tudo ou para o usuário ou grupo de usuários especificado. O objetivo é poder usá-lo para auditoria periódica de usuários e grupos de usuários, a fim de garantir que a migração de permissão não ocorra e que todas as permissões estejam sendo configuradas da mesma maneira por diferentes administradores de sistema. Por fim, ele seria usado para identificar onde precisamos fazer alterações quando alteramos grupos de usuários na política de grupo. Existem maneiras comuns de abordar isso? O PowerShell suporta essa tarefa? Seria possível que o PowerShell enviasse os resultados para um formato legível?

    
por John 03.01.2012 / 21:49

3 respostas

4

Eu li uma postagem brilhante há alguns meses, lidando com uma situação semelhante executando essencialmente um script remotamente que usa o cmdlet Get-ACL para listar acl de um caminho recursivamente e canalizando a saída pelo cmdlet Export-CSV para uma boa visão geral:

link

    
por 03.01.2012 / 22:08
1

Nesse caso, acho que as ferramentas Sysinternals AccessChk e AccessEnum podem ser mais adequadas para o que você está procurando. Eles podem ser encontrados em Utilitários de arquivo e disco aqui .

    
por 03.01.2012 / 22:47
1

Semelhante ao link Judaslscariot1651 fornecido. Fui mais em direção a tirar o instantâneo do que eu sei que é bom e depois compará-lo sempre que precisava, executando um script. Eu comparei as permissões de arquivo enviando para o XML o que ele encontrou atualmente e, em seguida, comparei-o ao meu arquivo XML de linha de base usando Compare-Object . Pode não ser exato, mas do jeito que eu fui fazendo ...

Observação: esse foi um trabalho em andamento no momento e é voltado para determinados caminhos que eu precisava observar, que retirei da leitura dos valores da chave do Registro. A essência principal do que você provavelmente precisa começa perto de "Coletando informações sobre ...". Eu só queria fornecer todo o código para mostrar como / o que eu estava fazendo.



#Get date/time for file name
$d = Get-Date -format "yyyyMMdd"
# Pull instance names found on server 
$inst = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server').InstalledInstances

$warningpreference = "Continue"

foreach($i in $inst) 
{    $p = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$i
    $bin = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\Setup").SQLBinRoot
    $ver = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\MSSQLServer\CurrentVersion").CurrentVersion
    switch -wildcard ($ver) 
    {
        "9*" {$client = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server').VerSpecificRootDir; break }
        "10*" {$client = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server0').VerSpecificRootDir; break }
    }

    $currentFile = $i + "_" + $d + ".xml"
    "Collecting information on $bin and $client for $i"
        $bin,$client | foreach { Get-ChildItem $_ -Recurse } |
                    Select FullName, CreationTimeUTC, LastWriteTimeUtc, PSIsContainer, Length,
                    @{Name='Owner';Expression={ (Get-Acl $_.PSPath).Owner }},
                    @{Name='ACLRights';Expression={ (Get-Acl $_.PSPath).Access | Select FileSystemRights }},
                    @{Name='ACLUser';Expression={ (Get-Acl $_.PSPath).Access | Select IdentityReference }},
                    @{Name='ACLAccessType';Expression={ (Get-Acl $_.PSPath).Access | Select AccessControlType}} |
                        Export-Clixml $currentFile
    "Current file is: $currentFile"

    $basefile = "baseline_$i.xml"
    if (Test-Path $basefile)
    {
        $base = Import-Clixml $basefile
        $current = Import-Clixml $currentFile
        #now compare
        $results = "Results_" + $i + "_" + $d + ".txt"
        Compare-Object $base $current -Property CreationTimeUTC, LastWriteTimeUtc, Length, FullName, Owner, AclRights, AclUser, AclAccessType |
            Out-File $results

        #determine if the results file shows any changes, if so wave a flag
        if ((Get-Content $results).Length -eq $null)
        {
            "ZERO Changes found"
        }
        else
        {
            "changes found"
        }
    }
    else
    {
        Write-Warning -Message "WARNING: No base file found to compare."
    }
}

    
por 04.01.2012 / 22:03