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 Windows Management Instrumentation (WMI), 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 Get-WmiObject ou Get-CimInstance. 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 l’emporte pas sur l’amélioration des performances.

Les instructions WQL de base dont vous avez besoin pour utiliser WQL sont Select, Where et 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 de Windows PowerShell standard que de déboguer la requête WQL.

Sauf si vous retournez de grandes quantités 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 et convoluée lorsqu’il existe une applet de commande Windows parfaitement acceptable qui fait la même chose, si un peu plus lentement.

UTILISATION DE L’INSTRUCTION SELECT

Une requête WMI classique commence par une instruction Select 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 mot clé From spécifie la classe WMI.

Une instruction Select a le format suivant :

Select <property> from <WMI-class>

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

Select * from Win32_Bios

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

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 variable $queryName.

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 variable $queryNameVersion.

Select name, version from Win32_Bios

UTILISATION DE LA REQUÊTE WQL

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

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

UTILISATION DE L’APPLET DE COMMANDE GET-WMIOBJECT

La méthode la plus simple pour 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 De requête de l’applet de commande Get-WmiObject, 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 Query, 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 variable $queryName pour obtenir uniquement le nom et les propriétés de 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 : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Name             : Default System BIOS
Version          : LENOVO - 1360

N’oubliez pas que vous pouvez utiliser les paramètres de l’applet de commande Get-WmiObject 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 : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Name             : Default System BIOS
Version          : LENOVO - 1360

UTILISATION DE L’APPLET DE COMMANDE GET-CIMINSTANCE

À compter de Windows PowerShell 3.0, vous pouvez utiliser l’applet de commande Get-CimInstance 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 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), qui permet aux applets de commande d’utiliser les mêmes techniques pour gérer Windows ordinateurs et ordinateurs exécutant d’autres systèmes d’exploitation.

La commande suivante utilise l’applet de commande Get-CimInstance 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 : 8BET56WW (1.36 )
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R9FPY3P
Version           : LENOVO - 1360

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

(Get-CimInstance -Query "Select * from Win32_Bios").GetType().FullName
Microsoft.Management.Infrastructure.CimInstance
(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 de type [wmisearcher] 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 basique est la méthode Get, qui appelle la requête WMI spécifiée et retourne les objets résultants.

À l’aide de [wmisearcher], vous bénéficiez d’un accès facile à la classe ManagementObjectSearcher .NET Framework. 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 type [wmisearcher] :

  1. Cast de 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 variable $bios, puis appelle la méthode Get de l’objet ManagementObjectSearcher dans la variable $bios.

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

REMARQUE : Seules les propriétés d’objet sélectionnées sont affichées par défaut. Ces propriétés sont définies dans le fichier Types.ps1xml.

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

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

Lorsque vous utilisez l’accélérateur de type [wmisearcher], 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             : Default System BIOS

Vous pouvez effectuer cette opération dans une seule commande, bien que la commande soit un peu plus difficile à interpréter.

Dans ce format, vous utilisez l’accélérateur de type [wmisearcher] pour convertir la chaîne de requête WQL en un ManagementObjectSearcher, puis appelez la méthode Get sur l’objet , dans une seule commande. Parenthèses () qui entourent la chaîne castée Windows PowerShell pour effectuer un cast de la chaîne avant d’appeler la méthode.

([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

UTILISATION DE L’INSTRUCTION WQL WHERE DE BASE

Une instruction Where établit des conditions pour les données retournées par une instruction Select.

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 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 nom de fichier « .exe ».

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 de commande Get-WmiObject 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 DE FILTRE

Les opérateurs WQL peuvent également être utilisés dans la valeur du paramètre Filter des applets de commande Get-WmiObject ou Get-CimInstance, 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 à 1 004. La commande utilise le paramètre Filter pour spécifier la condition ProcessID.

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

UTILISATION DE L’OPÉRATEUR LIKE

L’opérateur Like vous permet d’utiliser des caractères génériques 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 do not 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 do not 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 ou 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 générique de pourcentage pour créer des filtres simples, mais puissants.

EXEMPLES D’OPÉRATEURS SIMILAIRES

EXEMPLE 1 : [<range>]

Les commandes suivantes démarrent Bloc-notes, puis recherchent une instance de la classe Win32_Process qui a un nom qui commence par une lettre comprise entre « H » et « N » (ne respectant pas la casse).

La requête doit retourner n’importe quel processus de Hotpad.exe via 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

EXEMPLE 2 : [<range>] et %

Les commandes suivantes sélectionnent tous les processus dont le nom commence par une lettre entre A et P (sans respect de la casse) suivi de zéro ou plusieurs lettres dans n’importe quelle combinaison.

L’applet de commande Get-WmiObject exécute la requête, l’applet de commande Select-Object obtient les propriétés Name et ProcessID, et l’applet de commande Sort-Object 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 comprise 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 plusieurs 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 commençant par « calc ». Le symbole % dans WQL équivaut au symbole astérisque (*) dans les expressions régulières.

$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 de calc.exe via czlc.exe, ou c9lc.exe, mais ne correspond pas aux noms dans lesquels les caractères « 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 des processus nommés WLIDSVC.exe. Même si la requête utilise le mot clé Like, elle nécessite une correspondance exacte, car la valeur n’inclut aucun caractère générique.

$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 OU DE L’OPÉRATEUR

Pour spécifier plusieurs conditions indépendantes, utilisez le mot clé Or. Le mot clé Or apparaît dans la clause Where. Il effectue une opération OR inclusive 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 retournent 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.exe ou Powershell.exe.

$q = "Select * from Win32_Process where Name='winword.exe'" +
  " or Name='excel.exe' or Name='powershell.exe'"

UTILISATION DE L’OPÉRATEUR ET DE L’OPÉRATEUR

Pour spécifier plusieurs conditions associées, utilisez le mot clé And. Le mot clé And apparaît dans la clause Where. 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 qui ont le nom « Winword.exe » et l’ID de processus 6512.

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

$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 opérateurs Like, sont valides avec les opérateurs Or et And. Vous pouvez également combiner les opérateurs Or et And dans une seule requête avec des parenthèses qui indiquent Windows PowerShell quelles clauses traiter en premier.

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

$q = "Select * from Win32_Process `
where (Name = 'winword.exe' or Name = 'excel.exe') and HandleCount > 700"
Get-CimInstance -Query $q
ProcessId    Name             HandleCount      WorkingSetSize   VirtualSize
---------    ----             -----------      --------------   -----------
     6512    WINWORD.EXE      797              117268480        634425344
     9610    EXCEL.EXE        727               38858752        323227648

RECHERCHE DE VALEURS NULL

La recherche de valeurs Null dans WMI est difficile, car elle peut entraîner des résultats imprévisibles. La valeur Null n’est pas égale à zéro et elle n’est pas équivalente ou à 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 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. Elles ne sont pas sensibles à la casse.

La requête WQL suivante retourne uniquement les comptes d’utilisateur locaux 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 indiqué 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 une séquence d’échappement afin qu’ils ne soient pas mal interprétés.

Pour rechercher un utilisateur dont le nom inclut un guillemet simple, utilisez une barre oblique inverse pour échapper au guillemet simple, comme illustré 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 indiqué dans la commande suivante.

$q = "Select * from Win32_UserAccount where Caption = 'Fabrikam\\TimO'"
Get-CimInstance -Query $q

Voir aussi