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
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
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.
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".
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**