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
, 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 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 mots clés et FROM
les SELECT
mots clés.
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 :
- Cassez la chaîne WQL en objet ManagementObjectSearcher .
- 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 du 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 .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 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 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 pourcentage (%
) pour créer des filtres simples, mais puissants.
Exemples d’opérateurs LIKE
Exemple 1 : [<range>]
Les commandes suivantes démarrent le Bloc-notes, puis recherchent une instance de la classe Win32_Process dont le nom commence par une lettre comprise entre « H » et « N » (sans respect de la casse).
La requête doit retourner n’importe quel processus à Notepad.exe
partir 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 générique WQL. Il équivaut au caractère générique astérisque (*
) 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 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 OR
Pour spécifier plusieurs conditions indépendantes, utilisez le OR
mot clé. Le 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.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 AND
Pour spécifier plusieurs conditions associées, utilisez le AND
mot clé. Le 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