So sind LDAP-Filter aufgebaut
Ein LDAP-Filter beschreibt, welche Objekte eine Suche liefern soll. Jede Bedingung steht in Klammern, Verknüpfungen stehen vorne: (&(a)(b)) heißt „a und b“, (|(a)(b)) „a oder b“, (!(a)) „nicht a“. Das ist schnell geschrieben und schnell falsch geklammert, deshalb der Baukasten.
Was in Active Directory anders ist
- Benutzer richtig finden:
(objectClass=user)allein liefert auch Computer, denn Computerkonten erben von „user“. Zuverlässig ist(&(objectCategory=person)(objectClass=user)). - Bits in userAccountControl: Ob ein Konto deaktiviert ist, steht in einem einzelnen Bit. Abgefragt wird es mit der Vergleichsregel
1.2.840.113556.1.4.803(bitweises UND), etwa(userAccountControl:1.2.840.113556.1.4.803:=2). Das Werkzeug zeigt die Bedeutung der Bits an. - Verschachtelte Gruppen:
memberOf=…findet nur direkte Mitglieder. Mit1.2.840.113556.1.4.1941(LDAP_MATCHING_RULE_IN_CHAIN) werden auch Mitglieder von Untergruppen gefunden. - Zeitwerte:
lastLogonTimestamp,pwdLastSetundaccountExpireszählen in 100-Nanosekunden-Schritten seit 1601 (FILETIME). Der Rechner unten rechnet ein Datum um.lastLogonTimestampwird nur etwa alle 14 Tage repliziert, für „inaktiv seit 90 Tagen“ reicht das.
Sonderzeichen im Wert
Die Zeichen *, (, ), \ und NUL müssen im Wert als \2a, \28, \29, \5c und \00 geschrieben werden (RFC 4515). Der Baukasten macht das automatisch. Ein Gruppenname wie „Vertrieb (Nord)“ wird so zu Vertrieb \28Nord\29. In PowerShell kommt der Filter in einfache Anführungszeichen, damit $ und ` nicht ausgewertet werden.
Weitere Werkzeuge für den Admin-Alltag: tcpdump-Filter, Subnetzrechner und DNS-Lookup.
FAQ
Warum findet mein Filter mit objectClass=user auch Computer?
Weil die Klasse „computer“ in AD von „user“ abgeleitet ist. Verwende zusätzlich (objectCategory=person), dann bleiben nur Benutzer übrig. Das ist außerdem schneller, weil objectCategory indiziert ist.
Wie finde ich alle Mitglieder einer Gruppe einschließlich Untergruppen?
Mit (memberOf:1.2.840.113556.1.4.1941:=CN=Gruppe,OU=…,DC=…). Der Wert muss der vollständige Distinguished Name der Gruppe sein. Bei sehr großen Verschachtelungen kann die Abfrage langsam sein.
Wie frage ich deaktivierte oder gesperrte Konten ab?
Deaktiviert: (userAccountControl:1.2.840.113556.1.4.803:=2). Gesperrt: (lockoutTime>=1). Das Sperr-Bit 16 in userAccountControl wird von AD nicht mehr gepflegt. lockoutTime bleibt nach Ablauf der Sperrdauer gesetzt, bis sich der Benutzer anmeldet.
Werden meine Filter irgendwohin gesendet?
Nein. Baukasten, Prüfung und Umrechnung laufen komplett in deinem Browser. Nur in der Adresszeile steht der aktuelle Filter, damit du ihn als Link weitergeben kannst.
Funktioniert das auch mit OpenLDAP?
Ja, die Syntax ist standardisiert (RFC 4515). Die AD-spezifischen Vergleichsregeln für Bits und verschachtelte Gruppen kennt OpenLDAP aber nicht, und Attribute heißen dort oft anders, z. B. uid statt sAMAccountName.