about_WQL
Aggiornamento: maggio 2014
Si applica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0
ARGOMENTO
about_WQL
DESCRIZIONE BREVE
Descrive il linguaggio WMI Query Language (WQL), che può essere usato per ottenere oggetti WMI in Windows PowerShell®.
DESCRIZIONE LUNGA
WQL è il linguaggio di query di Strumentazione gestione Windows (WMI), ovvero il linguaggio usato per ottenere informazioni da WMI.
Non è necessario usare il linguaggio WQL per eseguire una query WMI in Windows PowerShell. È invece possibile usare i parametri dei cmdlet Get-WmiObject o Get-CimInstance. Le query WQL sono leggermente più veloci dei comandi Get-WmiObject standard e il miglioramento delle prestazioni è evidente quando i comandi vengono eseguiti in centinaia di sistemi. Tuttavia, assicurarsi che il tempo impiegato per scrivere una query WQL efficace non sia eccessivo rispetto al miglioramento delle prestazioni.
Le istruzioni WQL di base necessarie per usare WQL sono Select, Where e From.
QUANDO USARE WQL
Quando si usa WMI, e in particolare WQL, tenere presente che si sta utilizzando anche Windows PowerShell. Se una query WQL non funziona come previsto, spesso è più facile usare un comando di Windows PowerShell standard, anziché eseguire il debug della query WQL.
A meno che non vengano restituite enormi quantità di dati tra sistemi remoti con larghezza di banda limitata, raramente è produttivo impiegare ore nel tentativo di perfezionare una query WQL intricata e complicata quando esiste un cmdlet di Windows perfettamente accettabile che effettua la stessa operazione, anche se un po' più lentamente.
USO DELL'ISTRUZIONE SELECT
Una query WMI tipica inizia con un'istruzione Select che recupera tutte le proprietà o particolari proprietà di una classe WMI. Per selezionare tutte le proprietà di una classe WMI, usare un asterisco (*). La parola chiave From specifica la classe WMI.
Il formato di un'istruzione Select è il seguente:
Select <property> from <WMI-class>
Ad esempio, l'istruzione Select seguente seleziona tutte le proprietà (*) dalle istanze della classe WMI Win32_Bios.
Select * from Win32_Bios
Per selezionare una particolare proprietà di una classe WMI, inserire il nome della proprietà tra le parole chiave Select e From.
La query seguente seleziona solo il nome del BIOS dalla classe WMI Win32_Bios. Il comando salva la query nella variabile $queryName.
Select Name from Win32_Bios
Per selezionare più di una proprietà, usare le virgole per separare i nomi delle proprietà. La query WMI seguente seleziona il nome e la versione della classe WMI Win32_Bios. Il comando salva la query nella variabile $queryNameVersion.
Select name, version from Win32_Bios
USO DELLA QUERY WQL
Esistono due modi per usare la query WQL nel comando di Windows PowerShell.
Usare il cmdlet Get-WmiObject
Usare il cmdlet Get-CimInstance
Usare l'acceleratore di tipo [wmisearcher].
USO DEL CMDLET GET-WMIOBJECT
Il modo più semplice per usare la query WQL è racchiuderla tra virgolette (sotto forma di stringa) e quindi utilizzare la stringa di query come valore del parametro Query del cmdlet Get-WmiObject, come illustrato nell'esempio seguente.
PS C:\> Get-WmiObject -Query "Select * from Win32_Bios"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO – 1360
È anche possibile salvare l'istruzione WQL in una variabile e quindi usare la variabile come valore del parametro Query, come illustrato nel comando seguente.
PS C:\> $query = "Select * from Win32_Bios"
PS C:\> Get-WmiObject –Query $query
È possibile usare entrambi i formati con qualsiasi istruzione WQL. Il comando seguente usa la query nella variabile $queryName per ottenere solo le proprietà del nome e della versione del BIOS del sistema.
PS C:\> $queryNameVersion = "Select Name, Version from Win32_Bios"
PS C:\> Get-WmiObject -Query $queryNameVersion
__GENUS : 2
__CLASS : Win32_BIOS
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Name : Default System BIOS
Version : LENOVO - 1360
Tenere presente che è possibile usare i parametri del cmdlet Get-WmiObject per ottenere lo stesso risultato. Ad esempio, il comando seguente ottiene anche i valori delle proprietà Name e Version delle istanze della classe WMI Win32_Bios.
PS C:\> Get-WmiObject –Class Win32_Bios -Property Name, Version
__GENUS : 2
__CLASS : Win32_BIOS
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Name : Default System BIOS
Version : LENOVO - 1360
USO DEL CMDLET GET-CIMINSTANCE
A partire da Windows PowerShell 3.0, è possibile usare il cmdlet Get-CimInstance per eseguire query WQL.
Get-CimInstance ottiene le istanze delle classi compatibili con CIM, incluse le classi WMI. I cmdlet CIM, introdotti con Windows PowerShell 3.0, eseguono le stesse attività dei cmdlet WMI. Sono conformi agli standard WSMan (WS-Management) e allo standard CIM (Common Information Model), che consente di usare le stesse tecniche per gestire i computer Windows e quelli che eseguono altri sistemi operativi.
Il comando seguente usa il cmdlet Get-CimInstance per eseguire una query WQL.
Qualsiasi query WQL che è possibile usare con Get-WmiObject può essere utilizzata anche con Get-CimInstance.
PS C:\> Get-CimInstance -Query "Select * from Win32_Bios"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO – 1360
Get-CimInstance restituisce un oggetto CimInstance, anziché l'oggetto ManagementObject restituito da Get-WmiObject, ma tali oggetti sono molto simili.
PS C:\>(Get-CimInstance -Query "Select * from Win32_Bios").GetType().FullName
Microsoft.Management.Infrastructure.CimInstance
PS C:\>(Get-WmiObject -Query "Select * from Win32_Bios").GetType().FullName
System.Management.ManagementObject
USO DELL'ACCELERATORE DI TIPO [wmisearcher]
L'acceleratore di tipo [wmisearcher] crea un oggetto ManagementObjectSearcher da una stringa di istruzione WQL. L'oggetto ManagementObjectSearcher presenta molte proprietà e metodi, ma il metodo più semplice è il metodo Get, che richiama la query WMI specificata e restituisce gli oggetti risultanti.
Mediante [wmisearcher], si accede facilmente alla classe .NET Framework ManagementObjectSearcher. Ciò consente di eseguire una query WMI e configurare la modalità di esecuzione della query.
Per usare l'acceleratore di tipo [wmisearcher]:
1. Eseguire il cast della stringa WQL in un oggetto ManagementObjectSearcher.
2. Chiamare il metodo Get dell'oggetto ManagementObjectSearcher.
Ad esempio, il comando seguente esegue il cast della query "select all", salva il risultato nella variabile $bios e quindi chiama il metodo Get dell'oggetto ManagementObjectSearcher nella variabile $bios.
PS C:\> $bios = [wmisearcher]"Select * from Win32_Bios"
PS C:\> $bios.Get()
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO – 1360
NOTA:
Per impostazione predefinita, vengono visualizzate solo le proprietà dell'oggetto selezionato. Tali proprietà sono definite nel file Types.ps1xml.
È possibile usare l'acceleratore di tipo [wmisearcher] per eseguire il cast della query o della variabile. Nell'esempio seguente l'acceleratore di tipo [wmisearcher] viene usato per eseguire il cast della variabile. Il risultato è identico.
PS C:\> [wmisearcher]$bios = "Select * from Win32_Bios"
PS C:\> $bios.Get()
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO – 1360
Quando si usa l'acceleratore di tipo [wmisearcher], la stringa di query diventa un oggetto ManagementObjectSearcher, come illustrato nei comandi seguenti.
PS C:\>$a = "Select * from Win32_Bios"
PS C:\>$a.GetType().FullName
System.String
PS C:\>$a = [wmisearcher]"Select * from Win32_Bios"
PS C:\>$a.GetType().FullName
System.Management.ManagementObjectSearcher
Questo formato di comando funziona su tutte le query. Il comando seguente ottiene il valore della proprietà Name della classe WMI Win32_Bios.
PS C:\> $biosname = [wmisearcher]"Select Name from Win32_Bios"
PS C:\> $biosname.Get()
__GENUS : 2
__CLASS : Win32_BIOS
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Name : Default System BIOS
È possibile eseguire questa operazione in un unico comando, anche se il comando è un po' più difficile da interpretare.
In questo formato, si usa l'acceleratore di tipo [wmisearcher] per eseguire il cast della stringa di query WQL in ManagementObjectSearcher e quindi si chiama il metodo Get nell'oggetto: il tutto con un unico comando. Le parentesi () che racchiudono la stringa sottoposta a cast impostano Windows PowerShell in modo che esegua il cast della stringa prima di chiamare il metodo.
PS C:\> ([wmisearcher]"Select name from Win32_Bios").Get()
__GENUS : 2
__CLASS : Win32_BIOS
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Name : Default System BIOS
USO DELL'ISTRUZIONE WQL DI BASE WHERE
Un'istruzione Where stabilisce le condizioni per i dati restituiti da un'istruzione Select.
L'istruzione Where dispone del formato seguente:
where <property> <operator> <value>
Ad esempio:
where Name = 'Notepad.exe'
L'istruzione Where viene usata con l'istruzione Select, come illustrato nell'esempio seguente.
Select * from Win32_Process where Name = 'Notepad.exe'
Quando si usa l'istruzione Where, il valore e il nome della proprietà devono essere precisi.
Ad esempio, il comando seguente ottiene i processi Notepad nel computer locale.
PS C:\> Get-WmiObject -Query "Select * from Win32_Process where name = 'Notepad.exe'"
Tuttavia, il comando seguente ha esito negativo poiché il nome del processo include l'estensione di file ".exe".
PS C:\> Get-WmiObject -Query "Select * from Win32_Process where name = 'Notepad'"
OPERATORI DI CONFRONTO DELL'ISTRUZIONE WHERE
Gli operatori seguenti sono validi in un'istruzione WQL Where.
Operator Description
-----------------------
= Equal
!= Not equal
<> Not equal
< Less than
> Greater than
<= Less than or equal
>= Greater than or equal
LIKE Wildcard match
IS Evaluates null
ISNOT Evaluates not null
ISA Evaluates a member of a WMI class
Esistono altri operatori, ma questi sono quelli usati per l'esecuzione di confronti.
Ad esempio, la query seguente seleziona le proprietà Name e Priority dai processi nella classe Win32_Process in cui la priorità dei processi è maggiore o uguale a 11. Il cmdlet Get-WmiObject esegue la query.
$highPriority = "Select Name, Priority from Win32_Process where Priority >= 11"
Get-WmiObject -Query $highPriority
USO DEGLI OPERATORI WQL NEL PARAMETRO FILTER
Gli operatori WQL possono anche essere usati nel valore del parametro Filter dei cmdlet Get-WmiObject o Get-CimInstance, nonché nel valore dei parametri Query di questi cmdlet.
Ad esempio, il comando seguente ottiene le proprietà Name e ProcessID degli ultimi cinque processi con valori ProcessID maggiori di 1004. Il comando usa il parametro Filter per specificare la condizione ProcessID.
PS C:\> Get-WmiObject -Class Win32_Process `
-Property Name, ProcessID -Filter "ProcessID >= 1004" |
Sort ProcessID | Select Name, ProcessID -Last 5
Name ProcessID
---- ---------
SROSVC.exe 4220
WINWORD.EXE 4664
TscHelp.exe 4744
SnagIt32.exe 4748
WmiPrvSE.exe 5056
USO DELL'OPERATORE LIKE
L'operatore Like consente di usare caratteri jolly per filtrare i risultati di una query WQL.
Descrizione dell'operatore Like
[]
Un carattere in un intervallo [a-f] o un set di caratteri [abcdef]. Non è necessario che gli elementi di un set siano consecutivi o elencati in ordine alfabetico.
^
Un carattere non incluso in un intervallo [^a-f] o in un set [^abcdef]. Non è necessario che gli elementi di un set siano consecutivi o elencati in ordine alfabetico.
%
Una stringa di zero o più caratteri
_
Un carattere.
(carattere di sottolineatura)
NOTA:
per usare un carattere di sottolineatura letterale in una stringa di query, racchiuderlo tra parentesi quadre [_].
Se l'operatore Like viene usato senza operatori di intervallo o caratteri jolly, si comporta come l'operatore di uguaglianza (=) e restituisce gli oggetti solo se presentano una corrispondenza esatta per il modello.
È possibile combinare l'operazione sull'intervallo con il carattere jolly di percentuale per creare filtri semplici ma potenti.
ESEMPI RELATIVI ALL'OPERATORE LIKE
ESEMPIO 1: [<intervallo>]
I comandi seguenti avviano Blocco note, quindi cercano un'istanza della classe Win32_Process il cui nome inizia con una lettera compresa tra "H" e "N" (senza distinzione tra maiuscole e minuscole).
La query restituisce tutti i processi compresi tra Hotpad.exe e Notepad.exe.
PS C:\> Notepad # Starts Notepad
PS C:\> $query = "Select * from win32_Process where Name LIKE '[H-N]otepad.exe'"
PS C:\> Get-WmiObject -Query $query | Select Name, ProcessID
Name ProcessID
---- ---------
notepad.exe 1740
ESEMPIO 2: [<intervallo>] e %
I comandi seguenti selezionano tutti i processi con un nome che inizia con una lettera compresa tra A e P (senza distinzione tra maiuscole e minuscole) seguita da zero o più lettere in qualsiasi combinazione.
Il cmdlet Get-WmiObject esegue la query, il cmdlet Select-Object ottiene le proprietà Name e ProcessID e il cmdlet Sort-Object organizza i risultati in ordine alfabetico in base al nome.
PS C:\>$query = "Select * from win32_Process where name LIKE '[A-P]%'"
PS C:\>Get-WmiObject -Query $query |
Select-Object -Property Name, ProcessID |
Sort-Object -Property Name
ESEMPIO 3: Non compreso nell'intervallo (^)
Il comando riportato di seguito ottiene i processi i cui nomi non iniziano con una delle lettere seguenti: A, S, W, P, R, C, U, N e seguite da zero o più lettere.
PS C:\>$query = "Select * from win32_Process where name LIKE '[^ASWPRCUN]%'"
PS C:\>Get-WmiObject -Query $query |
Select-Object -Property Name, ProcessID |
Sort-Object -Property Name
ESEMPIO 4: Tutti i caratteri o nessuno (%)
I comandi seguenti ottengono i processi con nomi che iniziano con "calc". Il simbolo % in WQL è identico al simbolo dell'asterisco (*) nelle espressioni regolari.
PS C:\> $query = "Select * from win32_Process where Name LIKE 'calc%'"
PS C:\> Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name ProcessID
---- ---------
calc.exe 4424
ESEMPIO 5: Un solo carattere (_)
I comandi seguenti ottengono i processi con nomi nel formato seguente, "c_lc.exe", in cui il carattere di sottolineatura rappresenta un carattere qualsiasi. Questo modello corrisponde a qualsiasi nome compreso tra calc.exe e czlc.exe o c9lc.exe, ma non corrisponde a nomi in cui "c" e "l" sono separate da più di un carattere.
PS C:\> $query = "Select * from Win32_Process where Name LIKE 'c_lc.exe'"
PS C:\> Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name ProcessID
---- ---------
calc.exe 4424
ESEMPIO 6: Corrispondenza esatta
I comandi seguenti ottengono processi denominati WLIDSVC.exe. Anche se la query usa la parola chiave Like, è necessaria una corrispondenza esatta perché il valore non include i caratteri jolly.
$query = "Select * from win32_Process where name LIKE 'WLIDSVC.exe'"
Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name ProcessID
---- ---------
WLIDSVC.exe 84
USO DELL'OPERATORE OR
Per specificare più condizioni indipendenti, usare la parola chiave Or. Nella clausola Where viene visualizzata la parola chiave Or. Esegue un'operazione OR inclusiva su due (o più) condizioni e restituisce gli elementi che soddisfano una delle condizioni.
L'operatore Or ha il formato seguente:
Where <property> <operator> <value> or <property> <operator> <value> ...
Ad esempio, i comandi seguenti ottengono tutte le istanze della classe WMI Win32_Process, ma le restituiscono solo se il nome del processo è winword.exe o excel.exe.
PS C:\>$q = "Select * from Win32_Process where Name = 'winword.exe' or Name = 'excel.exe'"
PS C:\>Get-WmiObject -Query $q
L'istruzione Or può essere usata con più di due condizioni. Nella query seguente l'istruzione Or ottiene Winword.exe, Excel.exe o Powershell.exe.
$q = "Select * from Win32_Process where Name = 'winword.exe' or Name = 'excel.exe' or Name = 'powershell.exe'"
USO DELL'OPERATORE AND
Per specificare più condizioni correlate, usare la parola chiave And. Nella clausola Where viene visualizzata la parola chiave And. Restituisce gli elementi che soddisfano tutte le condizioni.
L'operatore And ha il formato seguente:
Where <property> <operator> <value> and <property> <operator> <value> ...
Ad esempio, i comandi seguenti ottengono i processi denominati "Winword.exe" con ID di processo 6512.
Si noti che i comandi usano il cmdlet Get-CimInstance.
PS C:\>$q = "Select * from Win32_Process where Name = 'winword.exe' and ProcessID =6512"
PS C:\> Get-CimInstance -Query $q
ProcessId Name HandleCount WorkingSetSize VirtualSize
--------- ---- ----------- -------------- -----------
6512 WINWORD.EXE 768 117170176 633028608
Tutti gli operatori, inclusi gli operatori Like, sono validi con gli operatori Or e And. È anche possibile combinare gli operatori Or e And in un'unica query con parentesi che indicano a Windows PowerShell quali clausole elaborare per prime.
Questo comando usa il carattere di continuazione di Windows PowerShell (`) per dividere il comando in due righe.
PS C:\> $q = "Select * from Win32_Process `
where (Name = 'winword.exe' or Name = 'excel.exe') and HandleCount > 700"
PS C:\> Get-CimInstance -Query $q
ProcessId Name HandleCount WorkingSetSize VirtualSize
--------- ---- ----------- -------------- -----------
6512 WINWORD.EXE 797 117268480 634425344
9610 EXCEL.EXE 727 38858752 323227648
RICERCA DI VALORI NULL
La ricerca di valori Null in WMI è complessa perché può generare risultati imprevedibili. Null è diverso da zero e non è equivalente a una stringa vuota. Alcune proprietà delle classi WMI sono inizializzate e altre no, pertanto la ricerca di un valore Null potrebbe non essere adatta a tutte le proprietà.
Per cercare i valori Null, usare l'operatore Is con un valore "null".
Ad esempio, i comandi seguenti ottengono processi con valore Null per la proprietà IntallDate. I comandi restituiscono molti processi.
PS C:\>$q = "Select * from Win32_Process where InstallDate is null"
PS C:\>Get-WmiObject -Query $q
Al contrario, il comando seguente ottiene gli account utente con valore Null per la proprietà Description. Questo comando non restituisce alcun account utente, anche se la maggior parte degli account utente non presenta alcun valore per la proprietà Description.
PS C:\>$q = "Select * from Win32_UserAccount where Description is null"
PS C:\>Get-WmiObject -Query $q
Per trovare gli account utente senza valore per la proprietà Description, usare l'operatore di uguaglianza per ottenere una stringa vuota. Per rappresentare la stringa vuota, usare due virgolette singole consecutive.
$q = "Select * from Win32_UserAccount where Description = '' "
USO DI TRUE O FALSE
Per ottenere i valori booleani nelle proprietà degli oggetti WMI, usare True e False, che non distinguono tra maiuscole e minuscole.
La query WQL seguente restituisce solo gli account utente locali da un computer aggiunto al dominio.
PS C:\>$q = "Select * from Win32_UserAccount where LocalAccount = True"
PS C:\>Get-CimInstance -Query $q
Per trovare gli account di dominio, usare il valore False, come illustrato nell'esempio seguente.
PS C:\>$q = "Select * from Win32_UserAccount where LocalAccount = False"
PS C:\>Get-CimInstance -Query $q
USO DEL CARATTERE DI ESCAPE
WQL usa la barra rovesciata (\) come carattere di escape. Windows PowerShell, invece, usa il carattere dell'apice inverso (`).
Le virgolette e i caratteri usati come virgolette spesso devono essere preceduti da caratteri di escape per evitare che vengano interpretati in modo errato.
Per trovare un utente il cui nome include una virgoletta singola, usare una barra rovesciata come carattere di escape per la virgoletta singola, come illustrato nel comando seguente.
PS C:\> $q = "Select * from Win32_UserAccount where Name = 'Tim O\'Brian'"
PS C:\> Get-CimInstance -Query $q
Name Caption AccountType SID Domain
---- ------- ----------- --- ------
Tim O'Brian FABRIKAM\TimO 512 S-1-5-21-1457... FABRIKAM
In alcuni casi, anche la barra rovesciata deve essere preceduta da un carattere di escape. Ad esempio, i comandi seguenti generano un errore di query non valida a causa della barra rovesciata nel valore Caption.
PS C:\> $q = "Select * from Win32_UserAccount where Caption = 'Fabrikam\TimO'"
PS C:\> Get-CimInstance -Query $q
Get-CimInstance : Invalid query
At line:1 char:1
+ Get-CimInstance -Query $q
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-CimInstance], CimException
+ FullyQualifiedErrorId : HRESULT 0x80041017,Microsoft.Management.Infrastructure.CimCmdlets
Per inserire un carattere di escape per la barra rovesciata, usare una seconda barra rovesciata, come mostrato nel comando seguente.
PS C:\> $q = "Select * from Win32_UserAccount where Caption = 'Fabrikam\\TimO'"
PS C:\> Get-CimInstance -Query $q
VEDERE ANCHE
about_Escape_Characters
about_Quoting_Rules
about_WMI
about_WMI_Cmdlets