about_WQL

Description courte

Décrit le langage de requêtes WMI (WQL) qui peut être utilisé pour obtenir des objets WMI dans Windows PowerShell.

Description longue

WQL est le langage de requête WMI (Windows Management Instrumentation), qui est le langage utilisé pour obtenir des informations à partir de WMI.

Vous n’êtes pas obligé d’utiliser WQL pour effectuer une requête WMI dans Windows PowerShell. Au lieu de cela, vous pouvez utiliser les paramètres des applets de commande ou Get-CimInstance des applets de Get-WmiObject commande. Les requêtes WQL sont un peu plus rapides que les commandes standard Get-WmiObject et les performances améliorées sont évidentes lorsque les commandes s’exécutent sur des centaines de systèmes. Toutefois, assurez-vous que le temps passé à écrire une requête WQL réussie ne dépasse pas l’amélioration des performances.

Les instructions WQL de base dont vous avez besoin pour utiliser WQL sont SELECT, WHEREet FROM.

Quand utiliser WQL

Lorsque vous utilisez WMI, et en particulier avec WQL, n’oubliez pas que vous utilisez également Windows PowerShell. Souvent, si une requête WQL ne fonctionne pas comme prévu, il est plus facile d’utiliser une commande Windows PowerShell standard que de déboguer la requête WQL.

Sauf si vous retournez des quantités massives de données provenant de systèmes distants à bande passante limitée, il est rarement productif de passer des heures à essayer de perfectionner une requête WQL complexe lorsqu’il existe une applet de commande PowerShell acceptable qui fait la même chose.

Utilisation de l’instruction SELECT

Une requête WMI classique commence par une SELECT instruction qui obtient toutes les propriétés ou propriétés particulières d’une classe WMI. Pour sélectionner toutes les propriétés d’une classe WMI, utilisez un astérisque (*). Le FROM mot clé spécifie la classe WMI.

Une SELECT instruction a le format suivant :

SELECT <property> FROM <WMI-class>

Par exemple, l’instruction suivante SELECT sélectionne toutes les propriétés (*) dans les instances de la classe WMI Win32_Bios .

SELECT * FROM Win32_Bios

Remarque

PowerShell affiche uniquement les propriétés d’objet par défaut. Ces propriétés sont définies dans le Types.ps1xml fichier. Utilisez l’applet Select-Object de commande ou une Format-* applet de commande pour afficher des propriétés supplémentaires.

Pour sélectionner une propriété particulière d’une classe WMI, placez le nom de la propriété entre les mot clé et FROM les SELECT mot clé.

La requête suivante sélectionne uniquement le nom du BIOS dans la classe WMI Win32_Bios . La commande enregistre la requête dans la $queryName variable.

SELECT Name FROM Win32_Bios

Pour sélectionner plusieurs propriétés, utilisez des virgules pour séparer les noms de propriétés. La requête WMI suivante sélectionne le nom et la version de la classe WMI Win32_Bios . La commande enregistre la requête dans la $queryNameVersion variable.

SELECT name, version FROM Win32_Bios

Utilisation de la requête WQL

Il existe trois façons d’utiliser la requête WQL dans la commande Windows PowerShell.

  • Utiliser l'applet de commande Get-WmiObject
  • Utiliser l'applet de commande Get-CimInstance
  • Utilisez l’accélérateur de [wmisearcher] type.

Utilisation de l’applet de commande Get-WmiObject

La façon la plus simple d’utiliser la requête WQL consiste à la placer entre guillemets (sous forme de chaîne), puis à utiliser la chaîne de requête comme valeur du paramètre Requête de l’applet Get-WmiObject de commande, comme illustré dans l’exemple suivant.

Get-WmiObject -Query "SELECT * FROM Win32_Bios"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R9FPY3P
Version           : LENOVO - 1360

Vous pouvez également enregistrer l’instruction WQL dans une variable, puis utiliser la variable comme valeur du paramètre De requête , comme indiqué dans la commande suivante.

$query = "SELECT * FROM Win32_Bios"
Get-WmiObject -Query $query

Vous pouvez utiliser l’un ou l’autre format avec n’importe quelle instruction WQL. La commande suivante utilise la requête dans la $queryName variable pour obtenir uniquement les propriétés Nom et Version du BIOS système.

$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   :

N’oubliez pas que vous pouvez utiliser les paramètres de l’applet Get-WmiObject de commande pour obtenir le même résultat. Par exemple, la commande suivante obtient également les valeurs des propriétés Name et Version des instances de la 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   :

