Consulta LDAP por trás do comando Get-ADUser

Consulta LDAP por trás do comando Get-ADUser

Como posso visualizar a consulta LDAP executada por Get-ADUserPor trás das cenas, ou seja. este comando

Get-ADUser -Filter * -Properties * | Where { $_.Enabled -eq $True } | Where { $_.PasswordNeverExpires -eq $False } | Where { $_.PasswordExpired -eq $False }

Gostaria de saber a consulta LDAP exata enviada aos servidores do Active Directory.

Editar: estou tentando converter alguns scripts Powershell para Python, portanto, preciso de uma consulta LDAP bruta que possa alimentar para python-ldap.

Edit2: O Centro Administrativo do Active Directory possui um ótimo recurso para aprender consultas LDAP. Na pesquisa global você pode criar consultas usando palavras-chave e marcando caixas de seleção e depois clicando emConverter para LDAP. Desfrute de consultas LDAP interessantes e complexas.

GUI do ADAC

Responder1

O ActiveDirectorymódulo possui uma lógica inteligente que calcula propriedades "populares", como se uma conta de usuário está Enabledou foi PasswordNeverExpiresdefinida, e as apresenta como atributos regulares.

Internamente, eles são derivados de atributos reais da conta, comouserAccountControle pwdLastSet.

Configurações de Conta

userAccountControlé um campo de bits e contém uma longa lista de configurações relacionadas à segurança da conta, como "O usuário não pode alterar a senha" e a conta "Desativada".

A implementação LDAP da Microsoft permite filtrar esse atributo com operadores bit a bit, identificados por um Object Identifier (OID):

  • LDAP_MATCHING_RULE_BIT_AND: 1.2.840.113556.1.4.803
  • LDAP_MATCHING_RULE_BIT_OR : 1.2.840.113556.1.4.804

Para encontrar Disabledcontas, podemos usar a seguinte sintaxe de filtro:

(&(userAccountControl:1.2.840.113556.1.4.803:=2))

Como sempre, você pode negar uma expressão ldap com !, neste exemplo recuperando todas Enabledas contas:

(!(userAccountControl:1.2.840.113556.1.4.803:=2))

Da mesma forma, uma configuração chamada DONT_EXPIRE_PASSWORDtem valor 65536 (0x10000), e podemos encontrar essas contas com:

(&(userAccountControl:1.2.840.113556.1.4.803:=65536))

Expiração de senha

O cálculo da expiração da senha éum pouco mais complicado. Para ajudar desenvolvedores e integradores, a Microsoft implementou um atributo dinâmico chamadomsDS-User-Account-Control-Computed.

msDS-User-Account-Control-Computedretorna de forma transparente o mesmo valor que userAccountControl, mas com a adição dos seguintes bits, calculados dinamicamente no momento da pesquisa:

UF_LOCKOUT                     0x0010
UF_PASSWORD_EXPIRED          0x800000
UF_PARTIAL_SECRETS_ACCOUNT  0x4000000
UF_USE_AES_KEYS             0x8000000

Eu não testei isso, mas se a memória não me falha, isso deve ajudá-lode forma confiávelidentifique contas com senhas expiradas com este filtro :

(&(msDS-User-Account-Control-Computed:1.2.840.113556.1.4.803:=8388608))

Infelizmente você não pode usar atributos construídos em filtros de consulta LDAP, então o que você terá que fazer é filtrar as duas primeiras instruções:

(&(!userAccountControl:1.2.840.113556.1.4.803:=2)(!userAccountControl:1.2.840.113556.1.4.803:=65536))

Certifique-se de solicitar o msDS-User-Account-Control-Computedvalor ao servidor de diretório e, em seguida, execute sua máscara AND bit a bit nos resultados, no lado do cliente.

Responder2

Se você realmente deseja saber quais consultas LDAP exatas estão sendo executadas pelos cmdlets do Powershell, você pode descompilá-las usando DotPeek, usando o método que descrevo aqui:

https://www.myotherpcisacloud.com/post/2013/07/08/Taking-a-Peek-Inside-Powershell-Cmdlets.aspx

Use $(Get-Command Get-ADUser).DLLpara ver de qual DLL o cmdlet está sendo importado. Em seguida, use Trace-Commandpara ver o nome do método dentro da DLL que é chamado por Get-ADUser.

Trace-Command -Name CommandDiscovery -Expression { Get-ADUser bob } -PSHost

Agora use JetBrains DotPeek para descompilar essa DLL e veja o código você mesmo.


Alternativamente, em vez de passar por toda essa bagunça, por que você não faz isso:

Get-ADUser -LDAPFilter "(objectCategory=person)"

E agora você sabe (e tem controle) exatamente qual consulta LDAP está usando.

Responder3

Acho que você teria muita sorte em passar algum tempo aprendendo sobre oEsquema do ADe criar consultas você mesmo, em vez de tentar fazer engenharia reversa nas próprias ferramentas da Microsoft. AD é um diretório LDAP simples o suficiente para que artigos de referência que falem sobre LDAP geralmente sejam aplicáveis. Lásãoalgumas coisas estranhas comocampos de bitsematributos herdados do Windows NT 4.0que são bastante importantes para consultas do tipo sysadmin, por exemplo.

informação relacionada