Sintaxis de filtro de búsqueda

Los filtros de búsqueda permiten definir criterios de búsqueda y proporcionar búsquedas más eficaces y eficaces.

ADSI admite los filtros de búsqueda LDAP como se define en RFC2254. Estos filtros de búsqueda se representan mediante cadenas Unicode. En la tabla siguiente se enumeran algunos ejemplos de filtros de búsqueda LDAP.

Filtro de búsqueda Descripción
"(objectClass=*)" Todos los objetos.
"((&objectCategory=person)(objectClass=user)(!( cn=andy)))" Todos los objetos de usuario pero "andy".
"(sn=sm*)" Todos los objetos con un apellido que comienza por "sm".
"((&objectCategory=person)(objectClass=contact)(|( sn=Smith)(sn=Johnson)))" Todos los contactos con un apellido igual a "Smith" o "Johnson".

 

Estos filtros de búsqueda usan uno de los siguientes formatos.

<filter>=(<attribute><operator><value>)

or

<filter>=(<operator><filter1><filter2>)

Los filtros de búsqueda ADSI se usan de dos maneras. Forman parte del dialecto LDAP para enviar consultas a través del proveedor OLE DB. También se usan con la interfaz IDirectorySearch .

Operadores

En la tabla siguiente se enumeran los operadores de filtro de búsqueda usados con frecuencia.

Operador lógico Descripción
= Igual a
~= Aproximadamente igual a
<= Lexicográficamente menor o igual que
>= Lexicográficamente mayor o igual que
& AND
| O BIEN
! NOT

 

Además de los operadores anteriores, LDAP define dos identificadores de objeto de regla coincidentes (OID) que se pueden usar para realizar comparaciones bit a bit de valores numéricos. Las reglas de coincidencia tienen la siguiente sintaxis.

<attribute name>:<matching rule OID>:=<value>

"<attribute name>" es el lDAPDisplayName del atributo, "<rule OID" es el OID> para la regla de coincidencia y "<value>" es el valor que se va a usar para la comparación. Tenga en cuenta que los espacios no se pueden usar en esta cadena. "<value>" debe ser un número decimal; no puede ser un número hexadecimal ni un nombre constante como ADS_GROUP_TYPE_SECURITY_ENABLED. Para obtener más información sobre los atributos de Active Directory disponibles, vea Todos los atributos.

En la tabla siguiente se enumeran los OID de regla coincidentes implementados por LDAP.

OID de regla de coincidencia Identificador de cadena (de Ntldap.h) Descripción
1.2.840.113556.1.4.803 LDAP_MATCHING_RULE_BIT_AND Solo se encuentra una coincidencia si todos los bits del atributo coinciden con el valor. Esta regla es equivalente a un operador AND bit a bit.
1.2.840.113556.1.4.804 LDAP_MATCHING_RULE_BIT_OR Se encuentra una coincidencia si alguno de los bits del atributo coincide con el valor. Esta regla es equivalente a un operador OR bit a bit.
1.2.840.113556.1.4.1941 LDAP_MATCHING_RULE_IN_CHAIN Esta regla se limita a los filtros que se aplican al DN. Se trata de un operador de coincidencia especial "extendido" que recorre la cadena de linaje en objetos hasta que encuentra una coincidencia.

 

En el ejemplo siguiente, la cadena de consulta busca objetos de grupo que tengan establecida la marca ADS_GROUP_TYPE_SECURITY_ENABLED . Tenga en cuenta que el valor decimal de ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000 = 2147483648) se usa para el valor de comparación.

(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648))

El LDAP_MATCHING_RULE_IN_CHAIN es un OID de regla coincidente diseñado para proporcionar un método para buscar la herencia de un objeto. Muchas aplicaciones que usan AD y AD LDS suelen trabajar con datos jerárquicos, que se ordenan por relaciones de elementos primarios y secundarios. Anteriormente, las aplicaciones realizaban la expansión de grupos transitivas para averiguar la pertenencia a grupos, que usaba demasiado ancho de banda de red; las aplicaciones necesarias para realizar varios recorridos de ida y vuelta para averiguar si un objeto cayó "en la cadena" si se atraviesa un vínculo hasta el final.

Un ejemplo de esta consulta es uno diseñado para comprobar si un usuario "user1" es miembro del grupo "group1". Establecería la base en el DN (cn=user1, cn=users, dc=x) de usuario y el ámbito en basey usaría la consulta siguiente.

