Beheers je LDAP-filters in PowerShell terwijl je AD leert

Een van de meest voorkomende struikelblokken bij het opvragen van Active Directory met PowerShell is hoe je de filter-syntax op de juiste manier opbouwt. De Filter en LDAP Filter parameters op alle cmdlets van de ActiveDirectory PowerShell-module zijn voor velen een black box.

In deze blogpost gaan we diep in op het begrijpen van hoe je Active Directory-filters kunt gebruiken. Ik hoop dat je aan het einde van deze post niet langer zult proberen die Where-Object en filter correct te gebruiken!

Vereisten

Om een van de codes die ik ga laten zien te laten werken, ga ik ervan uit dat een paar dingen gelden:

Er zijn twee verschillende filtertalen die je kunt gebruiken bij het zoeken naar objecten met behulp van veel van de Active Directory-cmdlets: PowerShell-filters en LDAP-filters.

PowerShell-filters

PowerShell-filters gebruiken de standaard PowerShell-uitdrukkingssyntax. Dit wordt vaak aangeduid als Active Directory-zoekfilter-syntax.

Deze filters worden gebruikt met de Filter-parameter. De syntaxis van de Filter-parameter

Operators

Tijdens het bouwen van een filter voor de Filter-parameter, moet je minstens één operator gebruiken. De hier gebruikte operators zijn de bekende operators die je misschien gewend bent bij het gebruik van opdrachten zoals Where-Object.

Binnen de Filter-parameter kun je de volgende operators gebruiken.

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

Verwijs naar AD Object Eigenschappen

Binnen het filter vergelijk je verschillende AD object eigenschappen met behulp van operatoren. Bijvoorbeeld, de Get-AdUser cmdlet retourneert een Name eigenschap. Als je alle gebruikers wilt vinden die overeenkomen met een specifieke naam, zou je gebruiken:

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

Eigenschapsnamen kunnen de naam of LDAP-filternaam zijn van de eigenschap die wordt geretourneerd met de AD cmdlet.

Eigenschapswaarden worden meestal omringd door enkele of dubbele aanhalingstekens. Het enige jokerteken dat wordt geaccepteerd, is het asterisk (*). Je kunt hierboven zien dat het filter is omgeven door dubbele aanhalingstekens, maar Adam Bertram is omringd door enkele aanhalingstekens.

Bepaalde tekens moeten worden ‘ontsnapt’ wanneer ze worden gebruikt in filters. Dit zijn:

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.

Wat is Active Directory LDAP?

LDAP, of Lightweight Directory Access Protocol, is een leveranciersonafhankelijk protocol voor het benaderen en wijzigen van directorygegevens. Bij het horen van het woord directory denkt u misschien aan een telefoonboek, maar in de context van Active Directory betekent dit veel meer. Veel verschillende objecttypen worden opgeslagen en toegankelijk gemaakt door Active Directory met het LDAP-protocol als middel om die gegevens te benaderen.

Omdat Active Directory veel verschillende datatypen kan opslaan, hebben applicaties en gebruikers een manier nodig om die directory gemakkelijk te bevragen. Lees verder om te leren hoe LDAP-filters helpen bij het filteren van die gegevens!

LDAP-filters

Active Directory implementeert LDAP, het Lightweight Directory Access Protocol. Door de LDAPFilter-parameter te gebruiken met de cmdlets, kunt u LDAP-filters gebruiken, zoals die gemaakt zijn in Active Directory Users and Computers.

De syntax voor LDAP-filters is gedefinieerd in RFC-nummer 4515.

Elke filterregel is omgeven door haakjes ( ). Filterregels kunnen worden gegroepeerd door de groep tussen haakjes te plaatsen en een vergelijker uit de volgende op te nemen:

Operator Function
& and
| or
! not

LDAP-filters hebben ook een speciale overeenkomstregel Object IDentifiers (OID’s):

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)

Er zijn vier filtertypen:

Operator Explanation
= Equal to
~= Approximately equal to
>= Greater than or equal to
<= Less than or equal to

Er zijn vier itemtypen:

Type Explanation
= Simple
=* Present
=something* Substring
Extensible varies depending on type

De LDAP-filterregels moeten worden gebruikt met de LDAP-namen van attributen, en bepaalde tekenwaarden moeten ‘geëscapet’ worden als ze worden gebruikt in een LDAP-filter. Dit zijn: assistent:

Character Escaped As
* \2a
( \28
) \29
\ \5c
NUL \00

Propertywaarden voor vergelijking hoeven doorgaans niet tussen aanhalingstekens te worden geplaatst.

LDAP-filtervoorbeelden

