Brazilian Portuguese
Uma das maiores dificuldades ao consultar o Active Directory com o PowerShell é como construir adequadamente a sintaxe do filtro. O parâmetro Filter
e os parâmetros de filtro LDAP em todos os cmdlets do módulo PowerShell do ActiveDirectory são uma caixa preta para muitos.
Neste post do blog, vamos aprofundar nosso entendimento sobre como usar filtros no Active Directory. Espero que, ao final deste post, você não sinta mais a tentação de usar aquele Where-Object
e o filtro certo!
Pré-requisitos
Para que qualquer código que eu esteja prestes a mostrar funcione, assumirei algumas coisas:
- você tem o módulo PowerShell ActiveDirectory instalado
- você está em um computador associado a um domínio
- você pode se conectar e autenticar a um controlador de domínio AD com sucesso
Há duas linguagens de filtro diferentes que você pode usar ao procurar objetos usando muitos dos cmdlets do Active Directory: filtros do PowerShell e filtros LDAP.
Filtros do PowerShell
Os filtros do PowerShell usam a sintaxe padrão de expressão do PowerShell. Isso é comumente chamado de sintaxe de filtro de pesquisa do Active Directory.
Esses filtros são usados com o parâmetro Filter
. A sintaxe do parâmetro Filter
Operadores
Ao construir um filtro para o parâmetro Filter
, você precisará usar pelo menos um operador. Os operadores usados aqui são os operadores familiares que você pode estar acostumado a usar ao usar comandos como Where-Object
.
Dentro do parâmetro Filter
, você pode usar os seguintes operadores.
Operator | Explanation |
---|---|
-eq | Equal to |
-le | Less than or equal to |
-ge | Greater than or equal to |
-ne | Not equal to |
-lt | Less than |
-gt | Greater than |
-approx | Approximately equal to |
-bor | Bitwise OR |
-band | Bitwise AND |
-recursivematch | Recursive match |
-like | Like |
-notlike | Not like |
-and | Boolean AND |
-or | Boolean OR |
-not | Boolean NOT |
Referência às Propriedades do Objeto AD
Dentro do filtro, você irá comparar várias propriedades do objeto AD usando operadores. Por exemplo, o cmdlet Get-AdUser
retorna uma propriedade Name
. Se você deseja encontrar todos os usuários que correspondem a um nome específico, você usaria:
Os nomes das propriedades podem ser o nome ou o nome do filtro LDAP da propriedade retornada com o cmdlet AD.
Os valores das propriedades normalmente são envoltos em aspas simples ou duplas. O único caractere curinga aceito é o asterisco (*). Você pode ver acima que o filtro é cercado por aspas duplas, mas Adam Bertram está cercado por aspas simples.
Alguns caracteres devem ser ‘escapados’ quando usados em filtros. Estes são:
Character | Escaped As | Notes |
---|---|---|
“ | `” | Only required if the data is enclosed in double quotes. |
‘ | \’ | Only required if the data is enclosed in single quotes. |
NUL | \00 | This is a standard LDAP escape sequence. |
\ | \5c | This is a standard LDAP escape sequence. |
* | \2a | Automatically escaped. Only in -eq and -ne comparisons. You should use -like and -notlike operators for wildcard comparison. |
( | /28 | Automatically escaped. |
) | /29 | Automatically escaped. |
/ | /2f | Automatically escaped. |
O que é o LDAP do Active Directory?
LDAP, ou Protocolo de Acesso a Diretório Leve, é um protocolo neutro em relação a fornecedores para acessar e modificar dados de diretório. Você pode pensar em uma lista telefônica ao ouvir a palavra diretório, mas no contexto do Active Directory, isso significa muito mais. Muitos tipos diferentes de objetos são armazenados e acessíveis pelo Active Directory, com o protocolo LDAP funcionando como um meio de acessar esses dados.
Como o Active Directory pode armazenar muitos tipos diferentes de dados, aplicativos e usuários precisam de uma maneira de consultar facilmente esse diretório. Continue lendo para aprender como os Filtros LDAP ajudam a filtrar esses dados!
Filtros LDAP
O Active Directory implementa o LDAP, o Protocolo de Acesso a Diretório Leve. Usar o parâmetro LDAPFilter
com os cmdlets permite que você use filtros LDAP, como os criados em Usuários e Computadores do Active Directory.
A sintaxe para filtros LDAP é definida no Número RFC 4515.
Cada regra de filtro é cercada por parênteses ( )
. Regras de filtro podem ser agrupadas cercando o grupo por parênteses e incluindo um comparador do seguinte:
Operator | Function |
---|---|
& | and |
| | or |
! | not |
Filtros LDAP também têm uma regra de correspondência especial Identificadores de Objetos(OIDs):
OID | Purpose |
---|---|
1.2.840.113556.1.4.803 | Bitwise AND |
1.2.840.113556.1.4.804 | Bitwise OR |
1.2.840.113556.1.4.1941 | Chain matching (for distinguished name attributes) |
Há quatro tipos de filtros:
Operator | Explanation |
---|---|
= | Equal to |
~= | Approximately equal to |
>= | Greater than or equal to |
<= | Less than or equal to |
Há quatro tipos de itens:
Type | Explanation |
---|---|
= | Simple |
=* | Present |
=something* | Substring |
Extensible | varies depending on type |
As regras de filtro LDAP devem ser usadas com os nomes LDAP de atributos, e determinados valores de caracteres devem ser ‘escapados’ se usados em um filtro LDAP. Estes são:
Character | Escaped As |
---|---|
* | \2a |
( | \28 |
) | \29 |
\ | \5c |
NUL | \00 |
Valores de propriedade para comparação normalmente não precisam ser envolvidos em aspas.
Exemplos de Filtro LDAP
Construir filtros LDAP pode ser desafiador. Aqui estão alguns exemplos usando filtros de grupo de diretório ativo que você pode usar como base para começar a criar os seus próprios.
- Todos os grupos com um nome (cn) de ‘Departamento de Serviços Profissionais’
'cn -eq "Departamento de Serviços Profissionais"'
ou `'(cn=Departamento de Serviços Profissionais)'
- Todos os grupos com um nome de ‘Departamento de Serviços Profissionais’ e uma descrição ‘Ao Vivo’
'(cn -eq "Departamento de Serviços Profissionais") -e (descrição -eq "Ao Vivo")'
ou'(&(cn=Departamento de Serviços Profissionais)(descrição=Ao Vivo))'
- Todos os grupos com um nome de ‘Departamento de Serviços Profissionais’ ou ‘Todos os Departamentos Compartilham Acesso’
'(cn -eq "Departamento de Serviços Profissionais") -ou (cn -eq "Todos os Departamentos Compartilham Acesso")'
ou'(|(cn=Departamento de Serviços Profissionais)(cn=Todos os Departamentos Compartilham Acesso))'
- Todos os grupos que não possuem uma descrição de ‘Ao Vivo’. Inclui aqueles sem nenhum campo de descrição
'(!(descrição=Ao Vivo))'
- Todos os grupos que não possuem uma descrição de ‘Ao Vivo’. Exclui aqueles sem nenhum campo de descrição
'descrição -ne "Ao Vivo"'
- Todos os grupos com uma descrição de ‘Ao Vivo’, mas não com um nome de ‘Departamento de Serviços Profissionais’
'(descrição -eq "Ao Vivo") -e (cn -ne "Departamento de Serviços Profissionais")'
ou'(&(descrição=Ao Vivo)(!(cn=Departamento de Serviços Profissionais)))'
- Todos os grupos cuja descrição é ‘\\fileserver1\fileshare’
'descrição -eq "\5c\5cfileserver1\5cfileshare"'
ou'(descrição=\5c\5cfileserver1\5cfileshare)'
Usando Correspondência Recursiva ou Correspondência em Cadeia
Usar um OID de regra de correspondência, ou o parâmetro RecursiveMatch
é uma maneira poderosa de resolver uma pergunta frequentemente feita sobre consultas no AD: ‘Como posso saber todos os grupos dos quais um usuário é membro, tanto diretamente quanto indiretamente?’ Você usa a propriedade de filtro de pesquisa do Active Directory memberOf
para descobrir.
usar uma regra de correspondência ldap simples pode ser muito mais eficiente do que um script extenso. usando nosso exemplo de domínio domain.local, kristin diaz é membro direto do grupo de segurança departamento de serviços profissionais. ao analisar sua propriedade memberof
no ad, reflete-se isso; apenas departamento de serviços profissionais é mostrado.
ao usar a regra de correspondência oid ou o parâmetro recursivematch
, você descobrirá que eles são membros indiretos de acesso compartilhado de todos os departamentos. isso ocorre porque o grupo departamento de serviços profissionais é membro de acesso compartilhado de todos os departamentos.
ambos retornam o seguinte:
os parâmetros searchbase e searchscope
em ambientes grandes, o ad pode conter muitos milhares de objetos. uma maneira de melhorar o desempenho e reduzir o número de objetos retornados para qualquer consulta é limitar a pesquisa.
o parâmetro searchbase
determina onde na hierarquia do ad a pesquisa começa. ao usar os cmdlets, isso é uma representação de string de um nome distinto (e por padrão é o ‘top’ do domínio). existem também três níveis de searchscope
:
- base – o objeto especificado como searchbase.
- onelevel – pesquisa objetos imediatamente contidos pelo searchbase, mas não em nenhum subcontêiner.
- subtree – pesquisa objetos contidos pelo searchbase e em quaisquer subcontêineres, recursivamente pela hierarquia do ad.

No exemplo acima, com o SearchBase definido como OU=All User Accounts,DC=domain,DC=local, um SearchScope
de Base
tentaria consultar o objeto OU em si, um SearchScope
de OneLevel
pesquisaria apenas a OU All User Accounts, e um SearchScope
de SubTree
pesquisaria tanto as OUs All User Accounts quanto Professional Services.
Resumo
Agora você deve ter uma boa compreensão de como filtrar com os cmdlets do Active Directory PowerShell. Você pode perceber que há muito a considerar ao criar a sintaxe de filtro perfeita. É muito mais desafiador construir o filtro apropriado do que usar o cmdlet Where-Object
.
Mas invista tempo aprendendo a maneira ‘certa’ de filtrar objetos AD e colha as recompensas de um ótimo desempenho e eficiência!