Comment écrire une requête LDAP pour tester si l'utilisateur est membre d'un groupe?

je veux écrire une requête LDAP qui teste si un utilisateur (sAMAccountName) est membre d'un groupe particulier. Est-il possible de faire cela pour que j'obtienne des résultats 0 ou 1?

je suppose que je peux obtenir tous les groupes pour l'utilisateur et tester chacun pour une correspondance mais je me demandais si je pouvais l'empaqueter dans une expression LDAP.

des idées?

Merci

105
demandé sur paul 2009-06-23 16:46:50

4 réponses

Vous devriez être en mesure de créer une requête avec ce filtre ici:

(&(objectClass=user)(sAMAccountName=yourUserName)
  (memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))

et lorsque vous exécutez cela contre votre serveur LDAP, si vous obtenez un résultat, votre utilisateur "votrenom" est bien un membre du groupe "CN=Votregroupe, OU=Users, DC=votredomaine, DC =com

essayez de voir si cela fonctionne!

si vous utilisez C# / VB.Net et système.DirectoryServices, cet extrait devrait faire l'affaire:

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://dc=yourcompany,dc=com");

DirectorySearcher srch = new DirectorySearcher(rootEntry);
srch.SearchScope = SearchScope.Subtree;

srch.Filter = "(&(objectClass=user)(sAMAccountName=yourusername)(memberOf=CN=yourgroup,OU=yourOU,DC=yourcompany,DC=com))";

SearchResultCollection res = srch.FindAll();

if(res == null || res.Count <= 0) {
    Console.WriteLine("This user is *NOT* member of that group");
} else {
    Console.WriteLine("This user is INDEED a member of that group");
}

Mot de mise en garde: ceci ne testera que pour les adhésions de groupe immédiates, et il ne testera pas pour l'adhésion dans ce qui est appelé le "groupe principal" (habituellement "cn=utilisateurs") dans votre domaine. Il ne traite pas les adhésions imbriquées, par exemple L'utilisateur A est membre du groupe a qui est membre du Groupe B - que le fait que L'utilisateur A est vraiment membre du Groupe B ne se reflète pas ici.

Marc

139
répondu marc_s 2014-02-24 22:45:21

si vous utilisez OpenLDAP (c'est-à-dire slapd), ce qui est courant sur les serveurs Linux, alors vous devez permettre au memberof overlay de pouvoir s'apparier à un filtre en utilisant l'attribut (memberOf=XXX).

aussi, une fois que vous activez la superposition, elle ne met pas à jour les attributs memberOf pour les groupes existants (vous devrez supprimer les groupes existants et les ajouter à nouveau). Si vous avez activé la superposition au début, quand la base de données était vide, alors vous devriez être OK.

29
répondu Telford Tendys 2011-11-01 04:25:22

J'ajouterais encore une chose à la réponse de Marc: l'attribut memberOf ne peut pas contenir de caractères génériques, donc vous ne pouvez pas dire quelque chose comme" memberof=CN=SPS*", et vous attendre à ce qu'il trouve tous les groupes qui commencent par"SPS".

19
répondu Bill Brinkley 2011-02-23 22:28:04

vous devez définir votre base de requête au DN de l'utilisateur en question, puis définir votre filtre au DN du groupe dont vous vous demandez s'il est membre. Pour voir si jdoe est un membre du groupe office alors votre requête ressemblera à quelque chose comme ceci:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host '(memberof=cn=officegroup,dc=example,dc=local)'

si vous voulez voir tous les groupes dont il est membre, demandez seulement l'attribut 'memberof' dans votre recherche, comme ceci:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
9
répondu gpayne_007 2014-08-21 22:58:08