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