Filtres LDAP : 20 exemples pour Active Directory

La plupart des requêtes LDAP sur Active Directory suivent une poignée de modèles. Voici les 20 plus courants, chacun avec une courte explication et un clic pour l’adapter dans le constructeur de filtres.

Utiliser les filtres

# PowerShell (RSAT, module ActiveDirectory)
Get-ADUser -LDAPFilter '(&(objectCategory=person)(objectClass=user)(mail=*))' -Properties mail

# Linux/macOS
ldapsearch -H ldaps://dc1.example.com -D 'svc-ldap@example.com' -W \
  -b 'DC=example,DC=com' '(&(objectCategory=person)(objectClass=user)(mail=*))' sAMAccountName mail

# outils Windows intégrés
dsquery * -filter "(&(objectCategory=person)(objectClass=user)(mail=*))" -attr sAMAccountName mail

Le filtre définit ce qu’on cherche. Où on cherche (tout le domaine ou une seule OU) dépend de la base de recherche (-b ou -SearchBase).

Utilisateurs

1. Tous les comptes utilisateurs

(&(objectCategory=person)(objectClass=user))

objectCategory=person avec objectClass=user ne renvoie que de vrais utilisateurs, ni contacts ni ordinateurs (dans AD, les ordinateurs sont aussi des objets user). Ouvrir dans le constructeur ›

2. Utilisateurs actifs

(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))

Le bit 2 de userAccountControl signifie « désactivé ». Le long nombre est la règle du ET bit à bit ; inversé, cela donne « non désactivé ». Ouvrir dans le constructeur ›

3. Utilisateurs désactivés

(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))

Pareil sans négation, pratique pour faire le ménage. Ouvrir dans le constructeur ›

4. Comptes verrouillés

(&(objectCategory=person)(objectClass=user)(lockoutTime>=1))

lockoutTime supérieur à 0 signifie que le compte a été verrouillé. La valeur reste même après la durée de verrouillage, jusqu’à la prochaine connexion. La liste peut donc contenir plus de comptes que ceux réellement verrouillés. Ouvrir dans le constructeur ›

5. Mot de passe qui n’expire jamais

(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=65536))

Bit 65536 (DONT_EXPIRE_PASSWORD). Un classique des audits. Ouvrir dans le constructeur ›

6. Changement de mot de passe à la prochaine connexion

(&(objectCategory=person)(objectClass=user)(pwdLastSet=0))

pwdLastSet=0 correspond exactement à cet état. Ouvrir dans le constructeur ›

7. Membres d’un groupe (direct)

(&(objectCategory=person)(objectClass=user)(memberOf=CN=VPN-Users,OU=Groups,DC=example,DC=com))

Le groupe doit être donné avec son DN complet. Les jokers comme CN=VPN* ne fonctionnent pas avec memberOf. Ouvrir dans le constructeur ›

8. Membres d’un groupe, groupes imbriqués compris

(&(objectCategory=person)(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=CN=VPN-Users,OU=Groups,DC=example,DC=com))

La règle 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) résout les groupes imbriqués. Plus lent dans les grands annuaires. Ouvrir dans le constructeur ›

9. Utilisateurs avec adresse e-mail

(&(objectCategory=person)(objectClass=user)(mail=*))

=* signifie « l’attribut existe ». Ouvrir dans le constructeur ›

10. Utilisateurs sans adresse e-mail

(&(objectCategory=person)(objectClass=user)(!(mail=*)))

Inversé : l’attribut manque. Ouvrir dans le constructeur ›

11. Recherche comme dans le carnet d’adresses

(anr=Müller)

anr (Ambiguous Name Resolution) est une particularité d’AD et cherche à la fois dans le nom, le prénom, le nom affiché, l’identifiant et d’autres champs. Ouvrir dans le constructeur ›

12. Connexion par identifiant ou UPN

(&(objectCategory=person)(objectClass=user)(|(sAMAccountName={user})(userPrincipalName={user})))

Le filtre typique des applications avec connexion LDAP. L’application remplace {user} par la saisie, qui doit être échappée selon la RFC 4515, sinon une injection LDAP est possible. Ouvrir dans le constructeur ›

13. Pas connecté depuis longtemps

(&(objectCategory=person)(objectClass=user)(lastLogonTimestamp<=134116992000000000))

lastLogonTimestamp est un horodatage Windows (pas de 100 ns depuis 1601). Le nombre de l’exemple correspond au 1er janvier 2026. L’attribut n’est mis à jour que tous les 9 à 14 jours environ ; il convient pour « pas connecté depuis des mois », pas pour « depuis hier ». Ouvrir dans le constructeur ›

14. Créés depuis une date

(&(objectCategory=person)(objectClass=user)(whenCreated>=20260101000000.0Z))

whenCreated est au format AAAAMMJJHHMMSS.0Z (UTC). Ouvrir dans le constructeur ›

15. Comptes avec service principal name

(&(objectCategory=person)(objectClass=user)(servicePrincipalName=*))

Les comptes utilisateurs avec SPN sont des comptes de service et la cible du Kerberoasting. Ils devraient avoir des mots de passe longs et aléatoires ou être des gMSA. Ouvrir dans le constructeur ›

16. Comptes protégés (adminCount)

(&(objectCategory=person)(objectClass=user)(adminCount=1))

adminCount=1 marque les comptes qui sont ou ont été membres d’un groupe privilégié. Utile pour retrouver des droits d’admin oubliés. Ouvrir dans le constructeur ›

Ordinateurs et groupes

17. Tous les ordinateurs

(objectCategory=computer)

Les comptes d’ordinateur du domaine. Ouvrir dans le constructeur ›

18. Contrôleurs de domaine

(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=8192))

Seuls les contrôleurs de domaine ont le bit 8192 (SERVER_TRUST_ACCOUNT). Ouvrir dans le constructeur ›

19. Serveurs Windows

(&(objectCategory=computer)(operatingSystem=*Server*))

Les jokers fonctionnent sur les attributs texte ordinaires comme operatingSystem. Ouvrir dans le constructeur ›

20. Groupes de sécurité vides

(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648)(!(member=*)))

Le bit 2147483648 de groupType désigne les groupes de sécurité ; !(member=*) signifie « aucun membre ». Les membres via le groupe principal (p. ex. Utilisateurs du domaine) ne comptent pas ici. Ouvrir dans le constructeur ›

Conseils pour des filtres rapides et sûrs

FAQ

Pourquoi mon filtre trouve-t-il des ordinateurs alors que je cherche objectClass=user ?

Dans Active Directory, les comptes d’ordinateur héritent de la classe user. objectCategory=person les exclut.

Comment trouver tous les groupes d’un utilisateur, imbriqués compris ?

Avec la règle IN_CHAIN dans l’autre sens : (member:1.2.840.113556.1.4.1941:=CN=Max Muster,OU=Users,DC=example,DC=com) appliqué aux groupes.

Pourquoi la requête ne renvoie-t-elle que 1000 résultats ?

Active Directory limite par défaut les réponses à 1000 entrées par page. L’outil doit utiliser la pagination ; Get-ADUser le fait automatiquement, ldapsearch avec -E pr=1000/noprompt.

Puis-je chercher un mot de passe avec un filtre ?

Non. Les mots de passe ne sont ni lisibles ni recherchables. On ne peut filtrer que sur des métadonnées comme pwdLastSet.