Utilisation de l’applet de commande Get-CimInstance

À compter de Windows PowerShell 3.0, vous pouvez utiliser l’applet Get-CimInstance de commande pour exécuter des requêtes WQL.

Get-CimInstance obtient des instances de classes compatibles CIM, y compris les classes WMI. Les applets de commande CIM, introduites par Windows PowerShell 3.0, effectuent les mêmes tâches que les applets de commande WMI. Les applets de commande CIM sont conformes aux normes WS-Management (WSMan) et à la norme CIM (Common Information Model), ce qui permet aux applets de commande d’utiliser les mêmes techniques pour gérer les ordinateurs et ordinateurs Windows qui exécutent d’autres systèmes d’exploitation.

La commande suivante utilise l’applet Get-CimInstance de commande pour exécuter une requête WQL.

Toute requête WQL qui peut être utilisée avec Get-WmiObject peut également être utilisée avec Get-CimInstance.

Get-CimInstance -Query "SELECT * FROM Win32_Bios"
SMBIOSBIOSVersion : S03KT39A
Manufacturer      : LENOVO
Name              : S03KT39A
SerialNumber      : MJ0AETTX
Version           : LENOVO - 1270

Get-CimInstance retourne un objet CimInstance , au lieu du ManagementObject qui Get-WmiObject retourne, mais les objets sont assez similaires.

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

Utilisation de l’accélérateur de type wmisearcher

L’accélérateur [wmisearcher] de type crée un objet ManagementObjectSearcher à partir d’une chaîne d’instruction WQL. L’objet ManagementObjectSearcher a de nombreuses propriétés et méthodes, mais la méthode la plus simple est la méthode Get, qui appelle la requête WMI spécifiée et retourne les objets résultants.

À l’aide de , vous bénéficiez [wmisearcher]d’un accès facile à la classe .NET ManagementObjectSearcher . Cela vous permet d’interroger WMI et de configurer la façon dont la requête est effectuée.

Pour utiliser l’accélérateur de [wmisearcher] type :

  1. Cassez la chaîne WQL en objet ManagementObjectSearcher .
  2. Appelez la méthode Get de l’objet ManagementObjectSearcher .

Par exemple, la commande suivante caste la requête « select all », enregistre le résultat dans la $bios variable, puis appelle la Get() méthode de l’objet ManagementObjectSearcher dans la $bios variable.

$bios = [wmisearcher]"SELECT * FROM Win32_Bios"
$bios.Get()
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R9FPY3P
Version           : LENOVO - 1360

Vous pouvez utiliser l’accélérateur de [wmisearcher] type pour caster la requête ou la variable. Dans l’exemple suivant, l’accélérateur de [wmisearcher] type est utilisé pour caster la variable. Le résultat est le même.

[wmisearcher]$bios = "SELECT * FROM Win32_Bios"
$bios.Get()
SMBIOSBIOSVersion : S03KT39A
Manufacturer      : LENOVO
Name              : S03KT39A
SerialNumber      : MJ0AETTX
Version           : LENOVO - 1270

Lorsque vous utilisez l’accélérateur de [wmisearcher] type, il modifie la chaîne de requête en objet ManagementObjectSearcher , comme indiqué dans les commandes suivantes.

$a = "SELECT * FROM Win32_Bios"
$a.GetType().FullName
System.String

$a = [wmisearcher]"SELECT * FROM Win32_Bios"
$a.GetType().FullName
System.Management.ManagementObjectSearcher

Ce format de commande fonctionne sur n’importe quelle requête. La commande suivante obtient la valeur de la propriété Name de la 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   :

Utilisation de l’instruction WQL WHERE de base

Une WHERE instruction établit des conditions pour les données retournées par une SELECT instruction.

L’instruction WHERE a le format suivant :

WHERE <property> <operator> <value>

Par exemple :

WHERE Name = 'Notepad.exe'

L’instruction WHERE est utilisée avec l’instruction SELECT , comme illustré dans l’exemple suivant.

SELECT * FROM Win32_Process WHERE Name = 'Notepad.exe'

Lorsque vous utilisez l’instruction WHERE , le nom et la valeur de la propriété doivent être exacts.

Par exemple, la commande suivante obtient les processus Bloc-notes Windows sur l’ordinateur local.

Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE name='Notepad.exe'"

Toutefois, la commande suivante échoue, car le nom du processus inclut l’extension de .exe fichier.

Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE name='Notepad'"

Opérateurs de comparaison d’instructions WHERE

