LDAP-Abfrage hinter dem Get-ADUser-Cmdlet

LDAP-Abfrage hinter dem Get-ADUser-Cmdlet

Wie kann ich die von Get-ADUser ausgeführte LDAP-Abfrage anzeigen?hinter den Kulissen, d. h. dieser Befehl

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

Ich möchte die genaue LDAP-Abfrage wissen, die an Active Directory-Server gesendet wird.

Bearbeiten: Ich versuche, einige Powershell-Skripte in Python zu konvertieren, daher benötige ich eine reine LDAP-Abfrage, die ich an Python-LDAP weitergeben kann.

Edit2: Das Active Directory-Verwaltungscenter bietet eine nette Funktion zum Erlernen von LDAP-Abfragen. In der globalen Suche können Sie Abfragen mithilfe von Schlüsselwörtern und Kontrollkästchen erstellen und dann auf klickenKonvertieren nach LDAP. Viel Spaß mit schönen und komplexen LDAP-Abfragen.

ADAC GUI

Antwort1

Das ActiveDirectoryModul verfügt über eine clevere Logik, die „populäre“ Eigenschaften, etwa ob ein Benutzerkonto eingerichtet ist Enabledoder wurde , berechnet PasswordNeverExpiresund diese wie normale Attribute darstellt.

Intern werden sie aus tatsächlichen Kontoattributen abgeleitet, wieuserAccountControlUnd pwdLastSet.

Account Einstellungen

userAccountControlist ein Bitfeld und enthält eine lange Liste mit Einstellungen zur Kontosicherheit, wie „Benutzer kann Kennwort nicht ändern“ und Konto „Deaktiviert“.

Mit der LDAP-Implementierung von Microsoft können Sie ein solches Attribut mit bitweisen Operatoren filtern, die durch einen Objektbezeichner (OID) identifiziert werden:

  • LDAP_MATCHING_RULE_BIT_AND: 1.2.840.113556.1.4.803
  • LDAP_MATCHING_RULE_BIT_OR : 1.2.840.113556.1.4.804

Um Konten zu finden Disabled, können wir die folgende Filtersyntax verwenden:

(&(userAccountControl:1.2.840.113556.1.4.803:=2))

Wie immer können Sie einen LDAP-Ausdruck mit negieren !, in diesem Beispiel werden alle EnabledKonten abgerufen:

(!(userAccountControl:1.2.840.113556.1.4.803:=2))

Ebenso DONT_EXPIRE_PASSWORDhat eine Einstellung namens den Wert 65536 (0x10000), und wir können diese Konten wie folgt finden:

(&(userAccountControl:1.2.840.113556.1.4.803:=65536))

Ablauf des Passworts

Die Berechnung des Ablaufs des Passworts istetwas komplizierterUm Entwicklern und Integratoren zu helfen, hat Microsoft ein dynamisches Attribut namensmsDS-User-Account-Control-Computed.

msDS-User-Account-Control-Computedgibt transparent denselben Wert wie zurück userAccountControl, jedoch mit zusätzlichen folgenden Bits, die während der Suche sofort berechnet werden:

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

Ich habe das nicht getestet, aber wenn ich mich recht erinnere, sollte das Ihnen helfenzuverlässigIdentifizieren Sie Konten mit abgelaufenen Passwörtern mit diesem Filter :

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

Leider können Sie in LDAP-Abfragefiltern keine konstruierten Attribute verwenden. Sie müssen daher nach den ersten beiden Anweisungen filtern:

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

Fragen Sie unbedingt den Verzeichnisserver nach dem msDS-User-Account-Control-ComputedWert und führen Sie dann auf der Clientseite Ihre bitweise UND-Maske auf den Ergebnissen aus.

Antwort2

Wenn Sie wirklich wissen möchten, welche genauen LDAP-Abfragen von den Powershell-Cmdlets ausgeführt werden, können Sie sie mit DotPeek dekompilieren. Dazu verwenden Sie die Methode, die ich hier beschreibe:

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

Verwenden Sie $(Get-Command Get-ADUser).DLL, um zu sehen, aus welcher DLL das Cmdlet importiert wird. Verwenden Sie dann , Trace-Commandum den Namen der Methode innerhalb der DLL anzuzeigen, die von aufgerufen wird Get-ADUser.

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

Verwenden Sie jetzt JetBrains DotPeek, um diese DLL zu dekompilieren und sehen Sie sich den Code selbst an.


Anstatt sich diesen ganzen Mist anzutun, könnten Sie alternativ auch einfach Folgendes tun:

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

Und jetzt wissen Sie genau (und haben Kontrolle darüber), welche LDAP-Abfrage verwendet wird.

Antwort3

Ich denke, Sie hätten am meisten Glück, wenn Sie sich etwas Zeit nehmen würden, um mehr über dieAD-Schemaund selbst Abfragen erstellen, anstatt zu versuchen, Microsofts eigene Tools zurückzuentwickeln. AD ist ein ausreichend einfaches LDAP-Verzeichnis, sodass Referenzartikel, die sich allgemein mit LDAP befassen, anwendbar sind. EsSindeinige seltsame Dinge wieBitfelderInVon Windows NT 4.0 übernommene Attributedie beispielsweise für Abfragen vom Typ „Sysadmin“ ziemlich wichtig sind.

verwandte Informationen