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

129

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 0 ou 1 résultats?

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

Des idées?

Merci

Paul
la source
Voir aussi des questions comme Interroger récursivement l'appartenance à un groupe LDAP
Franklin Piat

Réponses:

177

Vous devriez pouvoir 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 "yourUserName" est bien membre du groupe "CN = YourGroup, OU = Users, DC = YourDomain, DC = com

Essayez de voir si cela fonctionne!

Si vous utilisez C # / VB.Net et System.DirectoryServices, cet extrait de code 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: cela ne testera que les appartenances immédiates aux groupes, et ne testera pas l'appartenance à ce qu'on appelle le "groupe principal" (généralement "cn = Users") de 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 vraiment membre du groupe B ne se reflète pas ici.

Marc

marc_s
la source
1
Essayé, mais ne fonctionne toujours pas pour moi. Doit-il être «OU = Users» ou «OU = Groups» dans la clause memberOf?
paul
3
Voici ma requête: (& (objectClass = person) (sAMAccountName = USERID) (memberof = 'CN = SPSAdmins, OU = Groups, OU = MYTOWN, OU = Germany, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) Le DN est vraiment aussi long. Je conviens que cela devrait fonctionner. Merci pour ton aide!
paul
3
Sur un coup de tête, j'ai supprimé les guillemets simples après memberof et j'obtiens maintenant un résultat! Merci
paul
2
Bonne réponse. mais il faut souligner que cela ne fonctionnera que dans les serveurs LDAP qui maintiennent un attribut 'memberOf'. La technique la plus générale consiste à récupérer l' objet groupe et à examiner ses attributs uniquesMember, roleOccupant, etc. pour le DN de l'utilisateur, en fonction du schéma utilisé par l'objet groupe.
Marquis of Lorne
1
Les noms et les valeurs des attributs LDAP @Gunslinger ne sont pas sensibles à la casse, pas plus que les DN, mais AD a ses propres règles ...
Marquis of Lorne
35

Si vous utilisez OpenLDAP (c'est-à-dire slapd) qui est courant sur les serveurs Linux, alors vous devez activer la superposition memberof pour pouvoir correspondre à un filtre utilisant l'attribut (memberOf = XXX).

De plus, une fois que vous activez la superposition, elle ne met pas à jour les attributs memberOf des groupes existants (vous devrez supprimer les groupes existants et les rajouter). Si vous avez activé la superposition pour commencer, lorsque la base de données était vide, vous devriez être OK.

Telford Tendys
la source
8
Un lien vers une page qui explique comment activer la superposition de membre serait utile, je suppose.
Gokhan Sari
5
Tutoriel qui a fonctionné pour moi: schenkels.nl/2013/03/… @Telford Tendrys, mec, vous m'avez sauvé la vie avec cet avis sur les groupes préexistants. Merci beaucoup!
ŁukaszBachman
21

J'ajouterais encore une chose à la réponse de Marc: l'attribut memberOf ne peut pas contenir de jokers, 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".

Bill Brinkley
la source
Merci pour cette information. J'ai essayé de faire ce que vous dites ne peut pas être fait. Comment puis-je faire cela avec PHP? Est-il possible d'avoir le même résultat d'une autre manière? pour trouver tous les groupes, commencez par SPS et puis peu importe ... Je peux toujours tout attraper et boucler mon tableau, puis faire correspondre le CN que je veux, mais je préfère simplement le chercher si possible.
ODelibalta
15

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 de bureaux, 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, ne demandez que 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**
gpayne_007
la source