Contrôle plus efficace de l'appartenance à un groupe dans Active Directory (C # .NET)

StackOverflow https://stackoverflow.com/questions/85724

  •  01-07-2019
  •  | 
  •  

Question

J'ai un outil de synchronisation Active Directory (.NET 2.0 / C #) écrit en tant que service Windows sur lequel je travaille depuis un certain temps. On m'a récemment confié la possibilité de gérer les événements en fonction des modifications apportées. appartenance à un groupe. Le scénario de base est que les utilisateurs sont synchronisés avec une base de données de sécurité et que, lorsque leur appartenance à un groupe change, leurs droits d'accès doivent être modifiés (c'est-à-dire que si je suis maintenant membre du "personnel informatique", je devrais automatiquement avoir accès à la salle des serveurs, si je suis retiré de ce groupe, je devrais automatiquement perdre l'accès à la salle des serveurs).

Le problème est que lorsque vous effectuez une synchronisation DirectorySynchronization avec des groupes, vous recevez le groupe auquel un membre a été ajouté / supprimé, et à partir de là, lorsque vous récupérez la liste des membres, vous récupérez la liste de tous les membres de ce groupe. les membres qui ont été ajoutés ou supprimés. Cela me conduit à un problème d'efficacité - à savoir que pour savoir si un utilisateur a été ajouté ou supprimé, je devrai conserver localement une liste de chaque groupe et de tous les membres et la comparer à la liste actuelle pour voir qui l'a été. ajouté (pas dans la liste locale), et qui a été supprimé (dans la liste locale, pas dans la liste des membres actuels).

Je parle simplement de stocker en mémoire les détails d’appartenance au groupe dans un DataSet et d’écrire sur le disque chaque fois que j’ai traité de nouvelles modifications d’appartenance. Ainsi, si le service s'arrête / se bloque ou que la machine est redémarrée, je peux toujours obtenir l'état actuel de Active Directory dans la base de données de sécurité en comparant les dernières informations sur le disque avec celles de la liste d'appartenance au groupe actuelle. Cependant, cela semble terriblement inefficace: comparer tous les membres du groupe avec ce qui est contenu dans le jeu de données, puis écrire les modifications sur le disque à chaque modification de la liste.

Quelqu'un a-t-il déjà fait face à ce scénario? Existe-t-il un moyen que je n'ai pas trouvé pour récupérer uniquement un delta de membres du groupe? Que feriez-vous dans cette situation pour vous assurer de ne perdre aucun changement tout en prenant le plus petit impact possible sur les performances?

Modifier: L'ANNONCE peut contenir 500 utilisateurs, 200 000 utilisateurs - cela dépend du client et, en plus, combien de groupes l'utilisateur moyen est-il membre

Était-ce utile?

La solution

Je dirais que cela dépend du nombre d'objets Active Directory que vous devez suivre. S'il s'agit d'un petit nombre (moins de 1 000 utilisateurs), vous pouvez probablement sérialiser vos données d'état sur disque avec un impact limité sur les performances. Si vous traitez un très grand nombre d’objets, il pourrait être plus efficace de créer un schéma de persistance simple dans quelque chose comme SQL Express et de l’utiliser.

Autres conseils

Vous pouvez configurer l'audit pour la réussite des modifications de compte dans l'éditeur de stratégie de groupe

Vous pouvez ensuite surveiller le journal de sécurité pour les entrées et gérer les entrées de journal lors des modifications de compte.

ex.

        EventLog myLog = new EventLog("Security");

        // set event handler
        myLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten);
        myLog.EnableRaisingEvents = true;

Assurez-vous que vous avez les privilèges pour accéder au journal des événements de sécurité. http://support.microsoft.com/kb/323076

Vous savez qu'il existe des produits qui vous aident avec la synchronisation d'annuaires et le provisioning des utilisateurs (google ces termes)? Pas inventé ici et tout ça, et vous devrez peut-être justifier l'investissement dans le climat actuel, mais développer et maintenir un code pour lequel il existe déjà une solution commerciale n'est pas, disons, toujours le moyen le plus rentable à long terme courir.

Tous les services de support événementiel / provisioning ne prennent pas en charge, mais ils prennent en charge le suivi des modifications et leur distribution: ce n'est pas une grosse affaire de créer des solutions d'événements en plus de ces fonctionnalités.

Microsoft a le Identity Integration Server (MISS), qui est être reconditionné dans le cadre de Gestionnaire de cycle de vie des identités . A l'origine, il reposait sur un produit de gestion de métadonnées / données de base plus général, mais il est réalisable. IBM dispose de Tivoli Directory Integrator (mais vous devez vous tenir au courant. le nom change tous les deux ans!). Oracle dispose d'un Oracle Identity Manager et de Sun << href = "http://www.sun.com/software/products/identity_mgr/index.xml" rel = "nofollow noreferrer"> Identity Manager . La plupart d’entre eux sont des produits phares achetés par les principaux acteurs pour combler un vide dans leurs portefeuilles.

Bien sûr, il s’agit de produits destinés aux entreprises, ce qui signifie "gros". cher, mais généralement assez futur et extensible. Si vous n'avez pas besoin de toute leur force (encore!), Vous devrez envisager de stocker une copie pour vous-même. Dans ce cas, avez-vous envisagé de stocker votre réplique du dernier arbre AD connu à l'aide de AD LDS (anciennement AD / AM)? Ce n'est pas dans un format optimal pour comparer les différences, mais une base de données de répertoires évoluera raisonnablement bien, même du type léger.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top