2013-02-11 4 views
0

J'ai un domaine Active Directory dans lequel je crée des objets de groupe sous une certaine unité d'organisation nouvellement créée comme indiqué ci-dessous, par exemple. les groupes sous SubOuB. Les groupes globaux sous GlobalGroups sont déjà là.Comment éviter groupPrincipal.Members.Add de lancer une exception NoMatchingPrincipalException

+MainOu 
    +--SubOuA 
    +--GroupA_A 
    +--GroupA_B 
    +--GroupA_C 
    +--SubOuB 
    +--GroupB_A 
    ... 
+GlobalGroups 
    +--GlobalGroupA 
    +--GlobalGroupB 
    ... 

Maintenant, je veux ajouter les groupes nouvellement ajoutés sous l'unité d'organisation nouvellement créée en tant que membres à l'un des groupes mondiaux, par exemple ajouter GroupA_A en tant que membre à GlobalGroupB:

using(PrincipalContext principalContext = 
    new PrincipalContext(ContextType.Domain, Environment.UserDomainName)) 
{ 
    GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(
     principalContext, "GlobalGroupB"); 
    if(groupPrincipal != null) 
    { 
     // Target group found. 
     groupPrincipal.Members.Add(principalContext, IdentityType.Name, "GroupA_A"); 
     // The next line throws a NoMatchingPrincipalException. 
     groupPrincipal.Save(); 
    } 
} 

Quand je regarde la structure AD et les objets que je peux voir les deux objets. L'éditeur ADSI me montre que les deux "noms" sont corrects. Lorsque je lance manuellement le code dans une application de test après la création des nouveaux objets d'unité d'organisation et de groupe, l'ajout du groupe en tant que membre au groupe global fonctionne également correctement. Tout le code que j'ai utilisé fonctionne dans un environnement intermédiaire avec un AD de la même structure, donc je ne sais pas pourquoi il a des problèmes dans l'environnement productif.

Des idées? J'ai vu que les objets DirectoryEntry ont une méthode RefreshCache qui force à recharger les valeurs de propriété de l'objet particulier, mais je ne pense pas que cela va aider ici. Mon problème est-il un problème de timing? Puis-je forcer à "recharger" les objets existants afin que le groupe nouvellement créé soit trouvé et puisse être ajouté au groupe global?

Mise à jour

Cela semble certainement être un problème avec la synchronisation AD - quand je vérifie en permanence l'existence de l'objet groupe nouvellement créé (boucle par exemple avec un Thread.Sleep (1000)) mon code fonctionne comme prévu. L'inconvénient est que je ne sais pas combien de temps je vais devoir attendre (les tests ont varié entre 6 et 15 secondes dans mon environnement) et je pense aussi que c'est une approche très sale. Malheureusement, je n'ai trouvé aucune information sur la façon de "rafraîchir" les objets AD ou de "vider" le cache.

Mise à jour 2

Lorsque je me connecte à un contrôleur de domaine spécifique, la première requête est lente (3000+ millisecondes), les requêtes suivantes sont plus rapides et prennent tous sur le même temps pour revenir. Je ne sais toujours pas comment je peux éviter d'interroger périodiquement l'AD jusqu'à ce que l'objet attendu soit effectivement disponible (comme résultat d'une requête).

Répondre

-1

Pour autant que je sais que les seuls moyens de résoudre mon problème sont les suivants:

  • soit ne comme suggéré dans ma question et interroger périodiquement « votre » contrôleur de domaine jusqu'à ce que l'objet s'attendre devient disponible ou configurable délai d'attente est atteinte
  • Extraire tous les contrôleurs de domaine disponibles via Domain.DomainControllers et interroger chacun d'eux jusqu'à ce que votre objet a été trouvé

Je n'aime pas de toute façon trop, mais je ne pouvais pas trouver d'autres options. N'hésitez pas à suggérer de meilleures alternatives.

Questions connexes