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:
- je hebt de PowerShell ActiveDirectory-module geïnstalleerd
- je werkt op een domeingejoinde computer
- je kunt met succes verbinden en authenticeren bij een AD-domeincontroller
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:
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.
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.
Beide retourneren het volgende:
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
:
- Base – Het object dat is opgegeven als de SearchBase.
- OneLevel – zoekt naar objecten die onmiddellijk door de SearchBase worden ingesloten maar niet in enige subcontainers.
- SubTree – zoekt naar objecten die door de SearchBase worden ingesloten en in alle subcontainers, recursief door de AD-hiërarchie heen.

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!