Meistern Sie Ihre LDAP-Filter in PowerShell, während Sie AD lernen

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:

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:

PS51> Get-Aduser -Filter "Name -eq 'Adam Bertram'"

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.

PS51> Get-ADUser -Identity Kristin.Diaz -Property memberOf

DistinguishedName : CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local
Enabled           : True
GivenName         : Kristin
MemberOf          : {CN=Professional Services Department,OU=All Groups,DC=domain,DC=local}
Name              : Diaz Kristin
ObjectClass       : user
ObjectGUID        : 04fe6336-c541-4e71-b7ed-6fee7db23482
SamAccountName    : Kristin.Diaz
SID               : S-1-5-21-447422785-3715515833-3878445295-1186
Surname           : Diaz
UserPrincipalName :

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.

PS51> Get-ADGroup -LDAPFilter '(member:1.2.840.113556.1.4.1941:=CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local)'
PS51> Get-ADGroup -Filter 'member -RecursiveMatch "CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local"'

Beide geben folgendes zurück:

DistinguishedName : CN=All Departments Share Access,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : All Departments Share Access
ObjectClass       : group
ObjectGUID        : 8ac0e0b7-9225-40a4-b168-a0330960e182
SamAccountName    : All Departments Share Access
SID               : S-1-5-21-447422785-3715515833-3878445295-1254

DistinguishedName : CN=Professional Services Department,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : Professional Services Department
ObjectClass       : group
ObjectGUID        : a8432583-7cac-4e8e-8d94-51e1c5bb1989
SamAccountName    : Professional Services Department
SID               : S-1-5-21-447422785-3715515833-3878445295-1255

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:

  1. Base – Das Objekt, das als SearchBase angegeben wurde.
  2. OneLevel – sucht nach Objekten, die unmittelbar von der SearchBase enthalten sind, aber nicht in Untercontainern.
  3. SubTree – sucht nach Objekten, die von der SearchBase und in allen Untercontainern enthalten sind, rekursiv durch die AD-Hierarchie.
Example OU Structure

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!

Weitere Lektüre

Source:
https://adamtheautomator.com/ldap-filter/