Domine seus Filtros LDAP no PowerShell enquanto Aprende sobre AD

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:

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:

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 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.

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 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.

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 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:

  1. base – o objeto especificado como searchbase.
  2. onelevel – pesquisa objetos imediatamente contidos pelo searchbase, mas não em nenhum subcontêiner.
  3. subtree – pesquisa 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=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!

Leitura Adicional

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