(memberof:1.2.840.113556.1.4.1941:=cn=Group1,OU=groupsOU,DC=x)

Del mismo modo, para buscar todos los grupos de los que "user1" es miembro, establezca la base en el DN del contenedor de grupos; por ejemplo (OU=groupsOU, dc=x) , y el ámbito de subtree, y use el siguiente filtro.

(member:1.2.840.113556.1.4.1941:=cn=user1,cn=users,DC=x)

Tenga en cuenta que al usar LDAP_MATCHING_RULE_IN_CHAIN, el ámbito no está limitado, puede ser base, one-levelo subtree. Algunas de estas consultas en subárboles pueden ser más intensivas para el procesador, como buscar vínculos con un ventilador elevado; es decir, enumerar todos los grupos de los que un usuario es miembro. Las búsquedas ineficaces registrarán los mensajes de registro de eventos adecuados, como con cualquier otro tipo de consulta.

Caracteres comodín

También puede agregar caracteres comodín y condiciones a un filtro de búsqueda LDAP. En los ejemplos siguientes se muestran subcadenas que se pueden usar para buscar en el directorio.

Obtenga todas las entradas:

(objectClass=*)

Obtenga entradas que contengan "bob" en algún lugar del nombre común:

(cn=*bob*)

Obtenga entradas con un nombre común mayor o igual que "bob":

(cn>='bob')

Obtenga todos los usuarios con un atributo de correo electrónico:

(&(objectClass=user)(email=*))

Obtenga todas las entradas de usuario con un atributo de correo electrónico y un apellido igual a "smith":

(&(sn=smith)(objectClass=user)(email=*))

Obtenga todas las entradas de usuario con un nombre común que comience por "andy", "steve" o "margaret":

(&(objectClass=user)(| (cn=andy*)(cn=steve*)(cn=margaret*)))

Obtenga todas las entradas sin un atributo de correo electrónico:

(!(email=*))

La definición formal del filtro de búsqueda es la siguiente (de RFC 2254):

<filter> ::= '(' <filtercomp> ')'
<filtercomp> ::= <and> | <or> | <not> | <item>
<and> ::= '&' <filterlist>
<or> ::= '|' <filterlist>
<not> ::= '!' <filter>
<filterlist> ::= <filter> | <filter> <filterlist>
<item>::= <simple> | <present> | <substring>
<simple> ::= <attr> <filtertype> <value>
<filtertype> ::= <equal> | <approx> | <ge> | <le>
<equal> ::= '='
<approx> ::= '~='
<ge> ::= '>='
<le> ::= '<='
<present> ::= <attr> '=*'
<substring> ::= <attr> '=' <initial> <any> <final>
<initial> ::= NULL | <value><any> ::= '*' <starval>
<starval> ::= NULL | <value>'*' <starval>
<final> ::= NULL | <value>

El token <attr> es una cadena que representa un AttributeType. El valor> del token <es una cadena que representa un AttributeValue cuyo formato está definido por el servicio de directorio subyacente.

Si un <valor> debe contener el carácter asterisco (*), paréntesis izquierdo (() o paréntesis derecho ()), el carácter debe ir precedido por el carácter de escape de barra diagonal inversa (\).

Caracteres especiales

Si alguno de los siguientes caracteres especiales debe aparecer en el filtro de búsqueda como literales, debe reemplazarse por la secuencia de escape enumerada.

Carácter ASCII Sustituto de secuencia de escape
* \2a
( \28
) \29
\ \5c
NUL \00
/ \2f

 

Nota:

En los casos en los que se usa un juego de caracteres multibyte, las secuencias de escape enumeradas anteriormente deben usarse si ADO realiza la búsqueda con el dialecto SQL.

 

Además, los datos binarios arbitrarios se pueden representar mediante la sintaxis de secuencia de escape mediante la codificación de cada byte de datos binarios con la barra diagonal inversa (\) seguida de dos dígitos hexadecimales. Por ejemplo, el valor de cuatro bytes 0x00000004 se codifica como \00\00\00\04 en una cadena de filtro.

Dialecto LDAP

Dialecto SQL

Buscar con la interfaz IDirectorySearch

Búsqueda con objetos de datos ActiveX

Búsqueda con OLE DB