2009-06-11 1 views
0

Dans mon environnement, j'ai plusieurs projets qui impliquent l'exécution de rapports d'audit NTFS ACL et diverses activités de nettoyage ACL sur un certain nombre de serveurs de fichiers. Il y a deux raisons principales pour lesquelles je ne peux pas effectuer ces activités localement sur les serveurs:Existe-t-il une API pour définir une liste de contrôle d'accès NTFS uniquement sur un dossier particulier sans que les autorisations ne soient versées?

1) Je n'ai pas d'accès local aux serveurs car ils sont détenus et administrés par une autre société.

2) Ils sont SNAP NAS servers qui exécutent un système d'exploitation Linux modifié (appelé GuardianOS) donc même si je pouvais obtenir un accès local, je ne suis pas sûr de la disponibilité des outils pour effectuer les opérations dont j'ai besoin. Avec cela, j'ai fini par lancer mon propre outil de rapport d'audit ACL qui recurait le système de fichiers en commençant à un chemin de haut niveau spécifié et crachait un rapport HTML sur tous les groupes/utilisateurs rencontrés sur les listes de contrôle d'accès ainsi que l'affichage des modifications apportées aux autorisations lors de la descente de l'arborescence. En développant cet outil, j'ai découvert que les frais généraux du réseau constituaient la pire partie de l'exécution de ces opérations et que, en multi-threading du processus, je pouvais obtenir des performances nettement supérieures.

Cependant, je suis toujours bloqué pour trouver un bon outil pour effectuer les modifications et le nettoyage ACL. Vos outils standard prêts à l'emploi (cacls, xcacls, Explorer) semblent être mono-thread et subissent des pénalités de performance significatives lorsqu'ils traversent le réseau. J'ai envisagé de lancer mon propre programme de configuration d'ACL qui est multithread mais la seule API que je connais est la substance .NET FileSystemAccessRule et le problème est que si je place les permissions sur un dossier, il veut automatiquement "couler" les autorisations vers le bas. Cela cause un problème parce que je veux faire le "coulant" moi-même en utilisant le multi-threading. Je sais que NTFS "autorise" les autorisations héritées à être incohérentes parce que je l'ai vu où un dossier/fichier est déplacé sur le même volume entre deux dossiers parents avec des autorisations héritées différentes et conserve les anciennes autorisations comme "héritées" .

Les questions

1) Est-il possible de définir une ACL qui applique au dossier en cours et tous les enfants (votre standard « applique aux fichiers, dossiers et sous-dossiers » ACL), mais sans le automatiquement vers les objets enfants? Fondamentalement, je veux pouvoir dire à Windows que "Oui, cette ACL devrait être appliquée aux objets enfants mais pour l'instant, il suffit de la définir directement sur cet objet". Pour être clair comme du cristal, je connais les options ACL pour appliquer à "ce dossier seulement" mais ensuite je perds l'héritage qui est une exigence pour que l'option ne soit pas valide pour mon cas d'utilisation. 2) Quelqu'un connaît-il de bons algorithmes ou méthodologies pour effectuer des modifications de listes de contrôle d'accès d'une manière multithread? Mon intuition est que toute traversée récursive du système de fichiers devrait fonctionner en théorie, surtout si vous ne faites que définir une nouvelle ACL sur un dossier de haut niveau et que vous voulez juste "nettoyer" tous les sous-dossiers. Vous devez marquer la nouvelle liste de contrôle d'accès au niveau supérieur, puis revenir en arrière en supprimant toutes les entrées de contrôle d'accès explicites, puis en "transférant" les autorisations héritées. ServerIl s'agit d'une question à partially duplicated de la part de ServerFault, parce que c'est vraiment un administrateur système et un problème de programmation, mais je demandais si quelqu'un connaissait des outils capables de configurer rapidement les ACL sur le réseau.)

Répondre

0

trouvé la réponse dans un MS KB article:

autorisations de fichiers qui sont définies sur les fichiers et dossiers à l'aide Active Directory services Interface (ADSI) et le kit de ressources ADSI utilitaire, ADsSecurity.DLL, ne pas propager automatiquement la sous-arborescence vers les dossiers existants et les fichiers.

La raison pour laquelle vous ne pouvez pas utiliser ADSI pour ensemble ACEs de se propager vers le bas pour fichiers et dossiers existants est parce que ADsSecurity.DLL utilise le faible niveau fonction SetFileSecurity pour définir le descripteur de sécurité sur un dossier. est aucun indicateur qui peut être défini en utilisant SetFileSecurity pour automatiquement propager les ACE vers les fichiers et dossiers existants . L'indicateur de contrôle SE_DACL_AUTO_INHERIT_REQ ne définira que l'indicateur SE_DACL_AUTO_INHERITED dans le descripteur de sécurité associé au dossier .

Je dois utiliser le faible niveau fonction API Win32 SetFileSecurity (qui est marquée comme obsolète dans son MSDN entry) pour définir l'ACL et qui devrait l'empêcher de couler automatiquement. Bien sûr, je préfère déchirer mes yeux avec une cuillère plutôt que de traiter P/Invoke Win32 API avec toutes ses verrues afin que je puisse finir par utiliser un ancien outil NT4 appelé FILEACL qui est comme CACLS mais dispose d'une option pour utiliser l'API SetFileSecurity afin que les modifications ne se propagent pas automatiquement.

Questions connexes