Sintaxe do filtro de pesquisa
Os filtros de pesquisa permitem que você defina critérios de pesquisa e forneça pesquisas mais eficientes e eficazes.
O ADSI suporta os filtros de pesquisa LDAP conforme definido no RFC2254. Esses filtros de pesquisa são representados por cadeias de caracteres Unicode. A tabela a seguir lista alguns exemplos de filtros de pesquisa LDAP.
Filtro de pesquisa | Descrição |
---|---|
"(objectClass=*)" | Todos os objetos. |
"(&(objectCategory=person)(objectClass=user)(!( cn=andy)))" | Todos os objetos do usuário, exceto "andy". |
"(sn=sm*)" | Todos os objetos com um sobrenome que começa com "sm". |
"(&(objectCategory=pessoa)(objectClass=contato)(|( sn=Smith)(sn=Johnson)))" | Todos os contatos com sobrenome igual a "Smith" ou "Johnson". |
Esses filtros de pesquisa usam um dos seguintes formatos.
<filter>=(<attribute><operator><value>)
or
<filter>=(<operator><filter1><filter2>)
Os filtros de pesquisa ADSI são usados de duas maneiras. Eles fazem parte do dialeto LDAP para enviar consultas por meio do provedor OLE DB. Eles também são usados com a interface IDirectorySearch.
Operadores
A tabela a seguir lista os operadores de filtro de pesquisa usados com frequência.
Operador lógico | Descrição |
---|---|
= | Igual a |
~= | Aproximadamente igual a |
<= | Lexicograficamente menor ou igual a |
>= | Lexicograficamente maior ou igual a |
& | AND |
| | OR |
! | NOT |
Além dos operadores acima, o LDAP define dois identificadores de objeto de regra (OIDs) correspondentes que podem ser usados para executar comparações bit a bit de valores numéricos. As regras de correspondência têm a seguinte sintaxe.
<attribute name>:<matching rule OID>:=<value>
"<nome> do atributo" é o lDAPDisplayName do atributo, "rule OID>" é o OID para a regra correspondente e "value>"<< é o valor a ser usado para comparação. Lembre-se de que os espaços não podem ser usados nessa cadeia de caracteres. "<Valor>" deve ser um número decimal, não pode ser um número hexadecimal ou um nome constante como ADS_GROUP_TYPE_SECURITY_ENABLED. Para obter mais informações sobre os atributos disponíveis do Active Directory, consulte Todos os atributos.
A tabela a seguir lista os OIDs de regra correspondentes implementados pelo LDAP.
Regra de correspondência OID | Identificador de cadeia de caracteres (de Ntldap.h) | Descrição |
---|---|---|
1.2.840.113556.1.4.803 | LDAP_MATCHING_RULE_BIT_AND | Uma correspondência será encontrada somente se todos os bits do atributo corresponderem ao valor. Essa regra é equivalente a um operador AND bit a bit. |
1.2.840.113556.1.4.804 | LDAP_MATCHING_RULE_BIT_OR | Uma correspondência será encontrada se algum bit do atributo corresponder ao valor. Essa regra é equivalente a um operador OR bit a bit. |
1.2.840.113556.1.4.1941 | LDAP_MATCHING_RULE_IN_CHAIN | Essa regra é limitada aos filtros que se aplicam ao DN. Este é um operador de correspondência "estendido" especial que percorre a cadeia de ancestralidade em objetos até a raiz até encontrar uma correspondência. |
O exemplo de sequência de caracteres de consulta a seguir procura objetos de grupo que têm o sinalizador ADS_GROUP_TYPE_SECURITY_ENABLED definido. Lembre-se de que o valor decimal de ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000 = 2147483648) é usado para o valor de comparação.
(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648))
O LDAP_MATCHING_RULE_IN_CHAIN é uma regra de correspondência OID que é projetado para fornecer um método para procurar a ancestralidade de um objeto. Muitos aplicativos que usam o AD e o AD LDS geralmente trabalham com dados hierárquicos, que são ordenados por relações pai-filho. Anteriormente, os aplicativos realizavam expansão de grupo transitivo para descobrir a associação ao grupo, que usava muita largura de banda de rede; Os aplicativos precisavam fazer várias viagens de ida e volta para descobrir se um objeto caiu "na cadeia" se um elo for atravessado até o final.
Um exemplo de tal consulta é aquela projetada para verificar se um usuário "user1" é membro do grupo "group1". Você definiria a base para o DN (cn=user1, cn=users, dc=x)
do usuário e o escopo como base
, e usaria a consulta a seguir.
(memberof:1.2.840.113556.1.4.1941:=cn=Group1,OU=groupsOU,DC=x)
Da mesma forma, para localizar todos os grupos dos quais "user1" é membro, defina a base para o DN do contêiner de grupos; por exemplo (OU=groupsOU, dc=x)
e o escopo para subtree
, e use o filtro a seguir.
(member:1.2.840.113556.1.4.1941:=cn=user1,cn=users,DC=x)
Observe que, ao usar LDAP_MATCHING_RULE_IN_CHAIN, o escopo não é limitado — pode ser base
, one-level
ou subtree
. Algumas dessas consultas em subárvores podem ser mais intensivas no processador, como perseguir links com uma distribuição alta; ou seja, listar todos os grupos dos quais um usuário é membro. Pesquisas ineficientes registrarão mensagens de log de eventos apropriadas, como acontece com qualquer outro tipo de consulta.
Curingas
Você também pode adicionar curingas e condições a um filtro de pesquisa LDAP. Os exemplos a seguir mostram subcadeias de caracteres que podem ser usadas para pesquisar o diretório.
Obter todas as entradas:
(objectClass=*)
Obtenha entradas contendo "bob" em algum lugar no nome comum:
(cn=*bob*)
Obter entradas com um nome comum maior ou igual a "bob":
(cn>='bob')
Obtenha todos os usuários com um atributo de email:
(&(objectClass=user)(email=*))
Obtenha todas as entradas de usuário com um atributo de e-mail e um sobrenome igual a "smith":
(&(sn=smith)(objectClass=user)(email=*))
Obtenha todas as entradas de usuário com um nome comum que começa com "andy", "steve" ou "margaret":
(&(objectClass=user)(| (cn=andy*)(cn=steve*)(cn=margaret*)))
Obter todas as entradas sem um atributo de e-mail:
(!(email=*))
A definição formal do filtro de pesquisa é a seguinte (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>
O token <attr> é uma cadeia de caracteres que representa um AttributeType. O valor> do token <é uma cadeia de caracteres que representa um AttributeValue cujo formato é definido pelo serviço de diretório subjacente.
Se um <valor> deve conter o caractere asterisco (*), parêntese esquerdo (() ou parêntese direito ()) , o caractere deve ser precedido pelo caractere de escape de barra invertida (\).
Caracteres Especiais
Se qualquer um dos seguintes caracteres especiais deve aparecer no filtro de pesquisa como literais, eles devem ser substituídos pela sequência de escape listada.
Caractere ASCII | Substituto da sequência de escape |
---|---|
* | \2a |
( | \28 |
) | \29 |
\ | \5c |
NUL | \00 |
/ | \2f |
Observação
Nos casos em que um conjunto de caracteres MultiByte está sendo usado, as sequências de escape listadas acima devem ser usadas se a pesquisa for executada pelo ADO com o dialeto SQL.
Além disso, dados binários arbitrários podem ser representados usando a sintaxe de sequência de escape codificando cada byte de dados binários com a barra invertida (\) seguida por dois dígitos hexadecimais. Por exemplo, o valor de quatro bytes 0x00000004 é codificado como \00\00\00\04 em uma cadeia de caracteres de filtro.
Tópicos relacionados