web-dev-qa-db-fra.com

Répertorier les autorisations d'accès aux dossiers de l'utilisateur

J'ai un utilisateur dans un domaine qui a accès à plusieurs sous-dossiers dans plusieurs dossiers. Ses droits étaient définis de façon assez granulaire. Il quitte maintenant l'entreprise mais continuera à travailler pour une entreprise en tant que ressource sous contrat.

J'ai besoin de trouver tous les dossiers auxquels il avait accès et de révoquer ses autorisations, puis de le configurer avec un ensemble différent d'autorisations d'accès.

Existe-t-il un outil (freeware, de préférence) qui répertorie toutes les autorisations NTFS pour un utilisateur donné? J'ai essayé avec AccessEnum de Sysinternals, mais la liste ne peut pas être filtrée par nom d'utilisateur et est inutile pour moi. J'ai également regardé CACLS, mais pour autant que je sache, il affiche les autorisations ordonnées par fichier, pas par utilisateur.

Des idées?

14
imagodei

J'ai trouvé une solution à ma propre question. C'est, je crois, très simple et propre. Il vous suffit d'installer subinacl et d'exécuter une ligne à partir de l'invite de commande.

Vous pouvez télécharger subinacl ici . Bien qu'il ne soit officiellement pris en charge que sur Windows 2000, Windows XP et Windows Server 2003, il devrait également fonctionner sur Windows Vista, Windows Server 2008 et Windows 7.

Ensuite, vous exécutez ce qui suit à partir de l'invite de commandes:

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

X: est le lecteur que vous numérisez et nom d'utilisateur est le utilisateur dont vous souhaitez répertorier les autorisations. La numérisation peut prendre un certain temps et vous obtenez les résultats dans TEXTFILENAME.TXT.

Si vous utilisez le commutateur /noverbose vous obtenez une liste compacte des autorisations d'accès - en gros, vous voyez à quels répertoires l'utilisateur a accès (avec des masques d'accès et certains d'autres choses qui pourraient être utiles parfois).

J'ai utilisé OpenOffice Calc pour importer la liste, puis appliqué un filtre personnalisé et filtré uniquement pour les lignes commençant par + FILE . Ces lignes contiennent des répertoires auxquels l'utilisateur a accès. C'est ainsi qu'en utilisant des outils simples, vous vous retrouvez avec uniquement des informations pertinentes.

Étant donné que l'héritage est souvent activé sur les répertoires parents, le nombre réel de répertoires que vous devrez peut-être visiter pour ajuster les autorisations est généralement nettement inférieur à la liste elle-même.

3
imagodei

Cela semble faire l'affaire (avec peut-être une mise en garde), pour trouver tous les dossiers auxquels l'utilisateur "someuser" a accès, dans cet exemple sur le lecteur C, en utilisant la commande intégrée icacls de Windows:

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

Le/t est nécessaire pour lui dire de recursir les répertoires. Le/c est nécessaire pour lui dire de continuer même s'il rencontre des erreurs. Le/l le fait fonctionner avec des liens symboliques (le cas échéant). (Ce dernier est un L, et ces drapeaux peuvent être en majuscules ou en minuscules.)

Le *. sera reconnu par les anciens du DOS comme le moyen de dire "recherchez les répertoires, pas les fichiers". Bien sûr, si vous souhaitez rechercher des fichiers et non des dossiers, remplacez-le par *.*, et bien sûr, vous pouvez le pointer vers n'importe quel lecteur, ou l'exécuter à partir de n'importe quel dossier et laisser le chemin du lecteur/dossier et le laisser rechercher uniquement par rapport à ce dossier.

J'ai cherché la même réponse que l'OP et j'ai trouvé cette entrée, mais j'ai été déçu de ne voir qu'une offre basée sur un outil téléchargeable. Comme d'autres, j'ai préféré utiliser quelque chose de intégré, et je l'ai trouvé, dans cet outil icacls.

Et j'ai confirmé que cela fonctionne sur Windows Server 2012, 2008 et Windows 7, donc je soupçonne que cela fonctionnera également dans Server 2003, Windows 8, etc.

La liste résultante sera des dossiers indiqués ligne après ligne, tels que:

SID trouvé: c:\somedir\somesubdir.

Notez que si vous l'exécutez en tant qu'utilisateur qui n'a pas lui-même les autorisations pour certains répertoires traversés, vous obtiendrez des erreurs entrelacées dans les résultats tels que:

c:\System Volume Information: l'accès est refusé.

Et si vous recherchez un lecteur entier, cela pourrait entraîner des centaines de ces erreurs, ce qui rend difficile de trouver en eux les résultats.

Certains peuvent penser que la réponse est d'exécuter la ligne de commande en tant qu'administrateur, mais cela provoquera simplement beaucoup plus d'erreurs de ce type, car vous allez maintenant parcourir des dossiers qui étaient auparavant masqués.

Maintenant, si vous vouliez cacher ces erreurs, vous ne pourrez pas utiliser une commande find pour ne diriger que les résultats qui réussissent (ceux qui font référence à "SID trouvé"), car les erreurs ne seront PAS filtrées par le tuyau à la commande find. Au lieu de cela, si vous souhaitez supprimer toutes les erreurs, vous devez utiliser l'astuce plutôt obscure de rediriger le flux d'erreurs (stderr) vers le "compartiment de bits" en utilisant 2>nul:. Ainsi, l'exemple ci-dessus deviendrait:

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

Gardez simplement à l'esprit que certains des dossiers qui ont généré de telles erreurs, lesquelles sont désormais masquées, peuvent bien être des dossiers auxquels le nommé "someuser" A accès, mais que VOUS n'avez pas. Donc, vous voudrez peut-être réfléchir à deux fois avant d'ignorer simplement ces erreurs. mais si vous le souhaitez, c'est comme ça que vous pouvez le faire.

Je comprends que cette possibilité limite potentiellement la valeur de cette réponse. Si quelqu'un connaissant mieux les choses souhaite approfondir ou corriger ma réponse, je m'en réjouirais.

13
charlie arehart

Vous pouvez utiliser PowerShell sans avoir à télécharger quoi que ce soit d'autre. Cela fonctionnera avec v2.0 et versions ultérieures:

$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
            }
        }
    }
}

Ce n'est pas aussi propre que ce qui est disponible avec PowerShell v3 et sur, mais cela fonctionnera. Cela affichera une liste des répertoires trouvés au format chaîne.

Vous pouvez facilement les sortir en tant qu'objets et continuer à travailler avec eux (les exporter vers un fichier CSV, supprimer les entrées au fur et à mesure que vous les trouvez, mettre à jour un ticket avec les informations ... etc) en manipulant l'objet d'entrée de l'écriture. Appels de sortie.

6
Jon