Listar permissões de acesso à pasta do usuário

9

Eu tenho um usuário em um domínio que tem acesso a várias subpastas em várias pastas. Seus direitos foram definidos de forma bem granular. Agora ele está deixando a empresa, mas continuará trabalhando para uma empresa como um recurso contratado.

Eu preciso encontrar todas as pastas às quais ele teve acesso e revogar suas permissões, depois configurá-lo com um conjunto diferente de permissões de acesso.

Existe alguma ferramenta (freeware, de preferência) que lista todas as permissões NTFS para um determinado usuário? Eu tentei com AccessEnum da Sysinternals, mas a lista não pode ser filtrada por nome de usuário e é inútil para mim. Eu olhei para o CACLS também, mas até onde eu sei, ele exibe as permissões ordenadas pelo arquivo, não pelo usuário.

Alguma idéia?

    
por imagodei 17.08.2010 / 11:21

3 respostas

3

Eu encontrei uma solução para minha própria pergunta. É, acredito, muito simples e limpo. Você só precisa instalar o subinacl e executar uma linha no prompt de comando.

Você pode fazer download de subinacl aqui . Embora seja oficialmente suportado apenas no Win2k, XP e 2k3, ele deve funcionar no Vista, 2008 e 7 também.

Em seguida, você executa o seguinte no prompt de comando:

subinacl /testmode /noverbose /outputlog=c:\TEXTFILENAME.TXT /subdirectories=directoriesonly X:\*.* /findsid=DOMAIN\username

Onde X: é a unidade que você está digitalizando e nome de usuário é o usuário cujas permissões você gostaria de listar. A varredura pode levar algum tempo e você obtém os resultados em TEXTFILENAME.TXT.

Se você usar a opção / noverbose , você terá uma lista compacta de permissões de acesso - basicamente, você verá quais diretórios o usuário tem acesso (com máscaras de acesso e outras coisas que podem ser úteis às vezes) ).

Eu usei o OpenOffice Calc para importar a lista e, em seguida, apliquei um filtro personalizado e filtrado apenas para as linhas que começam com + FILE . Essas linhas contêm diretórios aos quais o usuário tem acesso. É assim que, usando ferramentas simples, você só obtém informações relevantes.

Como a herança é frequentemente ativada em diretórios pai, o número real de diretórios que você pode precisar para ajustar as permissões é geralmente bem menor do que a própria lista.

    
por 06.10.2010 / 14:39
9

Isto parece fazer o truque (talvez com uma ressalva), para encontrar todas as pastas que o usuário "algum usuário" tem acesso, neste exemplo na unidade C, usando o comando icacls do Windows:

icacls c:\*. /findsid someuser /t /c /l

O / t é necessário para informar a recursão de diretórios. O / c é necessário para dizer para continuar mesmo que encontre erros. O / l faz com que funcione com links simbólicos (se houver). (Esse último é um L e esses sinalizadores podem ser maiúsculas ou minúsculas).

O *. será reconhecido pelos old-timers do DOS como a maneira de dizer "procure diretórios, não arquivos". É claro que, se você quiser encontrar arquivos e não pastas, altere-o para *.* e, claro, você pode apontá-lo para qualquer unidade ou executá-lo em qualquer pasta e deixar o caminho da unidade / pasta e deixá-lo pesquisar em relação a essa pasta apenas.

Procurei a mesma resposta do OP e encontrei essa entrada, mas fiquei chateado ao ver apenas uma oferta baseada em uma ferramenta para download. Como outros, eu preferi usar algo embutido, e achei, nesta ferramenta icacls.

Eu confirmei que funciona no Windows Server 2012, 2008 e no Windows 7, por isso suspeito que funcionará também no Server 2003, no Windows 8 e assim por diante.

A lista resultante será composta por pastas, linha após linha, como:

SID encontrado: c: \ somedir \ somesubdir.

Observe que, se você executar isso como um usuário que não tem permissões para alguns diretórios sendo percorridos, você obterá os erros intercalados nos resultados, como:

c: \ System Volume Information: acesso negado.

E se você estiver pesquisando uma unidade inteira, isso pode resultar em centenas de erros, dificultando a localização dos resultados.

Alguns podem pensar que a resposta é executar a linha de comando como administrador, mas isso simplesmente fará com que muito mais erros apareçam, pois agora você estará percorrendo pastas que estavam ocultas anteriormente.

Agora, se você estava interessado em esconder esses erros, você não será capaz de usar um comando find para canalizar apenas os resultados que são bem-sucedidos (aqueles que NÃO se referem a "SID encontrado"), porque os erros NÃO ser filtrado pelo pipe para o comando find. Em vez disso, se você quiser remover todos os erros, será necessário usar o truque bastante obscuro de redirecionar o fluxo de erros (stderr) para o "depósito de bits" usando 2>nul: . Então, o exemplo acima se tornaria:

icacls c:\*. /findsid someuser /t /c /l 2>nul:

Apenas fique atento para o fato de que algumas das pastas que geraram tais erros, cujos erros agora estão ocultos, podem ser pastas às quais o named "algum usuário" tem acesso, mas que você NÃO tem. Então você pode querer pensar duas vezes sobre simplesmente ignorar esses erros. mas se você quiser, é assim que você pode fazer isso.

Essa possibilidade limita potencialmente o valor dessa resposta, eu percebo. Se alguém com mais familiaridade com as coisas gostaria de expandir ou corrigir minha resposta, eu o receberia bem.

    
por 20.02.2015 / 05:12
5

Você pode usar o PowerShell sem precisar fazer o download de mais nada. Isso funcionará com a versão 2.0 e posterior:

$ReferenceAccountName = 'DOMAIN\Username'
[string[]]$SearchDirectories = @('X:\SomeDirectory', 'F:\AnotherDirectory')

foreach ($RootDir in $SearchDirectories) {
    $DirACL = Get-Acl -Path $RootDir
    foreach ($ACL in $DirACL.Access){
        if ($ACL.IdentityReference -like $ReferenceAccountName){
            Write-Output $RootDir
        }
    }
    foreach ($Directory in (Get-ChildItem -Path $RootDir -Recurse | '
                            Where-Object -FilterScript {$_.Attributes '
                            -contains 'Directory'})){
        $DirACL = Get-Acl -Path $Directory.FullName
        foreach ($ACL in $DirACL.Access){
            if ($ACL.IdentityReference -like $ReferenceAccountName){
                Write-Output $Directory.FullName
            }
        }
    }
}

Não é tão limpo quanto o que está disponível com o PowerShell v3 e ativado, mas funcionará. Isto irá mostrar uma lista dos diretórios encontrados no formato de string.

Você pode facilmente exibi-los como objetos e continuar a trabalhar com eles (exportá-los para um arquivo CSV, remover as entradas à medida que as encontrar, atualizar um ticket com as informações ... etc) manipulando o objeto de entrada de as chamadas de Write-Output.

    
por 23.02.2015 / 13:30