Eines der häufigsten Probleme beim Abfragen von Active Directory mit PowerShell besteht darin, die Filtersyntax korrekt zu erstellen. Der Filter
– und LDAP-Filterparameter auf allen Cmdlets des ActiveDirectory PowerShell-Moduls sind für viele ein Buch mit sieben Siegeln.
In diesem Blogbeitrag werden wir tief in das Verständnis eintauchen, wie man Active Directory-Filter verwendet. Ich hoffe, dass Sie am Ende dieses Beitrags nicht mehr versucht sind, diesen Where-Object
und Filter richtig zu verwenden!
Voraussetzungen
Damit einer der Codes, die ich Ihnen gleich zeigen werde, funktioniert, gehe ich von einigen Dingen aus:
- Sie haben das PowerShell ActiveDirectory-Modul installiert
- Sie befinden sich auf einem domänenverbundenen Computer
- Sie können sich erfolgreich an einem AD-Domänencontroller anmelden und authentifizieren
Es gibt zwei verschiedene Filtersprachen, die Sie verwenden können, wenn Sie nach Objekten mit vielen der Active Directory-Cmdlets suchen: PowerShell-Filter und LDAP-Filter.
PowerShell-Filter
PowerShell-Filter verwenden die Standard-Syntax für PowerShell-Ausdrücke. Dies wird allgemein als Active Directory-Suchfilter-Syntax bezeichnet.
Diese Filter werden mit dem Parameter Filter
verwendet. Die Syntax des Filter
-Parameters
Operatoren
Beim Erstellen eines Filters für den Filter
-Parameter müssen Sie mindestens einen Operator verwenden. Die hier verwendeten Operatoren sind die bekannten Operatoren, die Sie möglicherweise gewohnt sind, wenn Sie Befehle wie Where-Object
verwenden.
Innerhalb des Filter
-Parameters können Sie die folgenden Operatoren verwenden.
Operator | Explanation |
---|---|
-eq | Equal to |
-le | Less than or equal to |
-ge | Greater than or equal to |
-ne | Not equal to |
-lt | Less than |
-gt | Greater than |
-approx | Approximately equal to |
-bor | Bitwise OR |
-band | Bitwise AND |
-recursivematch | Recursive match |
-like | Like |
-notlike | Not like |
-and | Boolean AND |
-or | Boolean OR |
-not | Boolean NOT |
Referenz AD-Objekteigenschaften
Innerhalb des Filters vergleichen Sie verschiedene AD-Objekteigenschaften mit Operatoren. Zum Beispiel gibt das Cmdlet Get-AdUser
eine Name
-Eigenschaft zurück. Wenn Sie alle Benutzer finden möchten, die einem bestimmten Namen entsprechen, würden Sie verwenden:
Eigenschaftsnamen können der Name oder der LDAP-Filtername der Eigenschaft sein, die mit dem AD-Cmdlet zurückgegeben wird.
Eigenschaftswerte werden normalerweise in einfache oder doppelte Anführungszeichen eingefasst. Das einzige akzeptierte Platzhalterzeichen ist der Asterisk (*). Sie können oben sehen, dass der Filter von doppelten Anführungszeichen umgeben ist, doch Adam Bertram ist in einfache Anführungszeichen eingefasst.
Bestimmte Zeichen müssen ‚escaped‘ werden, wenn sie in Filtern verwendet werden. Diese sind:
Character | Escaped As | Notes |
---|---|---|
“ | `” | Only required if the data is enclosed in double quotes. |
‘ | \’ | Only required if the data is enclosed in single quotes. |
NUL | \00 | This is a standard LDAP escape sequence. |
\ | \5c | This is a standard LDAP escape sequence. |
* | \2a | Automatically escaped. Only in -eq and -ne comparisons. You should use -like and -notlike operators for wildcard comparison. |
( | /28 | Automatically escaped. |
) | /29 | Automatically escaped. |
/ | /2f | Automatically escaped. |
Was ist Active Directory LDAP?
LDAP oder Lightweight Directory Access Protocol ist ein herstellerneutrales Protokoll zum Zugriff auf und Ändern von Verzeichnisdaten. Wenn Sie das Wort „Verzeichnis“ hören, denken Sie vielleicht an ein Telefonbuch, aber im Kontext von Active Directory bedeutet dies viel mehr. Viele verschiedene Objekttypen werden von Active Directory gespeichert und durch das LDAP-Protokoll zugänglich gemacht, das als Mittel zum Zugriff auf diese Daten fungiert.
Da Active Directory viele verschiedene Datentypen speichern kann, benötigen Anwendungen und Benutzer eine Möglichkeit, dieses Verzeichnis leicht abzufragen. Lesen Sie weiter, um zu erfahren, wie LDAP-Filter dabei helfen, diese Daten zu filtern!
LDAP-Filter
Active Directory implementiert LDAP, das Lightweight Directory Access Protocol. Die Verwendung des Parameters LDAPFilter
mit den Cmdlets ermöglicht es Ihnen, LDAP-Filter zu verwenden, wie sie in Active Directory Users and Computers erstellt werden.
Die Syntax für LDAP-Filter ist in RFC-Nummer 4515 definiert.
Jede Filterregel ist von Klammern ( )
umgeben. Filterregeln können gruppiert werden, indem die Gruppe in Klammern eingeschlossen wird und ein Vergleichsoperator aus den folgenden eingefügt wird:
Operator | Function |
---|---|
& | and |
| | or |
! | not |
LDAP-Filter haben auch eine spezielle Übereinstimmungsregel Object Identifiers (OIDs):
OID | Purpose |
---|---|
1.2.840.113556.1.4.803 | Bitwise AND |
1.2.840.113556.1.4.804 | Bitwise OR |
1.2.840.113556.1.4.1941 | Chain matching (for distinguished name attributes) |
Es gibt vier Filtertypen:
Operator | Explanation |
---|---|
= | Equal to |
~= | Approximately equal to |
>= | Greater than or equal to |
<= | Less than or equal to |
Es gibt vier Elementtypen:
Type | Explanation |
---|---|
= | Simple |
=* | Present |
=something* | Substring |
Extensible | varies depending on type |
Die LDAP-Filterregeln müssen mit den LDAP-Namen von Attributen verwendet werden, und bestimmte Zeichenwerte müssen ‚escaped‘ werden, wenn sie in einem LDAP-Filter verwendet werden. Diese sind:
Character | Escaped As |
---|---|
* | \2a |
( | \28 |
) | \29 |
\ | \5c |
NUL | \00 |
Werte zur Vergleich benötigen normalerweise keine Anführungszeichen.
LDAP-Filterbeispiele
Das Erstellen von LDAP-Filtern kann herausfordernd sein. Hier sind einige Beispiele für die Verwendung von Active Directory Gruppenfiltern, die Sie als Basis verwenden können, um Ihre eigenen zu erstellen.
- Alle Gruppen mit einem Namen (cn) von ‚Professional Services Department‘
'cn -eq "Professional Services Department"'
oder `'(cn=Professional Services Department)'
- Alle Gruppen mit einem Namen von ‚Professional Services Department‘ und einer Beschreibung von ‚Live‘
'(cn -eq "Professional Services Department") -und (description -eq "Live")'
oder'(&(cn=Professional Services Department)(description=Live))'
- Alle Gruppen mit einem Namen entweder ‚Professional Services Department‘ oder ‚All Departments Share Access‘
'(cn -eq "Professional Services Department") -oder (cn -eq "All Departments Share Access")'
oder'(|(cn=Professional Services Department)(cn=All Departments Share Access))'
- Alle Gruppen, die keine Beschreibung von ‚Live‘ haben. Beinhaltet diejenigen, die überhaupt kein Beschreibungsfeld haben.
'(!(description=Live))'
- Alle Gruppen, die keine Beschreibung von ‚Live‘ haben. Exkludiert diejenigen, die überhaupt kein Beschreibungsfeld haben.
'description -ne "Live"'
- Alle Gruppen mit einer Beschreibung von ‚Live‘, aber nicht mit einem Namen von ‚Professional Services Department‘.
'(description -eq "Live") -and (cn -ne "Professional Services Department")'
oder'(&(description=Live)(!(cn=Professional Services Department)))'
- Alle Gruppen, deren Beschreibung ‚\\fileserver1\fileshare‘ ist.
'description -eq "\5c\5cfileserver1\5cfileshare"'
oder'(description=\5c\5cfileserver1\5cfileshare)'
Verwendung von RecursiveMatch oder Chain Matching
Die Verwendung einer Übereinstimmungsregel OID oder des Parameters RecursiveMatch
ist eine leistungsstarke Möglichkeit, eine oft gestellte Frage zur Abfrage von AD zu lösen: „Wie kann ich alle Gruppen ermitteln, denen ein Benutzer angehört, sowohl direkt als auch indirekt?“ Sie verwenden das Active Directory-Suchfilter memberOf
, um dies herauszufinden.
Die Verwendung einer einfachen LDAP-Übereinstimmungsregel kann weitaus effizienter sein als ein großes Skript. Unter Verwendung unseres Beispiel-Domänen domain.local ist Kristin Diaz ein direktes Mitglied der Sicherheitsgruppe Professional Services Department. Wenn wir ihr memberOf
-Attribut in AD betrachten, spiegelt sich dies wider; nur Professional Services Department wird angezeigt.
Durch die Verwendung der Übereinstimmungsregel-OID oder des RecursiveMatch
-Parameters stellt sich heraus, dass sie indirekt Mitglied von All Departments Share Access sind. Dies liegt daran, dass die Gruppe Professional Services Department Mitglied von All Departments Share Access ist.
Beide geben folgendes zurück:
Die SearchBase- und SearchScope-Parameter
In großen Umgebungen kann AD viele Tausende von Objekten enthalten. Eine Möglichkeit, die Leistung zu verbessern und die Anzahl der für eine Abfrage zurückgegebenen Objekte zu verringern, besteht darin, die Suche zu begrenzen.
Der Parameter SearchBase
bestimmt, wo in der AD-Hierarchie die Suche beginnt. Bei Verwendung der Cmdlets handelt es sich dabei um eine Zeichenfolgendarstellung eines distinguierenden Namens (und standardmäßig um die „oberste“ Ebene der Domäne). Es gibt auch drei Ebenen von SearchScope
:
- Base – Das Objekt, das als SearchBase angegeben wurde.
- OneLevel – sucht nach Objekten, die unmittelbar von der SearchBase enthalten sind, aber nicht in Untercontainern.
- SubTree – sucht nach Objekten, die von der SearchBase und in allen Untercontainern enthalten sind, rekursiv durch die AD-Hierarchie.

Im obigen Beispiel, mit dem SearchBase auf OU=Alle Benutzerkonten,DC=domain,DC=local festgelegt, würde ein SearchScope
von Base
versuchen, das OU-Objekt selbst abzufragen, ein SearchScope
von OneLevel
würde nur die OU Alle Benutzerkonten durchsuchen, und ein SearchScope
von SubTree
würde sowohl die OUs Alle Benutzerkonten als auch Professionelle Dienste durchsuchen.
Zusammenfassung
Sie sollten nun ein gutes Verständnis dafür haben, wie man mit den Active Directory PowerShell-Cmdlets filtert. Sie sehen, dass es viel Arbeit erfordert, die perfekte Filter-Syntax zu erstellen. Es ist viel schwieriger, den geeigneten Filter zu erstellen, als das Where-Object
-Cmdlet zu verwenden.
Aber investieren Sie die Zeit, um auf die ‚richtige‘ Weise AD-Objekte zu filtern, und genießen Sie die Vorteile einer großartigen Leistung und Effizienz!