web-dev-qa-db-fra.com

Obtenez des membres du groupe Active Directory et vérifiez s'ils sont activés ou désactivés

Quel est le moyen le plus rapide d'obtenir une liste de tous les membres/utilisateurs d'un groupe AD donné et de déterminer si un utilisateur est activé (ou désactivé)?

Nous parlons potentiellement d'utilisateurs de 20K, donc je voudrais éviter de toucher l'AD pour chaque utilisateur individuel.

24
Karsten Strøbæk

Si vous êtes sur .NET 3.5 et plus, vous devriez vérifier le System.DirectoryServices.AccountManagement (S.DS.AM) espace de noms. Lisez tout a propos de ça ici:

Fondamentalement, vous pouvez définir un contexte de domaine et trouver facilement des utilisateurs et/ou des groupes dans AD:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find the group in question
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere");

// if found....
if (group != null)
{
   // iterate over members
   foreach (Principal p in group.GetMembers())
   {
      Console.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName);

      // do whatever you need to do to those members
      UserPrincipal theUser = p as UserPrincipal;

      if(theUser != null)
      {
          if(theUser.IsAccountLockedOut()) 
          {
               ...
          }
          else
          {
               ...
          }
      }
   }
}

Le nouveau S.DS.AM, il est vraiment facile de jouer avec les utilisateurs et les groupes dans AD!

52
marc_s

Veuillez essayer le code suivant. il utilise Syntaxe du filtre de recherche pour obtenir ce que vous voulez dans une requête LDAP et récursivement. L'intérêt est que la requête se fasse sur le serveur. Je ne suis pas sûr qu'il soit plus rapide que la solution @marc_s mais il existe, et il fonctionne sur le framework .NET 2.0 (début W2K3 SP2).

string sFromWhere = "LDAP://WM2008R2ENT:389/dc=dom,dc=fr";
DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "dom\\jpb", "test.2011");

/* To find all the users member of groups "Grp1"  :
 * Set the base to the groups container DN; for example root DN (dc=societe,dc=fr) 
 * Set the scope to subtree
 * Use the following filter :
 * (member:1.2.840.113556.1.4.1941:=CN=Grp1,OU=MonOu,DC=X)
 * coupled with LDAP_MATCHING_RULE_BIT_AND on userAccountControl with ACCOUNTDISABLE
 */
DirectorySearcher dsLookFor = new DirectorySearcher(deBase);
dsLookFor.Filter = "(&(memberof:1.2.840.113556.1.4.1941:=CN=MonGrpSec,OU=MonOu,DC=dom,DC=fr)(userAccountControl:1.2.840.113556.1.4.803:=2))";
dsLookFor.SearchScope = SearchScope.Subtree;
dsLookFor.PropertiesToLoad.Add("cn");

SearchResultCollection srcUsers = dsLookFor.FindAll();

/* Just to know if user is present in an other group
 */
foreach (SearchResult srcUser in srcUsers)
{
  Console.WriteLine("{0}", srcUser.Path);
}
5
JPBlanc