Het bouwen van LDAP-filters kan uitdagend zijn. Hier zijn enkele voorbeelden van filters voor actieve directorygroepen die u als basis kunt gebruiken om uw eigen filters te maken.

  • Alle groepen met een naam (cn) van ‘Professional Services Department’

    'cn -eq "Professional Services Department"' of `'(cn=Professional Services Department)'

  • Alle groepen met een naam van ‘Professional Services Department’ en een beschrijving van ‘Live’

    '(cn -eq "Professional Services Department") -and (description -eq "Live")' of '(&(cn=Professional Services Department)(description=Live))'

  • Alle groepen met een naam van ‘Professional Services Department’ of ‘All Departments Share Access’

    '(cn -eq "Professional Services Department") -or (cn -eq "All Departments Share Access")' of '(|(cn=Professional Services Department)(cn=All Departments Share Access))'

  • Alle groepen die geen beschrijving hebben van ‘Live’. Bevat diegene zonder beschrijvingsveld helemaal niet

    '(!(description=Live))'

  • Alle groepen die geen beschrijving hebben van ‘Live’. Sluit diegenen uit zonder beschrijvingsveld helemaal niet

    'description -ne "Live"'

  • Alle groepen met een beschrijving van ‘Live’ maar niet met een naam van ‘Professional Services Department’

    '(description -eq "Live") -and (cn -ne "Professional Services Department")' of '(&(description=Live)(!(cn=Professional Services Department)))'

  • Alle groepen waarvan de beschrijving ‘ \\ fileserver1 \ fileshare ‘ is

    'description -eq "\5c\5cfileserver1\5cfileshare"' of '(description=\5c\5cfileserver1\5cfileshare)'

Het gebruik van RecursiveMatch of Chain Matching

Het gebruik van een overeenkomstige regel OID, of de RecursiveMatch-parameter is een krachtige manier om een vaak gestelde vraag over het bevragen van AD op te lossen: ‘Hoe kan ik alle groepen achterhalen waar een gebruiker lid van is, zowel direct als indirect?’ Je gebruikt de Active Directory Search Filter memberOf-eigenschap om erachter te komen.

Het gebruik van een eenvoudige LDAP-vergelijkingsregel kan veel efficiënter zijn dan een groot script. Bij ons voorbeeld domein domain.local is Kristin Diaz een direct lid van de beveiligingsgroep Professional Services Department. Als we naar haar memberOf-eigenschap in AD kijken, wordt dit weerspiegeld; alleen Professional Services Department wordt weergegeven.

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 :

Door gebruik te maken van de overeenkomstregel OID, of de RecursiveMatch-parameter, zult u ontdekken dat ze indirect lid zijn van All Departments Share Access. Dit komt doordat de groep Professional Services Department lid is van All Departments Share Access.

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 retourneren het volgende:

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

De parameters SearchBase en SearchScope

In grote omgevingen kan AD veel duizenden objecten bevatten. Een manier om de prestaties te verbeteren en het aantal geretourneerde objecten voor een query te verminderen, is door de zoekopdracht te beperken.

De parameter SearchBase bepaalt waar in de AD-hiërarchie een zoekopdracht begint. Bij het gebruik van de cmdlets is dit een stringrepresentatie van een onderscheiden naam (en standaard is dit de ’top’ van het domein). Er zijn ook drie niveaus van SearchScope:

  1. Base – Het object dat is opgegeven als de SearchBase.
  2. OneLevel – zoekt naar objecten die onmiddellijk door de SearchBase worden ingesloten maar niet in enige subcontainers.
  3. SubTree – zoekt naar objecten die door de SearchBase worden ingesloten en in alle subcontainers, recursief door de AD-hiërarchie heen.
Example OU Structure

In het bovenstaande voorbeeld, met de SearchBase ingesteld op OU=Alle Gebruikersaccounts,DC=domein,DC=lokaal, zou een SearchScope van Basis proberen het OU-object zelf te bevragen, een SearchScope van OneLevel zou alleen de OU Alle Gebruikersaccounts doorzoeken, en een SearchScope van SubTree zou zowel de OU’s Alle Gebruikersaccounts als Professionele Diensten doorzoeken.

Samenvatting

Je zou nu een goed begrip moeten hebben van hoe je kunt filteren met de Active Directory PowerShell-cmdlets. Je kunt zien dat er veel komt kijken bij het maken van de perfecte filtersyntax. Het is veel moeilijker om de juiste filter te maken dan om de Where-Object-cmdlet te gebruiken.

Maar besteed de tijd aan het leren van de ‘juiste’ manier om AD-objecten te filteren en pluk de vruchten van geweldige prestaties en efficiëntie!

Verder lezen

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