Padroneggia i filtri LDAP in PowerShell mentre impari AD

Uno dei problemi più comuni quando si interrogano Active Directory con PowerShell è come costruire correttamente la sintassi dei filtri. Il parametro Filter e i parametri dei filtri LDAP su tutti i cmdlet dei moduli PowerShell di ActiveDirectory sono un mistero per molti.

In questo post del blog, andremo in profondità nella comprensione di come utilizzare i filtri di Active Directory. Spero che alla fine di questo post, non proverai più a utilizzare quel Where-Object e filtrare correttamente!

Prerequisiti

Per far funzionare qualsiasi codice che sto per mostrarti, assumerò alcune cose:

  • che hai installato il modulo PowerShell ActiveDirectory
  • che sei su un computer associato a un dominio
  • che puoi connetterti e autenticarti con un controller di dominio AD

Esistono due diversi linguaggi di filtro che puoi utilizzare quando cerchi oggetti utilizzando molti dei cmdlet di Active Directory: i filtri di PowerShell e i filtri LDAP.

Filtri di PowerShell

I filtri di PowerShell utilizzano la sintassi espressione standard di PowerShell. Questo viene comunemente definito come sintassi di filtro di ricerca di Active Directory.

Questi filtri vengono utilizzati con il parametro Filter. Sintassi del parametro Filter

Operatori

Mentre costruisci un filtro per il parametro Filter, dovrai utilizzare almeno un operatore. Gli operatori utilizzati qui sono gli operatori familiari che potresti essere abituato a usare quando utilizzi comandi come Where-Object.

All’interno del parametro Filter, puoi utilizzare i seguenti operatori.

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

Riferimento alle proprietà degli oggetti AD

All’interno del filtro, comparirai varie proprietà degli oggetti AD utilizzando gli operatori. Ad esempio, il cmdlet Get-AdUser restituisce una proprietà Name. Se desideri trovare tutti gli utenti corrispondenti a un nome specifico, useresti:

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

I nomi delle proprietà possono essere il nome o il nome del filtro LDAP della proprietà restituita con il cmdlet AD.

I valori delle proprietà sono normalmente racchiusi tra virgolette singole o doppie. L’unico carattere jolly accettato è l’asterisco (*). Puoi vedere sopra che il filtro è circondato da virgolette doppie mentre Adam Bertram è circondato da virgolette singole.

Certain characters must be ‘escaped’ when used in filters. These are:

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.

Cosa è l’Active Directory LDAP?

LDAP, o Lightweight Directory Access Protocol, è un protocollo neutrale rispetto al fornitore per accedere e modificare i dati del directory. Potresti pensare a un elenco telefonico quando senti la parola directory, ma nel contesto di Active Directory, questo significa molto di più. Molti diversi tipi di oggetti sono memorizzati e resi accessibili da Active Directory con il protocollo LDAP che funge da mezzo per accedere a tali dati.

Poiché Active Directory può memorizzare molti tipi di dati diversi, le applicazioni e gli utenti hanno bisogno di un modo per interrogare facilmente quella directory. Continua a leggere per scoprire come i filtri LDAP assistono nel filtraggio di quei dati!

Filtri LDAP

Active Directory implementa LDAP, il Protocollo di Accesso al Directory Leggero. Utilizzando il parametro LDAPFilter con i cmdlet, è possibile utilizzare filtri LDAP, come quelli creati in Utenti e Computer di Active Directory.

La sintassi dei filtri LDAP è definita nella numero RFC 4515.

Ogni regola di filtro è circondata da parentesi ( ). Le regole dei filtri possono essere raggruppate circondando il gruppo tra parentesi e includendo un comparatore dai seguenti:

Operator Function
& and
| or
! not

I filtri LDAP hanno anche una regola di corrispondenza speciale Object IDentifiers (OID):

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)

Ci sono quattro tipi di filtri:

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

Ci sono quattro tipi di elementi:

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

Le regole dei filtri LDAP devono essere utilizzate con i nomi LDAP degli attributi, e determinati valori di carattere devono essere ‘escaped’ se utilizzati in un Filtro LDAP. Questi sono:
assistant:

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

