Active Directory - PowerShell

PowerShell e Active Directory: Ricerche e filtri avanzati

Per trovare oggetti specifici in Active Directory è possibile usare diversi meccanismi di filtro in PowerShell. I parametri principali sono -Filter-LDAPFilter-SearchBase e -SearchScope, applicabili ai cmdlet Get-ADUserGet-ADGroupGet-ADComputer e Get-ADObject.

Sintassi dei comandi

Filtrare utenti con -Filter

# Utenti di un determinato dipartimento
Get-ADUser -Filter {Department -eq "IT"} -Properties Department

# Utenti con account disabilitato
Get-ADUser -Filter {Enabled -eq $false}

# Utenti con account che scade entro 30 giorni
$data = (Get-Date).AddDays(30)
Get-ADUser -Filter {AccountExpirationDate -lt $data -and AccountExpirationDate -ne "00/00/0000 00:00:00"} -Properties AccountExpirationDate

Filtrare con -LDAPFilter

# Utenti con email impostata
Get-ADUser -LDAPFilter "(mail=*)"

# Utenti membri di un gruppo specifico
Get-ADUser -LDAPFilter "(memberOf=CN=GRP_IT,OU=Gruppi,DC=dominio,DC=local)"

# Account mai utilizzati (lastLogon non impostato)
Get-ADUser -LDAPFilter "(!lastLogon=*)"

-LDAPFilter permette di usare la sintassi LDAP nativa, utile per query più complesse o non supportate da -Filter.

Limitare la ricerca a una OU con -SearchBase

# Cercare solo dentro una OU specifica
Get-ADUser -Filter * -SearchBase "OU=Utenti,DC=dominio,DC=local"

Controllare la profondità con -SearchScope

# Base: solo l'oggetto indicato in SearchBase
Get-ADUser -Filter * -SearchBase "OU=Utenti,DC=dominio,DC=local" -SearchScope Base

# OneLevel: solo i figli diretti (non ricorsivo)
Get-ADUser -Filter * -SearchBase "OU=Utenti,DC=dominio,DC=local" -SearchScope OneLevel

# Subtree: tutta la struttura sotto (default)
Get-ADUser -Filter * -SearchBase "OU=Utenti,DC=dominio,DC=local" -SearchScope Subtree

Per impostazione predefinita i cmdlet AD restituiscono solo un sottoinsieme di attributi. È possibile richiederne altri specificando l’opzione -Properties

# Proprietà specifiche
Get-ADUser -Filter * -Properties EmailAddress, Department, LastLogonDate |
    Select-Object Name, EmailAddress, Department, LastLogonDate

# Tutte le proprietà disponibili
Get-ADUser -Identity "mario.rossi" -Properties *

Affinare i risultati con Where-Object

# Utenti che non accedono da più di 90 giorni
$soglia = (Get-Date).AddDays(-90)
Get-ADUser -Filter {Enabled -eq $true} -Properties LastLogonDate |
    Where-Object { $_.LastLogonDate -lt $soglia -or $_.LastLogonDate -eq $null }

Esempio di utilizzo

Scenario: trovare tutti gli utenti abilitati del dipartimento IT che non accedono da più di 60 giorni, cercando solo all’interno di una OU specifica.

$soglia = (Get-Date).AddDays(-60)

Get-ADUser -Filter {Department -eq "IT" -and Enabled -eq $true} `
    -SearchBase "OU=Utenti,DC=dominio,DC=local" `
    -SearchScope Subtree `
    -Properties Department, LastLogonDate |
    Where-Object { $_.LastLogonDate -lt $soglia -or $_.LastLogonDate -eq $null } |
    Select-Object Name, SamAccountName, LastLogonDate |
    Sort-Object LastLogonDate

Output atteso:

Name          SamAccountName LastLogonDate
----          -------------- -------------
Marco Verdi   marco.verdi
Mario Rossi   mario.rossi    2026-02-10 08:45:00

Gli utenti senza LastLogonDate non hanno mai effettuato l’accesso o il valore non è stato ancora replicato tra i Domain Controller.