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:
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.
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.
Entrambi restituiscono quanto segue:
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
:
- Base – L’oggetto specificato come SearchBase.
- OneLevel – Cerca gli oggetti immediatamente contenuti dal SearchBase ma non in eventuali sottocartelle.
- SubTree – Cerca gli oggetti contenuti dal SearchBase e in eventuali sottocartelle, ricorsivamente attraverso la gerarchia di AD.

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!