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

14

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?

imagodei
la source
1
C'est pourquoi vous devez toujours accorder l'adhésion en fonction des groupes, même s'il n'y a qu'un seul utilisateur dans le groupe. Vous auriez pu le retirer du groupe. En attendant, pendant que vous attendez une réponse, vous pouvez simplement désactiver son compte dans AD.
MDMarra
Avez-vous essayé cet outil: AccessChk v5.0? Pour s'assurer qu'ils ont créé un environnement sécurisé, les administrateurs Windows ont souvent besoin de savoir quel type d'accès des utilisateurs ou des groupes spécifiques ont aux ressources, notamment les fichiers, les répertoires, les clés de registre, les objets globaux et les services Windows. AccessChk répond rapidement à ces questions avec une interface et une sortie intuitives. Trouvé ici: technet.microsoft.com/en-us/sysinternals/bb664922.aspx
Luke99
@MarkM: C'est vrai ... C'est juste que lorsque l'utilisateur a besoin d'un accès à un seul dossier, vous l'ajoutez. Puis, dans quelques mois, il a besoin d'un autre accès sur une part complètement différente. Et dans quelques mois à nouveau sur 2 ou 3 dossiers. Comment créez-vous un groupe avec un nom significatif pour un tel utilisateur? "Username_granular_access_group"? Cela ferait probablement l'affaire. @ Luke99: Outil intéressant de Sysinternals. Comment pourrais-je le manquer. Quoi qu'il en soit, je vois qu'il affiche tous les dossiers auxquels l'utilisateur a un accès direct ou indirect. Existe-t-il un moyen d'afficher uniquement les dossiers dans lesquels l'utilisateur est explicitement répertorié dans l'ACL (à l'exclusion des accès via les groupes)?
imagodei

Réponses:

13

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 la façon de dire "recherchez les répertoires, pas les fichiers". Bien sûr, si vous voulez trouver des fichiers et non des dossiers, changez-le en *.*, 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 par rapport à cela dossier uniquement.

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 ne dispose pas lui-même des 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 de telles erreurs, 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" à l'aide de 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 "someuser" DOIT avoir accès mais auxquels VOUS n'avez pas. Donc, vous voudrez peut-être réfléchir à deux fois pour 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.

charlie arehart
la source
Il semble que cela devrait être évident, mais il convient de souligner: la recherche de *. n'équivaut PAS à la recherche dans les répertoires uniquement ou dans tous les répertoires. Les noms de répertoire peuvent avoir des extensions et les fichiers n'ont pas à avoir d'extensions. Si vous voulez être minutieux, laissez-le rechercher tout.
Scott E
6

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.

Jon
la source
Serait-il également possible «d'exclure» les autorisations héritées? (c'est-à-dire en recherchant tous les dossiers, où "DOMAINE \ Nom d'utilisateur" a été ajouté de manière explicite?
dognose
1
Oui, vous pouvez:if ($ACL.IdentityReference -like $ReferenceAccountName -and !$ACL.IsInherited){
annoncer le
3

J'ai trouvé une solution à ma propre question. C'est, je crois, très simple et propre. Vous n'avez qu'à installer subinacl et 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 analysez et nom d'utilisateur est l'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 les répertoires auxquels l'utilisateur a accès (avec des masques d'accès et d'autres choses qui peuvent parfois être utiles).

J'ai utilisé OpenOffice Calc pour importer la liste, puis j'ai 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.

imagodei
la source