web-dev-qa-db-fra.com

Filtre LDAP pour l'attribut vide (vide)

J'ai cherché sur ce sujet, mais je ne trouve que des filtres qui retournent des entrées où un certain attribut n'est pas présent, comme:

(!(manager=*))

Cependant, je veux trouver des entrées où l'attribut est présent, mais a une valeur nulle (c'est-à-dire une chaîne vide/vide). Puis-je le faire en utilisant un filtre LDAP, et si oui, comment?

MODIFIER:

Juste pour confirmer, le filtre ci-dessus trouve des entrées sans l'attribut, mais pas là où l'attribut est vide (chaîne nulle).

Cela dépend-il de l'implémentation LDAP ou quoi?

24
mydoghasworms

À partir de LDAP, il n'y a pas de méthode de requête pour déterminer une chaîne vide.

La meilleure pratique serait de nettoyer vos entrées de données vers LDAP car une valeur vide ou nulle dans LDAP n'a aucune valeur.

Pour déterminer cela, vous devez interroger tous les utilisateurs avec une valeur (manager = *), puis utiliser du code pour déterminer ceux qui étaient un "espace" ou une valeur nulle.

Et comme l'a dit Terry, le stockage d'une valeur vide ou nulle dans un attribut de syntaxe DN est incorrect.

Certaines implémentations de serveur LDAP ne permettent pas de saisir un DN là où l'entrée DN n'existe pas.

Vous pourriez peut-être, si vos DN sont cohérents, utiliser quelque chose comme:

(&(!(manager=cn*))(manager=*))

Cela devrait retourner n'importe quelle valeur de manager où il y avait une valeur pour manager et cela ne commence pas par "cn".

Cependant, certaines implémentations LDAP n'autorisent pas les recherches de sous-chaîne sur les attributs de syntaxe DN.

-jim

20
jwilleke

Recherchez une valeur nulle en utilisant \00

Par exemple:

ldapsearch -D cn=admin -w pass -s sub -b ou=users,dc=acme 'manager=\00' uid manager

Assurez-vous que si vous utilisez la valeur nulle sur la ligne de commande pour utiliser des guillemets autour d'elle pour empêcher le shell du système d'exploitation d'envoyer un caractère nul à LDAP. Par exemple, cela ne fonctionnera pas:

 ldapsearch -D cn=admin -w pass -s sub -b ou=users,dc=acme manager=\00 uid manager

Il existe différents sites qui font référence à cela, ainsi que d'autres caractères spéciaux. Exemple:

7
Matt

Cet article http://technet.Microsoft.com/en-us/library/ee198810.aspx m'a conduit à la solution. Le seul changement est le placement du point d'exclamation.

(!manager=*)

Il semble fonctionner comme souhaité.

6
dved

J'avais besoin de faire une requête pour obtenir tous les groupes avec un ensemble de valeurs managedBy (non vide) et cela a donné quelques bons résultats:

(!(!managedBy=*))
3
user3096378

La définition de schéma d'un attribut détermine si un attribut doit avoir une valeur. Si l'attribut manager dans l'exemple donné est l'attribut défini dans RFC4524 avec OID 0.9.2342.19200300.100.1.10, alors cet attribut a une syntaxe DN. La syntaxe DN est une séquence de noms distinctifs relatifs et ne doit pas être vide . Le filtre donné dans l'exemple permet au serveur d'annuaire LDAP de renvoyer uniquement les entrées qui n'ont pas d'attribut manager au client LDAP dans le résultat de la recherche.

2
Terry Gardner

Sémantiquement, il n'y a pas de différence entre ces cas dans LDAP.

2
user207421