Um dos obstáculos mais comuns ao consultar o Active Directory com o PowerShell é como construir corretamente a sintaxe do filtro. Os parâmetros Filter
e LDAP Filter em todos os cmdlets do módulo PowerShell do ActiveDirectory são uma caixa preta para muitos.
Neste post do blog, vamos aprofundar na compreensão de como usar filtros do Active Directory. Espero que, ao final deste post, você não esteja mais tentado a usar aquele Where-Object
e filtro certo!
Pré-requisitos
Para que qualquer um dos códigos que estou prestes a mostrar funcione, vou presumir algumas coisas:
- você tem o módulo PowerShell ActiveDirectory instalado
- você está em um computador associado a um domínio
- você pode conectar e autenticar com sucesso em um controlador de domínio AD
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 utilizar 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 de Propriedades do Objeto AD
Dentro do filtro, você irá comparar várias propriedades de objetos 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 envolvidos por aspas simples ou duplas. O único caractere curinga aceito é o asterisco (*). Você pode ver acima que o filtro está cercado por aspas duplas, mas Adam Bertram está cercado por aspas simples.
Certos caracteres devem ser ‘escapados’ ao serem 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 tornados 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 auxiliam na filtragem desses dados!
Filtros LDAP
O Active Directory implementa o LDAP, o Protocolo de Acesso a Diretório Leve. O uso do parâmetro LDAPFilter
com os cmdlets permite o uso de filtros LDAP, como os criados no Active Directory Users and Computers.
A sintaxe para filtros LDAP é definida no número RFC 4515.
Cada regra de filtro é cercada por parênteses ( )
. As 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 dos 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 de ‘Ativo’
'(cn -eq "Departamento de Serviços Profissionais") -e (descrição -eq "Ativo")'
ou'(&(cn=Departamento de Serviços Profissionais)(descrição=Ativo))'
- 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 têm uma descrição de ‘Live’. Inclui aqueles sem nenhum campo de descrição
'(!(description=Live))'
- Todos os grupos que não têm uma descrição de ‘Live’. Exclui aqueles sem nenhum campo de descrição
'description -ne "Live"'
- Todos os grupos com uma descrição de ‘Live’, mas não com um nome de ‘Departamento de Serviços Profissionais’
'(description -eq "Live") -and (cn -ne "Professional Services Department")'
ou'(&(description=Live)(!(cn=Professional Services Department)))'
- Todos os grupos cuja descrição é ‘\\fileserver1\fileshare’
'description -eq "\5c\5cfileserver1\5cfileshare"'
ou'(description=\5c\5cfileserver1\5cfileshare)'
Usando o RecursiveMatch ou Chain Matching
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 de 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 grande script. Usando nosso domínio de exemplo domain.local, Kristin Diaz é membro direto do grupo de segurança do Departamento de Serviços Profissionais. Ao observar sua propriedade memberOf
no AD reflete isso; apenas Departamento de Serviços Profissionais é mostrado.
Ao usar o OID da regra de correspondência, ou o parâmetro RecursiveMatch
, você descobrirá que eles são membros indiretos do Acesso Compartilhado de Todos os Departamentos. Isso ocorre porque o grupo Departamento de Serviços Profissionais é membro do Acesso Compartilhado de Todos os Departamentos.
Ambos retornam o seguinte:
Os Parâmetros SearchBase e SearchScope
Em ambientes grandes, o AD pode conter milhares de objetos. Uma maneira de melhorar o desempenho e reduzir o número de objetos retornados para qualquer consulta é delimitar a pesquisa.
O parâmetro SearchBase
determina onde na hierarquia do AD começa qualquer pesquisa. Ao usar os cmdlets, isso é uma representação de string de um nome distinto (e por padrão é o ‘topo’ do domínio). Existem também três níveis de SearchScope
:
- Base – O objeto que foi especificado como o SearchBase.
- OneLevel – procura objetos imediatamente contidos pelo SearchBase mas não em nenhum subcontêiner.
- SubTree – procura objetos contidos pelo SearchBase e em quaisquer subcontêineres, recursivamente pela hierarquia do AD.

No exemplo acima, com o SearchBase definido como OU=Todas as Contas de Usuário,DC=domínio,DC=local, um SearchScope
de Base
tentaria consultar o próprio objeto OU, um SearchScope
de OneLevel
procuraria apenas a OU Todas as Contas de Usuário, e um SearchScope
de SubTree
pesquisaria tanto as OUs Todas as Contas de Usuário quanto Serviços Profissionais.
Resumo
Agora você deve ter uma boa compreensão de como filtrar com os cmdlets do Active Directory do PowerShell. Você pode ver que há muito para criar essa sintaxe de filtro perfeita. É muito mais difícil construir o filtro apropriado do que usar o cmdlet Where-Object
.
Mas dedique tempo para aprender a maneira ‘certa’ de filtrar objetos do AD e colha as recompensas de um ótimo desempenho e eficiência!