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 wmi (Windows Management Instrumentation), che è il linguaggio usato per ottenere informazioni da WMI.
Non è necessario usare WQL per eseguire una query WMI in Windows PowerShell.
È invece possibile usare i parametri dei Get-WmiObject
cmdlet o Get-CimInstance
. Le query WQL sono leggermente più veloci rispetto ai comandi standard Get-WmiObject
e le prestazioni migliorate sono evidenti quando i comandi vengono eseguiti su centinaia di sistemi. Tuttavia, assicurarsi che il tempo dedicato alla scrittura di una query WQL con esito positivo non superi il 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 soprattutto con WQL, non dimenticare che si usa anche Windows PowerShell. Spesso, se una query WQL non funziona come previsto, è più facile usare un comando standard di Windows PowerShell che eseguire il debug della query WQL.
A meno che non si restituiscono grandi quantità di dati da sistemi remoti con vincoli di larghezza di banda, raramente è produttivo dedicare ore a cercare di perfezionare una query WQL complessa quando è presente un cmdlet di PowerShell accettabile che esegue la stessa operazione.
Uso dell'istruzione SELECT
Una tipica query WMI inizia con un'istruzione SELECT
che ottiene tutte le proprietà o proprietà specifiche di una classe WMI. Per selezionare tutte le proprietà di una classe WMI, usare un asterisco (*
). La FROM
parola chiave specifica la classe WMI.
Un'istruzione SELECT
ha il formato seguente:
SELECT <property> FROM <WMI-class>
Ad esempio, l'istruzione seguente SELECT
seleziona tutte le proprietà (*
) dalle istanze della classe WMI Win32_Bios .
SELECT * FROM Win32_Bios
Nota
PowerShell visualizza solo le proprietà predefinite dell'oggetto. Queste proprietà sono definite nel Types.ps1xml
file. Usare il Select-Object
cmdlet o un Format-*
cmdlet per visualizzare proprietà aggiuntive.
Per selezionare una determinata proprietà di una classe WMI, posizionare il nome della proprietà tra le SELECT
parole chiave e FROM
.
La query seguente seleziona solo il nome del BIOS dalla classe WMI Win32_Bios . Il comando salva la query nella $queryName
variabile .
SELECT Name FROM Win32_Bios
Per selezionare più proprietà, usare le virgole per separare i nomi delle proprietà.
Nella query WMI seguente viene selezionato il nome e la versione della classe WMI Win32_Bios . Il comando salva la query nella $queryNameVersion
variabile .
SELECT name, version FROM Win32_Bios
Uso della query WQL
Esistono tre 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
[wmisearcher]
tipo.
Uso del cmdlet Get-WmiObject
Il modo più semplice per usare la query WQL consiste nel racchiuderlo tra virgolette (come stringa) e quindi usare la stringa di query come valore del parametro Query del Get-WmiObject
cmdlet, come illustrato nell'esempio seguente.
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.
$query = "SELECT * FROM Win32_Bios"
Get-WmiObject -Query $query
È possibile usare entrambi i formati con qualsiasi istruzione WQL. Il comando seguente usa la query nella $queryName
variabile per ottenere solo le proprietà Name e Version del BIOS di sistema.
$queryNameVersion = "SELECT Name, Version FROM Win32_Bios"
Get-WmiObject -Query $queryNameVersion
__GENUS : 2
__CLASS : Win32_BIOS
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 2
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Name : S03KT39A
Version : LENOVO - 1270
PSComputerName :
Tenere presente che è possibile usare i parametri del Get-WmiObject
cmdlet 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 .
Get-WmiObject -Class Win32_Bios -Property Name, Version
__GENUS : 2
__CLASS : Win32_BIOS
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 2
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Name : S03KT39A
Version : LENOVO - 1270
PSComputerName :
Uso del cmdlet Get-CimInstance
A partire da Windows PowerShell 3.0, è possibile usare il Get-CimInstance
cmdlet per eseguire query WQL.
Get-CimInstance
ottiene istanze di classi conformi a CIM, incluse le classi WMI. I cmdlet CIM, introdotti in Windows PowerShell 3.0, eseguono le stesse attività dei cmdlet WMI. I cmdlet CIM sono conformi agli standard WS-Management (WSMan) e allo standard COMMON Information Model (CIM), che consente ai cmdlet di usare le stesse tecniche per gestire computer e computer Windows che eseguono altri sistemi operativi.
Il comando seguente usa il Get-CimInstance
cmdlet per eseguire una query WQL.
Qualsiasi query WQL che può essere usata con Get-WmiObject
può essere usata anche con Get-CimInstance
.
Get-CimInstance -Query "SELECT * FROM Win32_Bios"
SMBIOSBIOSVersion : S03KT39A
Manufacturer : LENOVO
Name : S03KT39A
SerialNumber : MJ0AETTX
Version : LENOVO - 1270
Get-CimInstance
restituisce un oggetto CimInstance, anziché ManagementObject che Get-WmiObject
restituisce, ma gli oggetti sono molto simili.
PS> (Get-CimInstance -Query "SELECT * FROM Win32_Bios").GetType().FullName
Microsoft.Management.Infrastructure.CimInstance
PS> (Get-WmiObject -Query "SELECT * FROM Win32_Bios").GetType().FullName
System.Management.ManagementObject
Uso dell'acceleratore di tipi wmisearcher
L'acceleratore [wmisearcher]
di tipi crea un oggetto ManagementObjectSearcher da una stringa di istruzione WQL. L'oggetto ManagementObjectSearcher ha molte proprietà e metodi, ma il metodo più semplice è il metodo Get, che richiama la query WMI specificata e restituisce gli oggetti risultanti.
Usando [wmisearcher]
, è possibile accedere facilmente alla classe ManagementObjectSearcher .NET. In questo modo è possibile eseguire query su WMI e configurare la modalità di esecuzione della query.
Per usare l'acceleratore [wmisearcher]
di tipi:
- Eseguire il cast della stringa WQL in un oggetto ManagementObjectSearcher .
- Chiamare il metodo Get dell'oggetto ManagementObjectSearcher .
Ad esempio, il comando seguente esegue il cast della query "select all", salva il risultato nella $bios
variabile e quindi chiama il Get()
metodo dell'oggetto ManagementObjectSearcher nella $bios
variabile.
$bios = [wmisearcher]"SELECT * FROM Win32_Bios"
$bios.Get()
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO - 1360
È possibile usare l'acceleratore [wmisearcher]
di tipi per eseguire il cast della query o della variabile. Nell'esempio seguente viene usato l'acceleratore [wmisearcher]
di tipo per eseguire il cast della variabile. Il risultato è lo stesso.
[wmisearcher]$bios = "SELECT * FROM Win32_Bios"
$bios.Get()
SMBIOSBIOSVersion : S03KT39A
Manufacturer : LENOVO
Name : S03KT39A
SerialNumber : MJ0AETTX
Version : LENOVO - 1270
Quando si usa l'acceleratore [wmisearcher]
di tipi, la stringa di query viene modificata in un oggetto ManagementObjectSearcher , come illustrato nei comandi seguenti.
$a = "SELECT * FROM Win32_Bios"
$a.GetType().FullName
System.String
$a = [wmisearcher]"SELECT * FROM Win32_Bios"
$a.GetType().FullName
System.Management.ManagementObjectSearcher
Questo formato di comando funziona su qualsiasi query. Il comando seguente ottiene il valore della proprietà Name della classe WMI Win32_Bios .
$biosname = [wmisearcher]"Select Name from Win32_Bios"
$biosname.Get()
__GENUS : 2
__CLASS : Win32_BIOS
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Name : S03KT39A
PSComputerName :
Uso dell'istruzione WQL WHERE di base
Un'istruzione WHERE
stabilisce le condizioni per i dati restituiti da un'istruzione SELECT
.
L'istruzione WHERE
ha il 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 nome e il valore della proprietà devono essere accurati.
Ad esempio, il comando seguente ottiene i processi del Blocco note nel computer locale.
Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE name='Notepad.exe'"
Tuttavia, il comando seguente non riesce perché il nome del processo include l'estensione del .exe
file.
Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE name='Notepad'"
Operatori di confronto delle istruzioni 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 effettuare confronti.
Ad esempio, la query seguente seleziona le proprietà Name e Priority dai processi nella classe Win32_Process in cui la priorità del processo è maggiore o uguale a 11. Il Get-WmiObject
cmdlet 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 essere usati anche nel valore del parametro Filter dei Get-WmiObject
cmdlet 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 .
$getWmiObjectSplat = @{
Class = 'Win32_Process'
Property = 'Name', 'ProcessID'
Filter = "ProcessID >= 1004"
}
Get-WmiObject @getWmiObjectSplat |
Sort-Object ProcessID |
Select-Object 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.
Like Operator Description
--------------------------------------------------
[] Character in a range [a-f] or a set
of characters [abcdef]. The items in
a set don't need to be consecutive or
listed in alphabetical order.
^ Character not in a range [^a-f] or
not in a set [^abcdef]. The items in
a set don't need to be consecutive or
listed in alphabetical order.
% A string of zero or more characters
_ One character.
(underscore) NOTE: To use a literal underscore
in a query string, enclose it in
square brackets [_].
Quando l'operatore LIKE
viene usato senza caratteri jolly o operatori di intervallo, si comporta come l'operatore di uguaglianza (=
) e restituisce oggetti solo quando sono una corrispondenza esatta per il criterio.
È possibile combinare l'operazione di intervallo con il carattere jolly percentuale (%
) per creare filtri semplici ma potenti.
Esempi di operatori LIKE
Esempio 1: [<intervallo>]
I comandi seguenti avviano blocco note e quindi cercano un'istanza della classe Win32_Process con un nome che inizia con una lettera tra "H" e "N" (senza distinzione tra maiuscole e minuscole).
La query deve restituire qualsiasi processo da Hotepad.exe
tramite Notepad.exe
.
Notepad # Starts Notepad
$query = "SELECT * FROM Win32_Process WHERE Name LIKE '[H-N]otepad.exe'"
Get-WmiObject -Query $query | Select Name, ProcessID
Name ProcessID
---- ---------
notepad.exe 1740
Esempio 2: [<intervallo>] e %
I comandi seguenti selezionano tutto il processo con un nome che inizia con una lettera tra A e P (senza distinzione tra maiuscole e minuscole) seguita da zero o più lettere in qualsiasi combinazione.
Il Get-WmiObject
cmdlet esegue la query, il Select-Object
cmdlet ottiene le proprietà Name e ProcessID e il Sort-Object
cmdlet ordina i risultati in ordine alfabetico in base al nome.
$query = "SELECT * FROM Win32_Process WHERE name LIKE '[A-P]%'"
Get-WmiObject -Query $query |
Select-Object -Property Name, ProcessID |
Sort-Object -Property Name
Esempio 3: Non compreso nell'intervallo (^)
Il comando seguente ottiene i processi i cui nomi non iniziano con le lettere seguenti: A, S, W, P, R, C, U, N
e seguito zero o più lettere.
$query = "SELECT * FROM Win32_Process WHERE name LIKE '[^ASWPRCUN]%'"
Get-WmiObject -Query $query |
Select-Object -Property Name, ProcessID |
Sort-Object -Property Name
Esempio 4: tutti i caratteri - o nessuno (%)
I comandi seguenti ottengono processi con nomi che iniziano con calc
.
Il simbolo percentuale (%
) è il carattere jolly WQL. Equivale al carattere jolly asterisco (*
) in PowerShell.
$query = "SELECT * FROM Win32_Process WHERE Name LIKE 'calc%'"
Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name ProcessID
---- ---------
calc.exe 4424
Esempio 5: un carattere (_)
I comandi seguenti ottengono processi con nomi con il modello seguente, c_lc.exe
in cui il carattere di sottolineatura rappresenta un carattere qualsiasi. Questo modello corrisponde a qualsiasi nome da calc.exe
tramite czlc.exe
, o c9lc.exe
, ma non corrisponde ai nomi in cui "c" e "l" sono separati da più di un carattere.
$query = "SELECT * FROM Win32_Process WHERE Name LIKE 'c_lc.exe'"
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 LIKE
parola chiave , richiede una corrispondenza esatta, perché il valore non include caratteri jolly.
$query = "SELECT * FROM Win32_Process WHERE name LIKE 'WLIDSVC.exe'"
Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
```powershell
```output
Name ProcessID
---- ---------
WLIDSVC.exe 84
Uso dell'operatore OR
Per specificare più condizioni indipendenti, usare la OR
parola chiave . La OR
parola chiave viene visualizzata nella WHERE
clausola . Esegue un'operazione inclusiva OR
su due o più condizioni e restituisce elementi che soddisfano una qualsiasi 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 restituisce solo se il nome del processo è winword.exe
o excel.exe
.
$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
" OR Name='excel.exe'"
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'"
Utilizzo dell'operatore AND
Per specificare più condizioni correlate, usare la AND
parola chiave . La AND
parola chiave viene visualizzata nella WHERE
clausola . Restituisce 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 processi con un nome e Winword.exe
l'ID processo 6512.
Si noti che i comandi usano il Get-CimInstance
cmdlet .
$q = "SELECT * FROM Win32_Process WHERE Name = 'winword.exe' " +
"AND ProcessID =6512"
Get-CimInstance -Query $q
ProcessId Name HandleCount WorkingSetSize VirtualSize
--------- ---- ----------- -------------- -----------
# 6512 WINWORD.EXE 768 117170176 633028608
Tutti gli operatori, inclusi gli LIKE
operatori, sono validi con gli OR
operatori e AND
. È inoltre possibile combinare gli OR
operatori e AND
in una singola query con parentesi che indicano a WMI quali clausole elaborare per prime.
Questo comando usa il carattere di continuazione di Windows PowerShell (`
) per dividere il comando in due righe.
Ricerca di valori Null
La ricerca di valori Null in WMI è complessa perché può causare risultati imprevedibili.
Null
non è zero e non è equivalente a una stringa vuota. Alcune proprietà della classe WMI vengono inizializzate e altre non lo sono, quindi una ricerca di valori Null potrebbe non funzionare per tutte le proprietà.
Per cercare valori Null, usare l'operatore Is con un valore .null
Ad esempio, i comandi seguenti ottengono processi con un valore Null per la proprietà IntallDate . I comandi restituiscono molti processi.
$q = "SELECT * FROM Win32_Process WHERE InstallDate is null"
Get-WmiObject -Query $q
Al contrario, il comando seguente ottiene gli account utente con un valore Null per la proprietà Description . Questo comando non restituisce account utente, anche se la maggior parte degli account utente non ha alcun valore per la proprietà Description .
$q = "SELECT * FROM Win32_UserAccount WHERE Description is null"
Get-WmiObject -Query $q
Per trovare gli account utente senza valore per la proprietà Description , utilizzare l'operatore di uguaglianza per ottenere una stringa vuota. Per rappresentare la stringa vuota, utilizzare due virgolette singole consecutive.
$q = "SELECT * FROM Win32_UserAccount WHERE Description = '' "
Uso di true o false
Per ottenere valori booleani nelle proprietà degli oggetti WMI, utilizzare True
e False
.
senza distinzione tra maiuscole e minuscole.
La query WQL seguente restituisce solo gli account utente locali da un computer aggiunto a un dominio.
$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = True"
Get-CimInstance -Query $q
Per trovare gli account di dominio, usare il valore False, come illustrato nell'esempio seguente.
$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = False"
Get-CimInstance -Query $q
Uso del carattere di escape
WQL usa la barra rovesciata (\
) come carattere di escape. Questo è diverso da Windows PowerShell, che usa il carattere di backtick (`
).
Le virgolette e i caratteri usati per le virgolette, spesso devono essere preceduti da caratteri di escape in modo che non vengano interpretati in modo non corretto.
Per trovare un utente il cui nome include una virgoletta singola, usare una barra rovesciata per eseguire l'escape delle virgolette singole, come illustrato nel comando seguente.
$q = "SELECT * FROM Win32_UserAccount WHERE Name = 'Tim O\'Brian'"
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 valido a causa della barra rovesciata nel valore Caption.
$q = "SELECT * FROM Win32_UserAccount WHERE Caption = 'Fabrikam\TimO'"
Get-CimInstance -Query $q
Get-CimInstance : Invalid query
At line:1 char:1
+ Get-CimInstance -Query $q
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-CimInstance], CimExcep
+ FullyQualifiedErrorId : HRESULT 0x80041017,Microsoft.Management.Infrastr
Per eseguire l'escape della barra rovesciata, usare un secondo carattere barra rovesciata, come illustrato nel comando seguente.
$q = "SELECT * FROM Win32_UserAccount WHERE Caption = 'Fabrikam\\TimO'"
Get-CimInstance -Query $q