2010-01-03 5 views
1

Je me suis cogné la tête pendant un bon moment avec ceci et je n'arrive pas à le faire fonctionner. J'ai une requête LDAP Je travaille dans AD Users and Computers mais je ne sais pas comment le faire par programmation en C#.LDAP Requête avec sous-résultat

Voici ma requête LDAP qui fonctionne correctement dans l'outil AD: (memberOf = CN = AccRght, OU = Groupes, OU = P, OU = Serveur, DC = mydomain, DC = com) (objectCategory = user) (objectClass = user) (l = Ville)

J'ai utilisé ce code pour obtenir les comptes d'utilisateurs pour obtenir des membres de CN = AccRght mais je n'arrive pas à limiter les utilisateurs appartenant à une ville spécifique.

public StringCollection GetGroupMembers(string strDomain, string strGroup) 
{ 
    StringCollection groupMemebers = new StringCollection(); 
    try 
    { 
     DirectoryEntry ent = new DirectoryEntry("LDAP://DC=" + strDomain + ",DC=com"); 
     DirectorySearcher srch = new DirectorySearcher("(CN=" + strGroup + ")"); 
     SearchResultCollection coll = srch.FindAll(); 
     foreach (SearchResult rs in coll) 
     { 
      ResultPropertyCollection resultPropColl = rs.Properties; 
      foreach(Object memberColl in resultPropColl["member"]) 
      { 
       DirectoryEntry gpMemberEntry = new DirectoryEntry("LDAP://" + memberColl); 
       System.DirectoryServices.PropertyCollection userProps = gpMemberEntry.Properties; 
       object obVal = userProps["sAMAccountName"].Value; 
       if (null != obVal) 
       { 
        groupMemebers.Add(obVal.ToString()); 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.Write(ex.Message); 
    } 
    return groupMemebers; 
} 

Merci pour toute aide!

+0

Quelle version de .NET utilisez-vous? LDAP peut ne pas être nécessaire, en faveur de l'utilisation de l'espace de noms System.DirectoryServices.AccountManagement. – ProfK

+0

J'utilise .NET 3.5. Je vais jeter un oeil à System.DirectoryServices.AccountManagement, semble intéressant! – StefanE

+0

DirectoryServices.AccountManagement manière plus facile de travailler avec et pour moi beaucoup plus logique. Merci pour le conseil! – StefanE

Répondre

1

Eh bien, au fond tout ce que vous avez besoin est de transférer ce filtre LDAP que vous utilisez dans l'outil dans votre DirectorySearcher - quelque chose comme ceci:

public StringCollection GetGroupMembers(string strDomain, string strGroup) 
{ 
    StringCollection groupMemebers = new StringCollection(); 

    try 
    { 
     DirectoryEntry ent = new DirectoryEntry("LDAP://DC=" + strDomain + ",DC=com"); 

     DirectorySearcher srch = new DirectorySearcher(); 

     // build the LDAP filter from your (CN=strGroup) part that you had 
     // in the constructor, plus that filter you used in the AD tool 
     // to "AND" those together, use the LDAP filter syntax: 
     // (&(condition1)(condition2)) 
     srch.Filter = string.Format("(&(CN={0})(memberOf=CN=AccRght,OU=Groups,OU=P,OU=Server,DC=mydomain,DC=com)(objectCategory=user)(objectClass=user)(l=City))", strGroup); 

     SearchResultCollection coll = srch.FindAll(); 

     foreach (SearchResult rs in coll) 
     { 
      ResultPropertyCollection resultPropColl = rs.Properties; 

      foreach(Object memberColl in resultPropColl["member"]) 
      { 
       DirectoryEntry gpMemberEntry = new DirectoryEntry("LDAP://" + memberColl); 
       System.DirectoryServices.PropertyCollection userProps = gpMemberEntry.Properties; 
       object obVal = userProps["sAMAccountName"].Value; 
       if (null != obVal) 
       { 
        groupMemebers.Add(obVal.ToString()); 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.Write(ex.Message); 
    } 
    return groupMemebers; 
} 

qui devraient s'appliquer ce filtre à votre recherche, par exemple vous devriez maintenant seulement récupérer les utilisateurs pour cette ville spécifique.

Vraiment consulter cet article MSDN Managing Directory Security Principals in the .NET Framework 3.5 - excellente introduction à S.DS.AM! :-)

1

Si vous cherchez réellement un moyen d'énumérer récursivement les membres du groupe, vous devrez peut-être utiliser la version récursive de memberof (que vous pouvez utiliser en utilisant la syntaxe (memberof:1.2.840.113556.1.4.1941:=(cn=Group1,OU=groupsOU,DC=x)))).

Plus d'infos ici: http://msdn.microsoft.com/en-us/library/aa746475(VS.85).aspx