Domine seus Filtros LDAP no PowerShell enquanto Aprende sobre o AD

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:

PS51> Get-Aduser -Filter "Name -eq 'Adam Bertram'"

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.

PS51> Get-ADUser -Identity Kristin.Diaz -Property memberOf

DistinguishedName : CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local
Enabled           : True
GivenName         : Kristin
MemberOf          : {CN=Professional Services Department,OU=All Groups,DC=domain,DC=local}
Name              : Diaz Kristin
ObjectClass       : user
ObjectGUID        : 04fe6336-c541-4e71-b7ed-6fee7db23482
SamAccountName    : Kristin.Diaz
SID               : S-1-5-21-447422785-3715515833-3878445295-1186
Surname           : Diaz
UserPrincipalName :

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.

PS51> Get-ADGroup -LDAPFilter '(member:1.2.840.113556.1.4.1941:=CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local)'
PS51> Get-ADGroup -Filter 'member -RecursiveMatch "CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local"'

Ambos retornam o seguinte:

DistinguishedName : CN=All Departments Share Access,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : All Departments Share Access
ObjectClass       : group
ObjectGUID        : 8ac0e0b7-9225-40a4-b168-a0330960e182
SamAccountName    : All Departments Share Access
SID               : S-1-5-21-447422785-3715515833-3878445295-1254

DistinguishedName : CN=Professional Services Department,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : Professional Services Department
ObjectClass       : group
ObjectGUID        : a8432583-7cac-4e8e-8d94-51e1c5bb1989
SamAccountName    : Professional Services Department
SID               : S-1-5-21-447422785-3715515833-3878445295-1255

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:

  1. Base – O objeto que foi especificado como o SearchBase.
  2. OneLevel – procura objetos imediatamente contidos pelo SearchBase mas não em nenhum subcontêiner.
  3. SubTree – procura objetos contidos pelo SearchBase e em quaisquer subcontêineres, recursivamente pela hierarquia do AD.
Example OU Structure

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!

Leitura Adicional

Source:
https://adamtheautomator.com/ldap-filter/