Consulta LDAP detrás del comando Get-ADUser

Consulta LDAP detrás del comando Get-ADUser

¿Cómo puedo ver la consulta LDAP ejecutada por Get-ADUser?entre bastidores, es decir. este comando

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

Me gustaría saber la consulta LDAP exacta enviada a los servidores de Active Directory.

Editar: Estoy intentando convertir algunos scripts de Powershell a Python, por lo tanto, necesito una consulta LDAP sin formato que pueda enviar a python-ldap.

Edit2: El Centro administrativo de Active Directory tiene una función interesante para aprender consultas LDAP. En la búsqueda global puede crear consultas utilizando palabras clave y marcando casillas de verificación, y luego haciendo clic enConvertir a LDAP. Disfrute de una consulta LDAP agradable y compleja.

GUI ADAC

Respuesta1

El ActiveDirectorymódulo tiene una lógica inteligente que calcula propiedades "populares", como si una cuenta de usuario está configurada Enabledo la ha PasswordNeverExpiresconfigurado y las presenta como atributos normales.

Internamente, se derivan de atributos de cuenta reales comouserAccountControly pwdLastSet.

Configuraciones de la cuenta

userAccountControles un campo de bits y contiene una larga lista de configuraciones relacionadas con la seguridad de la cuenta, como "El usuario no puede cambiar la contraseña" y la cuenta "Desactivada".

La implementación LDAP de Microsoft le permite filtrar dicho atributo con operadores bit a bit, identificados por un Identificador de objeto (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 buscar Disabledcuentas, podemos utilizar la siguiente sintaxis de filtro:

(&(userAccountControl:1.2.840.113556.1.4.803:=2))

Como siempre, puedes negar una expresión ldap con !, en este ejemplo recuperando todas Enabledlas cuentas:

(!(userAccountControl:1.2.840.113556.1.4.803:=2))

Asimismo, una configuración llamada DONT_EXPIRE_PASSWORDtiene valor 65536 (0x10000), y podemos encontrar estas cuentas con:

(&(userAccountControl:1.2.840.113556.1.4.803:=65536))

Caducidad de la contraseña

Calcular la caducidad de la contraseña esun poco más complicado. Para ayudar a los desarrolladores e integradores, Microsoft ha implementado un atributo dinámico llamadomsDS-User-Account-Control-Computed.

msDS-User-Account-Control-Computeddevuelve de forma transparente el mismo valor que userAccountControl, pero con la adición de los siguientes bits, calculados sobre la marcha en el momento de la búsqueda:

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

No lo he probado, pero si la memoria no me falla, esto debería ayudarte.seguramenteidentifique cuentas con contraseñas caducadas con este filtro :

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

Desafortunadamente no puedes usar atributos construidos en los filtros de consulta LDAP, así que lo que tendrás que hacer es filtrar por las dos primeras declaraciones:

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

Asegúrese de solicitar el msDS-User-Account-Control-Computedvalor al servidor de directorio y luego realice su máscara AND bit a bit en los resultados, en el lado del cliente.

Respuesta2

Si realmente desea saber qué consultas LDAP exactas realizan los cmdlets de Powershell, puede descompilarlas utilizando DotPeek, utilizando el método que describo aquí:

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

Úselo $(Get-Command Get-ADUser).DLLpara ver desde qué DLL se importa el cmdlet. Luego use Trace-Commandpara ver el nombre del método dentro de la DLL que llama Get-ADUser.

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

Ahora use JetBrains DotPeek para descompilar esa DLL y observe el código usted mismo.


Alternativamente, en lugar de pasar por todo ese lío, ¿por qué no haces esto?

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

Y ahora sabe (y tiene control sobre) exactamente qué consulta LDAP está utilizando.

Respuesta3

Creo que tendrás más suerte si pasas algún tiempo aprendiendo sobre elEsquema ADy crear consultas usted mismo, en lugar de intentar aplicar ingeniería inversa a las propias herramientas de Microsoft. AD es un directorio LDAP bastante sencillo al que generalmente se aplicarán artículos de referencia que hablan sobre LDAP. Allásonalgunas cosas raras comocampos de bitsenatributos heredados de Windows NT 4.0que son bastante importantes para consultas de tipo administrador de sistemas, por ejemplo.

información relacionada