Condividi tramite


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, WHEREe 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-CimInstancerestituisce 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:

  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 $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.exeo 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

Vedi anche