Valori delle proprietà per confronto di solito non hanno bisogno di essere racchiusi tra virgolette.

Esempi di Filtro LDAP

Costruire filtri LDAP può essere impegnativo. Ecco alcuni esempi utilizzando filtri di gruppo del directory attivo che puoi usare come base per iniziare a creare i tuoi.

  • Tutti i gruppi con un nome (cn) di ‘Professional Services Department’

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

  • Tutti i gruppi con un nome di ‘Professional Services Department’ e una descrizione di ‘Live’

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

  • Tutti i gruppi con un nome di ‘Professional Services Department’ o ‘All Departments Share Access’

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

  • Tutti i gruppi che non hanno una descrizione di ‘Live’. Includono quelli senza campo di descrizione affatto.

    '(!(description=Live))'

  • Tutti i gruppi che non hanno una descrizione di ‘Live’. Eccetto quelli senza campo di descrizione affatto.

    'description -ne "Live"'

  • Tutti i gruppi con una descrizione di ‘Live’ ma non con un nome di ‘Professional Services Department’

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

  • Tutti i gruppi la cui descrizione è ‘\\fileserver1\fileshare’

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

Utilizzando RecursiveMatch o Chain Matching

Utilizzare un OID di regola di corrispondenza, o il parametro RecursiveMatch è un modo potente per risolvere una domanda spesso posta sulla query AD: ‘Come posso dire tutti i gruppi di cui un utente è membro, sia direttamente che indirettamente?’ Si utilizza la proprietà Active Directory Search Filter memberOf per scoprirlo.

Usare una semplice regola di corrispondenza LDAP può essere molto più efficiente di uno script complesso. Utilizzando il nostro dominio di esempio domain.local, Kristin Diaz è un membro diretto del gruppo di sicurezza Professional Services Department. Guardando alla sua proprietà memberOf in AD si riflette questo; solo Professional Services Department viene mostrato.

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 :

Utilizzando l’OID della regola di corrispondenza, o il parametro RecursiveMatch, si scoprirà che sono indirettamente membri di All Departments Share Access. Questo perché il gruppo Professional Services Department è membro di 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"'

Entrambi restituiscono quanto segue:

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

I Parametri SearchBase e SearchScope

Negli ambienti di grandi dimensioni, AD può contenere migliaia di oggetti. Un modo per migliorare le prestazioni e ridurre il numero di oggetti restituiti per ogni query è limitare la ricerca.

Il parametro SearchBase determina dove nella gerarchia di AD inizia la ricerca. Quando si utilizzano i cmdlet, questo è una rappresentazione stringa di un nome distinto (e per impostazione predefinita è il ‘top’ del dominio). Ci sono anche tre livelli di SearchScope:

  1. Base – L’oggetto specificato come SearchBase.
  2. OneLevel – Cerca gli oggetti immediatamente contenuti dal SearchBase ma non in eventuali sottocartelle.
  3. SubTree – Cerca gli oggetti contenuti dal SearchBase e in eventuali sottocartelle, ricorsivamente attraverso la gerarchia di AD.
Example OU Structure

Nell’esempio precedente, con il parametro SearchBase impostato su OU=All User Accounts,DC=domain,DC=local, un SearchScope di Base proverebbe a interrogare direttamente l’oggetto OU stesso, un SearchScope di OneLevel cercherebbe soltanto l’OU All User Accounts, mentre un SearchScope di SubTree cercerebbe sia gli OU All User Accounts che Professional Services.

Riepilogo

Ora dovresti avere una buona comprensione di come filtrare con i cmdlet PowerShell di Active Directory. Puoi notare che la sintassi del filtro perfetto richiede una certa pratica. Costruire il filtro appropriato è molto più complicato rispetto all’utilizzo del cmdlet Where-Object.

Ma prenditi il tempo per imparare il modo “corretto” di filtrare gli oggetti AD e godi dei vantaggi di prestazioni ed efficienza eccezionali!

Ulteriori Letture

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