
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.
Antwort1
Das ActiveDirectory
Modul verfügt über eine clevere Logik, die „populäre“ Eigenschaften, etwa ob ein Benutzerkonto eingerichtet ist Enabled
oder wurde , berechnet PasswordNeverExpires
und diese wie normale Attribute darstellt.
Intern werden sie aus tatsächlichen Kontoattributen abgeleitet, wieuserAccountControl
Und pwdLastSet
.
Account Einstellungen
userAccountControl
ist 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 Enabled
Konten abgerufen:
(!(userAccountControl:1.2.840.113556.1.4.803:=2))
Ebenso DONT_EXPIRE_PASSWORD
hat 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-Computed
gibt 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-Computed
Wert 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-Command
um 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.