Les opérateurs suivants sont valides dans une instruction 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

Il existe d’autres opérateurs, mais il s’agit des opérateurs utilisés pour effectuer des comparaisons.

Par exemple, la requête suivante sélectionne les propriétés Name et Priority dans les processus de la classe Win32_Process où la priorité du processus est supérieure ou égale à 11. L’applet Get-WmiObject de commande exécute la requête.

$highPriority = "Select Name, Priority from Win32_Process " +
  "WHERE Priority >= 11"
Get-WmiObject -Query $highPriority

Utilisation des opérateurs WQL dans le paramètre -Filter

Les opérateurs WQL peuvent également être utilisés dans la valeur du paramètre Filter du ou Get-CimInstance des applets de Get-WmiObject commande, ainsi que dans la valeur des paramètres de requête de ces applets de commande.

Par exemple, la commande suivante obtient les propriétés Name et ProcessID des cinq derniers processus dont les valeurs ProcessID sont supérieures à 1004. La commande utilise le paramètre Filter pour spécifier la condition 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

utilisation de l’opérateur LIKE

L’opérateur LIKE vous permet d’utiliser des caractères génériques carte pour filtrer les résultats d’une requête 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 [_].

Lorsque l’opérateur LIKE est utilisé sans caractères génériques carte opérateurs de plage, il se comporte comme l’opérateur d’égalité (=) et retourne des objets uniquement lorsqu’ils correspondent exactement au modèle.

Vous pouvez combiner l’opération de plage avec le caractère de pourcentage (%) générique carte pour créer des filtres simples et puissants.

Exemples d’opérateurs LIKE

Exemple 1 : [<range>]

Les commandes suivantes démarrent Bloc-notes Windows, puis recherchent une instance de la classe Win32_Process qui a un nom commençant par une lettre comprise entre « H » et « N » (sans respect de la casse).

La requête doit retourner n’importe quel processus à Notepad.exepartir de Hotepad.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

Exemple 2 : [<plage>] et %

Les commandes suivantes sélectionnent tous les processus qui ont un nom commençant par une lettre entre A et P (sans respect de la casse) suivie de zéro ou plusieurs lettres dans n’importe quelle combinaison.

L’applet Get-WmiObject de commande exécute la requête, l’applet Select-Object de commande obtient les propriétés Name et ProcessID , et l’applet Sort-Object de commande trie les résultats par ordre alphabétique par nom.

$query = "SELECT * FROM Win32_Process WHERE name LIKE '[A-P]%'"
Get-WmiObject -Query $query |
    Select-Object -Property Name, ProcessID |
    Sort-Object -Property Name

Exemple 3 : Non dans la plage (^)

La commande suivante obtient les processus dont les noms ne commencent par aucune des lettres suivantes : A, S, W, P, R, C, U, N

et suivi zéro ou plus de lettres.

$query = "SELECT * FROM Win32_Process WHERE name LIKE '[^ASWPRCUN]%'"
Get-WmiObject -Query $query |
    Select-Object -Property Name, ProcessID |
    Sort-Object -Property Name

Exemple 4 : Tous les caractères -- ou aucun (%)

Les commandes suivantes obtiennent des processus qui ont des noms qui commencent par calc. Le symbole pourcentage (%) est le caractère wild carte WQL. Il équivaut à l’astérisque (*) wild carte dans PowerShell.

$query = "SELECT * FROM Win32_Process WHERE Name LIKE 'calc%'"
Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name                               ProcessID
----                               ---------
calc.exe                                4424

Exemple 5 : Un caractère (_)

Les commandes suivantes obtiennent des processus qui ont des noms qui ont le modèle suivant, c_lc.exe où le caractère de soulignement représente un caractère. Ce modèle correspond à n’importe quel nom du calc.exe biais czlc.exe, ou c9lc.exe, mais ne correspond pas aux noms dans lesquels « c » et « l » sont séparés par plusieurs caractères.

$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

Exemple 6 : Correspondance exacte

Les commandes suivantes obtiennent les processus nommés WLIDSVC.exe. Même si la requête utilise le LIKE mot clé, elle nécessite une correspondance exacte, car la valeur n’inclut pas de caractères génériques carte.

$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

Utilisation de l’opérateur OR

Pour spécifier plusieurs conditions indépendantes, utilisez la OR mot clé. La OR mot clé apparaît dans la WHERE clause. Il effectue une opération inclusive OR sur deux conditions (ou plus) et retourne des éléments qui répondent à l’une des conditions.

L’opérateur OR a le format suivant :

