Filtros LDAP: 20 ejemplos para Active Directory

La mayoría de las consultas LDAP contra Active Directory siguen unos pocos patrones. Aquí están los 20 más habituales, cada uno con una breve explicación y un clic para adaptarlo en el constructor de filtros.

Cómo usar los filtros

# PowerShell (RSAT, módulo 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

# herramientas integradas de Windows
dsquery * -filter "(&(objectCategory=person)(objectClass=user)(mail=*))" -attr sAMAccountName mail

El filtro define qué se busca. Dónde se busca (todo el dominio o solo una OU) lo fija la base de búsqueda (-b o -SearchBase).

Usuarios

1. Todas las cuentas de usuario

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

objectCategory=person junto con objectClass=user devuelve solo usuarios reales, ni contactos ni equipos (en AD los equipos también son objetos user). Abrir en el constructor ›

2. Usuarios activos

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

El bit 2 de userAccountControl significa «deshabilitado». El número largo es la regla del Y bit a bit; negado da «no deshabilitado». Abrir en el constructor ›

3. Usuarios deshabilitados

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

Lo mismo sin negación, útil para hacer limpieza. Abrir en el constructor ›

4. Cuentas bloqueadas

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

lockoutTime mayor que 0 significa que la cuenta se bloqueó. El valor se mantiene incluso tras la duración del bloqueo, hasta el siguiente inicio de sesión. La lista puede contener más cuentas de las que están bloqueadas ahora mismo. Abrir en el constructor ›

5. La contraseña nunca caduca

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

Bit 65536 (DONT_EXPIRE_PASSWORD). Un clásico de las auditorías. Abrir en el constructor ›

6. Debe cambiar la contraseña en el próximo inicio

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

pwdLastSet=0 es exactamente ese estado. Abrir en el constructor ›

7. Miembros de un grupo (directos)

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

El grupo debe indicarse con su DN completo. Los comodines como CN=VPN* no funcionan con memberOf. Abrir en el constructor ›

8. Miembros de un grupo incluidos los grupos anidados

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

La regla 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) resuelve grupos anidados. Más lenta en directorios grandes. Abrir en el constructor ›

9. Usuarios con dirección de correo

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

=* significa «el atributo existe». Abrir en el constructor ›

10. Usuarios sin dirección de correo

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

Negado: falta el atributo. Abrir en el constructor ›

11. Búsqueda como en la libreta de direcciones

(anr=Müller)

anr (Ambiguous Name Resolution) es una particularidad de AD y busca a la vez en apellido, nombre, nombre para mostrar, nombre de inicio de sesión y más campos. Abrir en el constructor ›

12. Inicio de sesión por usuario o UPN

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

El filtro típico de aplicaciones con login LDAP. La aplicación sustituye {user} por la entrada, que debe escaparse según la RFC 4515; si no, es posible la inyección LDAP. Abrir en el constructor ›

13. Sin iniciar sesión desde hace tiempo

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

lastLogonTimestamp es una marca de tiempo de Windows (pasos de 100 ns desde 1601). El número del ejemplo equivale al 1 de enero de 2026. El atributo solo se actualiza cada 9–14 días aprox.; sirve para «sin iniciar sesión desde hace meses», no para «desde ayer». Abrir en el constructor ›

14. Creados desde una fecha

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

whenCreated usa el formato AAAAMMDDHHMMSS.0Z (UTC). Abrir en el constructor ›

15. Cuentas con service principal name

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

Las cuentas de usuario con SPN son cuentas de servicio y objetivo del Kerberoasting. Deberían tener contraseñas largas y aleatorias o ser gMSA. Abrir en el constructor ›

16. Cuentas protegidas (adminCount)

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

adminCount=1 marca cuentas que son o fueron miembros de un grupo privilegiado. Útil para encontrar derechos de administrador olvidados. Abrir en el constructor ›

Equipos y grupos

17. Todos los equipos

(objectCategory=computer)

Cuentas de equipo del dominio. Abrir en el constructor ›

18. Controladores de dominio

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

Solo los controladores de dominio tienen el bit 8192 (SERVER_TRUST_ACCOUNT). Abrir en el constructor ›

19. Servidores Windows

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

Los comodines funcionan en atributos de texto normales como operatingSystem. Abrir en el constructor ›

20. Grupos de seguridad vacíos

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

El bit 2147483648 de groupType identifica los grupos de seguridad; !(member=*) significa «sin miembros». Los miembros por grupo principal (p. ej. Usuarios del dominio) no cuentan aquí. Abrir en el constructor ›

Consejos para filtros rápidos y seguros

FAQ

¿Por qué mi filtro encuentra equipos si busco objectClass=user?

En Active Directory las cuentas de equipo heredan de la clase user. objectCategory=person las excluye.

¿Cómo encuentro todos los grupos de un usuario, anidados incluidos?

Con la regla IN_CHAIN al revés: (member:1.2.840.113556.1.4.1941:=CN=Max Muster,OU=Users,DC=example,DC=com) aplicado a grupos.

¿Por qué la consulta solo devuelve 1000 resultados?

Active Directory limita por defecto las respuestas a 1000 entradas por página. La herramienta debe paginar; Get-ADUser lo hace solo, ldapsearch con -E pr=1000/noprompt.

¿Puedo buscar contraseñas con un filtro?

No. Las contraseñas no se pueden leer ni buscar. Solo se puede filtrar por metadatos como pwdLastSet.