Sintassi del filtro di ricerca

I filtri di ricerca consentono di definire i criteri di ricerca e fornire ricerche più efficienti ed efficaci.

ADSI supporta i filtri di ricerca LDAP definiti in RFC2254. Questi filtri di ricerca sono rappresentati da stringhe Unicode. La tabella seguente elenca alcuni esempi di filtri di ricerca LDAP.

Filtro ricerca Descrizione
"(objectClass=*)" Tutti gli oggetti.
"(&(objectCategory=person)(objectClass=user)(!( cn=andy)))" Tutti gli oggetti utente ma "andy".
"(sn=sm*)" Tutti gli oggetti con un cognome che inizia con "sm".
"(&(objectCategory=person)(objectClass=contact)(|( sn=Smith)(sn=Johnson)))" Tutti i contatti con un cognome uguale a "Smith" o "Johnson".

 

Questi filtri di ricerca usano uno dei formati seguenti.

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

oppure

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

I filtri di ricerca ADSI vengono usati in due modi. Fanno parte del dialetto LDAP per l'invio di query tramite il provider OLE DB. Vengono usate anche con l'interfaccia IDirectorySearch .

Operatori

Nella tabella seguente sono elencati gli operatori di filtro di ricerca usati di frequente.

Operatore logico Descrizione
= Uguale a
~= Approssimativamente uguale a
<= Lessicograficamente minore o uguale a
>= Lessicograficamente maggiore o uguale a
& E
| OPPURE
! NOT

 

Oltre agli operatori precedenti, LDAP definisce due identificatori di oggetto regola (OID) corrispondenti che possono essere usati per eseguire confronti bit per bit di valori numerici. Le regole di corrispondenza hanno la sintassi seguente.

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

"<attribute name>" è lDAPDisplayNamedell'attributo, "<rule OID" è l'OID> per la regola di corrispondenza e "<value>" è il valore da usare per il confronto. Tenere presente che gli spazi non possono essere usati in questa stringa. "<value>" deve essere un numero decimale. Non può essere un numero esadecimale o un nome costante, ad esempio ADS_GROUP_TYPE_edizione StandardCURITY_ENABLED. Per altre informazioni sugli attributi di Active Directory disponibili, vedere Tutti gli attributi.

Nella tabella seguente sono elencati gli ID delle regole corrispondenti implementati da LDAP.

OID regola corrispondente Identificatore stringa (da Ntldap.h) Descrizione
1.2.840.113556.1.4.803 LDAP_MATCHING_RULE_BIT_AND Viene trovata una corrispondenza solo se tutti i bit dell'attributo corrispondono al valore. Questa regola equivale a un operatore AND bit per bit.
1.2.840.113556.1.4.804 LDAP_MATCHING_RULE_BIT_OR Viene trovata una corrispondenza se i bit dell'attributo corrispondono al valore. Questa regola equivale a un operatore OR bit per bit.
1.2.840.113556.1.4.1941 LDAP_MATCHING_RULE_IN_CHAIN Questa regola è limitata ai filtri che si applicano al DN. Si tratta di uno speciale operatore di corrispondenza "esteso" che cammina la catena di ascendenze in oggetti fino alla radice fino a quando non trova una corrispondenza.

 

Nell'esempio seguente la stringa di query cerca gli oggetti gruppo con il flag ADS_GROUP_TYPE_edizione StandardCURITY_ENABLED impostato. Tenere presente che il valore decimale di ADS_GROUP_TYPE_edizione StandardCURITY_ENABLED (0x80000000 = 2147483648) viene usato per il valore di confronto.

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

Il LDAP_MATCHING_RULE_IN_CHAIN è un OID regola corrispondente progettato per fornire un metodo per cercare l'origine di un oggetto. Molte applicazioni che usano AD e AD LDS funzionano in genere con dati gerarchici, ordinati in base alle relazioni padre-figlio. In precedenza, le applicazioni eseguivano l'espansione transitiva del gruppo per determinare l'appartenenza al gruppo, che usava una larghezza di banda di rete eccessiva; applicazioni necessarie per effettuare più round trip per capire se un oggetto è caduto "nella catena" se un collegamento viene attraversato fino alla fine.

Un esempio di tale query è progettato per verificare se un utente "user1" è un membro del gruppo "group1". Impostare la base sul DN (cn=user1, cn=users, dc=x) utente e sull'ambito su basee usare la query seguente.

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

Analogamente, per trovare tutti i gruppi di cui "user1" è membro, impostare la base sul DN del contenitore di gruppi; ad esempio (OU=groupsOU, dc=x) e l'ambito in subtreee usano il filtro seguente.

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

Si noti che quando si usa LDAP_MATCHING_RULE_IN_CHAIN, l'ambito non è limitato, ad esempio base, one-levelo subtree. Alcune di queste query sui sottoalberi possono essere più a elevato utilizzo del processore, ad esempio l'inseguimento di collegamenti con una ventola elevata; ovvero elencare tutti i gruppi di cui un utente è membro. Le ricerche inefficienti registrano i messaggi del registro eventi appropriati, come per qualsiasi altro tipo di query.

Caratteri jolly

È anche possibile aggiungere caratteri jolly e condizioni a un filtro di ricerca LDAP. Negli esempi seguenti vengono mostrate le sottostringhe che possono essere usate per eseguire ricerche nella directory.

Ottenere tutte le voci:

(objectClass=*)

Ottenere voci contenenti "bob" in un punto qualsiasi nel nome comune:

(cn=*bob*)

Ottenere voci con un nome comune maggiore o uguale a "bob":

(cn>='bob')

Ottenere tutti gli utenti con un attributo di posta elettronica:

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

Ottenere tutte le voci dell'utente con un attributo di posta elettronica e un cognome uguale a "smith":

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

Ottenere tutte le voci utente con un nome comune che inizia con "andy", "steve" o "margaret":

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

Ottenere tutte le voci senza un attributo di posta elettronica:

(!(email=*))

La definizione formale del filtro di ricerca è la seguente (da 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>

Il token <attr> è una stringa che rappresenta un attributeType. Il valore> del token <è una stringa che rappresenta un attributoValue il cui formato è definito dal servizio directory sottostante.

Se un <valore> deve contenere l'asterisco (*), la parentesi sinistra (() o la parentesi destra ()), il carattere deve essere preceduto dal carattere di escape barra rovesciata (\).

Caratteri speciali

Se uno dei caratteri speciali seguenti deve essere visualizzato nel filtro di ricerca come valori letterali, deve essere sostituito dalla sequenza di escape elencata.

Carattere ASCII Sostituzione sequenza di escape
* \2a
( \28
) \29
\ \5c
NUL \00
/ \2f

 

Nota

Nei casi in cui viene usato un set di caratteri MultiByte, è necessario usare le sequenze di escape elencate in precedenza se la ricerca viene eseguita da ADO con il dialetto SQL.

 

Inoltre, i dati binari arbitrari possono essere rappresentati usando la sintassi della sequenza di escape codificando ogni byte di dati binari con la barra rovesciata (\) seguita da due cifre esadecimali. Ad esempio, il valore a quattro byte 0x00000004 viene codificato come \00\00\00\04 in una stringa di filtro.

Dialetto LDAP

Dialetto SQL

Ricerca con l'interfaccia IDirectorySearch

Ricerca con oggetti dati ActiveX

Ricerca con OLE DB