WHERE <property> <operator> <value> OR <property> <operator> <value> ...

Par exemple, les commandes suivantes obtiennent toutes les instances de la classe WMI Win32_Process , mais les retourne uniquement si le nom du processus est winword.exe ou excel.exe.

$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
  " OR Name='excel.exe'"
Get-WmiObject -Query $q

L’instruction OR peut être utilisée avec plus de deux conditions. Dans la requête suivante, l’instruction OR obtient Winword.exe, Excel.exeou Powershell.exe.

$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
  " OR Name='excel.exe' OR Name='powershell.exe'"

Utilisation de l'opérateur AND

Pour spécifier plusieurs conditions associées, utilisez la AND mot clé. La AND mot clé apparaît dans la WHERE clause. Elle retourne des éléments qui répondent à toutes les conditions.

L’opérateur AND a le format suivant :

WHERE <property> <operator> <value> `AND` <property> <operator> <value> ...

Par exemple, les commandes suivantes obtiennent des processus dont le nom Winword.exe est et l’ID de processus 6512.

Notez que les commandes utilisent l’applet Get-CimInstance de commande.

$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

Tous les opérateurs, y compris les LIKE opérateurs, sont valides avec les OR opérateurs et AND les opérateurs. Vous pouvez également combiner les opérateurs et AND les OR opérateurs dans une seule requête avec des parenthèses qui indiquent à WMI quelles clauses traiter en premier.

Cette commande utilise le caractère de continuation Windows PowerShell (`) divisez la commande en deux lignes.

Recherche de valeurs Null

La recherche de valeurs Null dans WMI est difficile, car elle peut entraîner des résultats imprévisibles. Null n’est pas zéro et n’est pas équivalent à une chaîne vide. Certaines propriétés de classe WMI sont initialisées et d’autres ne le sont pas. Par conséquent, une recherche de valeur Null peut ne pas fonctionner pour toutes les propriétés.

Pour rechercher des valeurs Null, utilisez l’opérateur Is avec la valeur .null

Par exemple, les commandes suivantes obtiennent des processus qui ont une valeur Null pour la propriété IntallDate . Les commandes retournent de nombreux processus.

$q = "SELECT * FROM Win32_Process WHERE InstallDate is null"
Get-WmiObject -Query $q

En revanche, la commande suivante obtient les comptes d’utilisateur qui ont une valeur Null pour la propriété Description . Cette commande ne retourne aucun compte d’utilisateur, même si la plupart des comptes d’utilisateur n’ont aucune valeur pour la propriété Description .

$q = "SELECT * FROM Win32_UserAccount WHERE Description is null"
Get-WmiObject -Query $q

Pour rechercher les comptes d’utilisateur qui n’ont aucune valeur pour la propriété Description , utilisez l’opérateur d’égalité pour obtenir une chaîne vide. Pour représenter la chaîne vide, utilisez deux guillemets simples consécutifs.

$q = "SELECT * FROM Win32_UserAccount WHERE Description = '' "

Utilisation de true ou false

Pour obtenir des valeurs booléennes dans les propriétés des objets WMI, utilisez True et False. Ils ne respectent pas la casse.

La requête WQL suivante retourne uniquement des comptes d’utilisateur locaux à partir d’un ordinateur joint à un domaine.

$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = True"
Get-CimInstance -Query $q

Pour rechercher des comptes de domaine, utilisez la valeur False, comme illustré dans l’exemple suivant.

$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = False"
Get-CimInstance -Query $q

Utilisation du caractère d’échappement

WQL utilise la barre oblique inverse (\) comme caractère d’échappement. Ceci est différent de Windows PowerShell, qui utilise le caractère backtick (`).

Les guillemets et les caractères utilisés pour les guillemets doivent souvent être placés dans l’échappement afin qu’ils ne soient pas mal interprétés.

Pour rechercher un utilisateur dont le nom inclut un guillemet unique, utilisez une barre oblique inverse pour échapper le guillemet unique, comme indiqué dans la commande suivante.

$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

Dans certains cas, la barre oblique inverse doit également être échappée. Par exemple, les commandes suivantes génèrent une erreur de requête non valide en raison de la barre oblique inverse dans la valeur de légende.

$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

Pour échapper à la barre oblique inverse, utilisez un deuxième caractère de barre oblique inverse, comme illustré dans la commande suivante.

$q = "SELECT * FROM Win32_UserAccount WHERE Caption = 'Fabrikam\\TimO'"
Get-CimInstance -Query $q

Voir aussi