121 votes

Comment écrire une requête LDAP pour tester si un 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 le faire de manière à obtenir soit 0 soit 1 enregistrement de résultat ?

Je suppose que je peux obtenir tous les groupes de l'utilisateur et tester chacun d'eux pour trouver une correspondance, mais je me demandais si je pouvais regrouper tout cela dans une seule expression LDAP.

Des idées ?

Merci

165voto

marc_s Points 321990

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 sur votre serveur LDAP, si vous obtenez un résultat, votre utilisateur "votreNomUtilisateur" est bien membre du groupe "CN=VotreGroupe,OU=Utilisateurs,DC=VotreDomaine,DC=com".

Essayez et voyez si cela fonctionne !

Si vous utilisez C# / VB.Net et System.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");
}

Attention : cette méthode ne teste que l'appartenance à des groupes immédiats, et ne teste pas l'appartenance à ce que l'on appelle le "groupe primaire" (généralement "cn=Users") dans votre domaine. Il ne gère pas les appartenances imbriquées, par exemple, l'utilisateur A est membre du groupe A qui est membre du groupe B - le fait que l'utilisateur A soit également membre du groupe B n'est pas reflété ici.

Marc

35voto

Telford Tendys Points 111

Si vous utilisez OpenLDAP (c.-à-d. slapd), qui est courant sur les serveurs Linux, vous devez activer le recouvrement memberof pour pouvoir effectuer une correspondance avec un filtre utilisant l'attribut (memberOf=XXX).

En outre, une fois que vous avez activé la superposition, elle ne met pas à jour les attributs memberOf des groupes existants (vous devrez supprimer les groupes existants et les ajouter à nouveau). Si vous avez activé la superposition au départ, lorsque la base de données était vide, tout devrait bien se passer.

20voto

Bill Brinkley Points 111

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

10voto

gpayne_007 Points 11

Vous devez définir votre base de requête sur le DN de l'utilisateur en question, puis définir votre filtre sur le DN du groupe dont vous vous demandez s'il est membre. Pour voir si jdoe est membre du groupe office, votre requête ressemblera à 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, il suffit de demander uniquement 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**

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X