So setzt du die Filter ein
# PowerShell (RSAT, Modul ActiveDirectory) Get-ADUser -LDAPFilter '(&(objectCategory=person)(objectClass=user)(mail=*))' -Properties mail # Linux/macOS ldapsearch -H ldaps://dc1.example.com -D 'svc-ldap@example.com' -W \ -b 'DC=example,DC=com' '(&(objectCategory=person)(objectClass=user)(mail=*))' sAMAccountName mail # Windows-Bordmittel dsquery * -filter "(&(objectCategory=person)(objectClass=user)(mail=*))" -attr sAMAccountName mail
Der Filter legt fest, was gesucht wird. Wo gesucht wird (die ganze Domäne oder nur eine OU), bestimmt die Suchbasis (-b bzw. -SearchBase).
Benutzer
1. Alle Benutzerkonten
(&(objectCategory=person)(objectClass=user))
objectCategory=person und objectClass=user zusammen liefern nur echte Benutzer, keine Kontakte und keine Computer (Computer sind in AD auch user). Im Builder öffnen ›
2. Aktive Benutzer
(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
Bit 2 im userAccountControl bedeutet „deaktiviert“. Die lange Zahl ist die Regel für bitweises UND, verneint ergibt sich „nicht deaktiviert“. Im Builder öffnen ›
3. Deaktivierte Benutzer
(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))
Dasselbe ohne Verneinung, praktisch zum Aufräumen. Im Builder öffnen ›
4. Gesperrte Konten
(&(objectCategory=person)(objectClass=user)(lockoutTime>=1))
lockoutTime größer als 0 heißt: Das Konto wurde gesperrt. Der Wert bleibt auch nach Ablauf der Sperrdauer stehen, bis sich der Benutzer wieder anmeldet. Die Liste kann also mehr Konten enthalten als gerade wirklich gesperrt sind. Im Builder öffnen ›
5. Kennwort läuft nie ab
(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=65536))
Bit 65536 (DONT_EXPIRE_PASSWORD). Ein Fall für Audits. Im Builder öffnen ›
6. Kennwort muss bei der nächsten Anmeldung geändert werden
(&(objectCategory=person)(objectClass=user)(pwdLastSet=0))
pwdLastSet=0 ist genau dieser Zustand. Im Builder öffnen ›
7. Mitglieder einer Gruppe (direkt)
(&(objectCategory=person)(objectClass=user)(memberOf=CN=VPN-Users,OU=Groups,DC=example,DC=com))
Die Gruppe muss mit vollem DN angegeben werden. Platzhalter wie CN=VPN* funktionieren bei memberOf nicht. Im Builder öffnen ›
8. Mitglieder einer Gruppe inklusive verschachtelter Gruppen
(&(objectCategory=person)(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=CN=VPN-Users,OU=Groups,DC=example,DC=com))
Die Regel 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) löst verschachtelte Gruppen auf. Bei großen Verzeichnissen langsamer. Im Builder öffnen ›
9. Benutzer mit E-Mail-Adresse
(&(objectCategory=person)(objectClass=user)(mail=*))
=* heißt „Attribut ist vorhanden“. Im Builder öffnen ›
10. Benutzer ohne E-Mail-Adresse
(&(objectCategory=person)(objectClass=user)(!(mail=*)))
Verneint: Attribut fehlt. Im Builder öffnen ›
11. Suche wie im Adressbuch
(anr=Müller)
anr (Ambiguous Name Resolution) ist eine AD-Besonderheit und sucht in Name, Vorname, Anzeigename, Anmeldename und weiteren Feldern gleichzeitig. Im Builder öffnen ›
12. Anmeldung per Benutzername oder UPN
(&(objectCategory=person)(objectClass=user)(|(sAMAccountName={user})(userPrincipalName={user})))
Der typische Filter für Anwendungen mit LDAP-Login. {user} ersetzt die Anwendung durch die Eingabe. Die Eingabe muss dabei nach RFC 4515 maskiert werden, sonst ist LDAP-Injection möglich. Im Builder öffnen ›
13. Lange nicht angemeldet
(&(objectCategory=person)(objectClass=user)(lastLogonTimestamp<=134116992000000000))
lastLogonTimestamp ist ein Windows-Zeitstempel (100-ns-Schritte seit 1601). Die Zahl im Beispiel entspricht dem 1. Januar 2026. Das Attribut wird nur etwa alle 9–14 Tage aktualisiert und eignet sich für „seit Monaten nicht angemeldet“, nicht für „seit gestern“. Im Builder öffnen ›
14. Seit einem Datum angelegt
(&(objectCategory=person)(objectClass=user)(whenCreated>=20260101000000.0Z))
whenCreated ist im Format JJJJMMTTHHMMSS.0Z (UTC). Im Builder öffnen ›
15. Konten mit Service Principal Name
(&(objectCategory=person)(objectClass=user)(servicePrincipalName=*))
Benutzerkonten mit SPN sind Dienstkonten und das Ziel von Kerberoasting. Sie sollten lange, zufällige Kennwörter haben oder gMSA sein. Im Builder öffnen ›
16. Geschützte Konten (adminCount)
(&(objectCategory=person)(objectClass=user)(adminCount=1))
adminCount=1 tragen Konten, die Mitglied einer privilegierten Gruppe sind oder waren. Gut, um vergessene Admin-Rechte zu finden. Im Builder öffnen ›
Computer und Gruppen
17. Alle Computer
(objectCategory=computer)
Computerkonten in der Domäne. Im Builder öffnen ›
18. Domänencontroller
(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=8192))
Bit 8192 (SERVER_TRUST_ACCOUNT) haben nur Domänencontroller. Im Builder öffnen ›
19. Windows-Server
(&(objectCategory=computer)(operatingSystem=*Server*))
Platzhalter funktionieren bei normalen Textattributen wie operatingSystem. Im Builder öffnen ›
20. Leere Sicherheitsgruppen
(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648)(!(member=*)))
Bit 2147483648 im groupType kennzeichnet Sicherheitsgruppen, !(member=*) heißt „keine Mitglieder“. Mitglieder über die primäre Gruppe (z. B. Domänen-Benutzer) zählen hier nicht. Im Builder öffnen ›
Tipps für schnelle und sichere Filter
- objectCategory statt nur objectClass:
objectCategoryist indiziert und einwertig, Abfragen damit sind deutlich schneller. - Kein Platzhalter am Anfang:
(sn=*mann)durchsucht alle Objekte.(sn=Mann*)nutzt den Index. - Sonderzeichen maskieren:
*→\2a,(→\28,)→\29,\→\5c. Das gilt vor allem für Benutzereingaben in Anwendungen. - Bits prüfen statt vergleichen:
userAccountControl=512findet nur Konten mit genau diesen Bits. Mit der Regel:1.2.840.113556.1.4.803:=wird ein einzelnes Bit geprüft, egal welche anderen gesetzt sind. - Über LDAPS abfragen: Einfache Anmeldungen (Simple Bind) über Port 389 schicken das Kennwort im Klartext. Port 636 oder StartTLS verwenden.
FAQ
Warum findet mein Filter Computer, obwohl ich nach objectClass=user suche?
In Active Directory erben Computerkonten von der Klasse user. Mit objectCategory=person schließt du sie aus.
Wie finde ich alle Gruppen eines Benutzers inklusive verschachtelter?
Mit der IN_CHAIN-Regel andersherum: (member:1.2.840.113556.1.4.1941:=CN=Max Muster,OU=Users,DC=example,DC=com) auf Gruppen angewendet.
Warum liefert die Abfrage nur 1000 Ergebnisse?
Active Directory begrenzt Antworten standardmäßig auf 1000 Einträge pro Seite. Das Werkzeug muss Paging nutzen. Get-ADUser macht das automatisch, ldapsearch mit -E pr=1000/noprompt.
Kann ich mit einem Filter nach dem Kennwort suchen?
Nein. Kennwörter sind nicht lesbar und nicht durchsuchbar. Filtern lässt sich nur nach Metadaten wie pwdLastSet.