web-dev-qa-db-fra.com

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 le faire pour obtenir 0 ou 1 résultat?

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 l'intégrer dans une expression LDAP.

Des idées?

Merci

118
paul

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 cette opération sur votre serveur LDAP, si vous obtenez un résultat, votre utilisateur "yourUserName" est bien membre du groupe "CN = Votre groupe, OU = Utilisateurs, 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");
}

Mise en garde: ceci ne testera que pour les appartenances immédiates à un groupe, et non pour l'appartenance à ce qu'on appelle le "groupe principal" (généralement "cn = Utilisateurs") 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 réellement un membre du groupe B ne sera pas reflété ici.

Marc

159
marc_s

Si vous utilisez OpenLDAP (c'est-à-dire slapd) qui est commun sur les serveurs Linux, vous devez activer le membre de superposition pour qu'il puisse correspondre à un filtre en utilisant l'attribut (memberOf = XXX).

En outre, une fois que vous avez activé la superposition, les attributs memberOf des groupes existants ne sont pas mis à jour (vous devez supprimer les groupes existants et les rajouter à nouveau). Si vous avez activé la superposition pour commencer, lorsque la base de données était vide, tout devrait bien se passer.

34
Telford Tendys

J'ajouterais une dernière 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 attendez-vous à ce qu'il trouve tous les groupes commençant par "SPS".

20
Bill Brinkley

Vous devez définir votre base de requête sur le DN de l'utilisateur en question, puis votre filtre sur le DN du groupe auquel vous vous demandez s'ils appartiennent. 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, demandez simplement 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**
10
gpayne_007