about_WQL
Descripción breve
Describe el lenguaje de consulta de WMI (WQL), que puede usarse para obtener objetos WMI en Windows PowerShell.
Descripción larga
WQL es el lenguaje de consulta de Instrumental de administración de Windows (WMI), que es el lenguaje que se usa para obtener información de WMI.
No es necesario usar WQL para realizar una consulta WMI en Windows PowerShell.
En su lugar, puede usar los parámetros de los Get-WmiObject
cmdlets o Get-CimInstance
. Las consultas WQL son algo más rápidas que los comandos estándar Get-WmiObject
y el rendimiento mejorado es evidente cuando los comandos se ejecutan en cientos de sistemas. Sin embargo, asegúrese de que el tiempo dedicado a escribir una consulta WQL correcta no supera la mejora del rendimiento.
Las instrucciones WQL básicas que debe usar WQL son SELECT
, WHERE
y FROM
.
Cuándo usar WQL
Al trabajar con WMI y, especialmente con WQL, no olvide que también usa Windows PowerShell. A menudo, si una consulta WQL no funciona según lo previsto, es más fácil usar un comando estándar de Windows PowerShell que depurar la consulta WQL.
A menos que devuelva grandes cantidades de datos de entre sistemas remotos restringidos por ancho de banda, rara vez es productivo dedicar horas a intentar perfeccionar una consulta WQL complicada cuando hay un cmdlet de PowerShell aceptable que hace lo mismo.
Uso de la instrucción SELECT
Una consulta WMI típica comienza con una SELECT
instrucción que obtiene todas las propiedades o propiedades concretas de una clase WMI. Para seleccionar todas las propiedades de una clase WMI, use un asterisco (*
). La FROM
palabra clave especifica la clase WMI.
Una SELECT
instrucción tiene el siguiente formato:
SELECT <property> FROM <WMI-class>
Por ejemplo, la siguiente SELECT
instrucción selecciona todas las propiedades (*
) de las instancias de la clase WMI de Win32_Bios .
SELECT * FROM Win32_Bios
Nota:
PowerShell solo muestra las propiedades de objeto predeterminadas. Estas propiedades se definen en el Types.ps1xml
archivo . Use el Select-Object
cmdlet o un Format-*
cmdlet para mostrar propiedades adicionales.
Para seleccionar una propiedad determinada de una clase WMI, coloque el nombre de propiedad entre las SELECT
palabras clave y FROM
.
La consulta siguiente selecciona solo el nombre del BIOS de la clase WMI de Win32_Bios . El comando guarda la consulta en la $queryName
variable .
SELECT Name FROM Win32_Bios
Para seleccionar más de una propiedad, use comas para separar los nombres de propiedad.
La siguiente consulta WMI selecciona el nombre y la versión de la clase WMI de Win32_Bios . El comando guarda la consulta en la $queryNameVersion
variable .
SELECT name, version FROM Win32_Bios
Uso de la consulta WQL
Hay tres maneras de usar la consulta WQL en el comando de Windows PowerShell.
- Usar el cmdlet
Get-WmiObject
- Usar el cmdlet
Get-CimInstance
- Use el acelerador de
[wmisearcher]
tipos.
Uso del cmdlet Get-WmiObject
La manera más básica de usar la consulta WQL es incluirla entre comillas (como una cadena) y, a continuación, usar la cadena de consulta como valor del parámetro Query del Get-WmiObject
cmdlet, como se muestra en el ejemplo siguiente.
Get-WmiObject -Query "SELECT * FROM Win32_Bios"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO - 1360
También puede guardar la instrucción WQL en una variable y, a continuación, usar la variable como valor del parámetro Query , como se muestra en el siguiente comando.
$query = "SELECT * FROM Win32_Bios"
Get-WmiObject -Query $query
Puede usar cualquiera de los formatos con cualquier instrucción WQL. El siguiente comando usa la consulta en la $queryName
variable para obtener solo las propiedades Name y Version del BIOS del 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 :
Recuerde que puede usar los parámetros del Get-WmiObject
cmdlet para obtener el mismo resultado. Por ejemplo, el comando siguiente también obtiene los valores de las propiedades Name y Version de las instancias de la clase WMI de 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 partir de Windows PowerShell 3.0, puede usar el Get-CimInstance
cmdlet para ejecutar consultas WQL.
Get-CimInstance
obtiene instancias de clases compatibles con CIM, incluidas las clases WMI. Los cmdlets CIM, introducidos en Windows PowerShell 3.0, realizan las mismas tareas que los cmdlets de WMI. Los cmdlets CIM cumplen con los estándares WS-Management (WSMan) y con el estándar Common Information Model (CIM), que permite a los cmdlets usar las mismas técnicas para administrar equipos y equipos Windows que ejecutan otros sistemas operativos.
El siguiente comando usa el Get-CimInstance
cmdlet para ejecutar una consulta WQL.
Cualquier consulta WQL que se pueda usar con Get-WmiObject
también se puede usar con Get-CimInstance
.
Get-CimInstance -Query "SELECT * FROM Win32_Bios"
SMBIOSBIOSVersion : S03KT39A
Manufacturer : LENOVO
Name : S03KT39A
SerialNumber : MJ0AETTX
Version : LENOVO - 1270
Get-CimInstance
devuelve un objeto CimInstance , en lugar del ManagementObject que Get-WmiObject
devuelve, pero los objetos son bastante similares.
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 del acelerador de tipos wmisearcher
El [wmisearcher]
acelerador de tipos crea un objeto ManagementObjectSearcher a partir de una cadena de instrucción WQL. El objeto ManagementObjectSearcher tiene muchas propiedades y métodos, pero el método más básico es el método Get, que invoca la consulta WMI especificada y devuelve los objetos resultantes.
Con [wmisearcher]
, puede acceder fácilmente a la clase ManagementObjectSearcher .NET. Esto le permite consultar WMI y configurar la forma en que se realiza la consulta.
Para usar el acelerador de [wmisearcher]
tipos:
- Convierta la cadena WQL en un objeto ManagementObjectSearcher .
- Llame al método Get del objeto ManagementObjectSearcher .
Por ejemplo, el siguiente comando convierte la consulta "seleccionar todo", guarda el resultado en la $bios
variable y, a continuación, llama al Get()
método del objeto ManagementObjectSearcher en 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
Puede usar el [wmisearcher]
acelerador de tipos para convertir la consulta o la variable. En el ejemplo siguiente, se usa el [wmisearcher]
acelerador de tipos para convertir la variable. El resultado es el mismo.
[wmisearcher]$bios = "SELECT * FROM Win32_Bios"
$bios.Get()
SMBIOSBIOSVersion : S03KT39A
Manufacturer : LENOVO
Name : S03KT39A
SerialNumber : MJ0AETTX
Version : LENOVO - 1270
Cuando se usa el [wmisearcher]
acelerador de tipos, cambia la cadena de consulta en un objeto ManagementObjectSearcher , como se muestra en los siguientes comandos.
$a = "SELECT * FROM Win32_Bios"
$a.GetType().FullName
System.String
$a = [wmisearcher]"SELECT * FROM Win32_Bios"
$a.GetType().FullName
System.Management.ManagementObjectSearcher
Este formato de comando funciona en cualquier consulta. El comando siguiente obtiene el valor de la propiedad Name de la clase WMI de 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 de la instrucción WHERE de WQL básica
Una WHERE
instrucción establece condiciones para los datos que devuelve una SELECT
instrucción.
La WHERE
instrucción tiene el siguiente formato:
WHERE <property> <operator> <value>
Por ejemplo:
WHERE Name = 'Notepad.exe'
La WHERE
instrucción se usa con la SELECT
instrucción , como se muestra en el ejemplo siguiente.
SELECT * FROM Win32_Process WHERE Name = 'Notepad.exe'
Al usar la WHERE
instrucción , el nombre de propiedad y el valor deben ser precisos.
Por ejemplo, el comando siguiente obtiene los procesos del Bloc de notas en el equipo local.
Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE name='Notepad.exe'"
Sin embargo, se produce un error en el siguiente comando, ya que el nombre del proceso incluye la extensión de .exe
archivo.
Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE name='Notepad'"
Operadores de comparación de instrucciones WHERE
Los operadores siguientes son válidos en una instrucción 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
Hay otros operadores, pero estos son los que se usan para realizar comparaciones.
Por ejemplo, la consulta siguiente selecciona las propiedades Nombre y Prioridad de los procesos de la clase Win32_Process donde la prioridad del proceso es mayor o igual que 11. El Get-WmiObject
cmdlet ejecuta la consulta.
$highPriority = "Select Name, Priority from Win32_Process " +
"WHERE Priority >= 11"
Get-WmiObject -Query $highPriority
Uso de los operadores WQL en el parámetro -Filter
Los operadores WQL también se pueden usar en el valor del parámetro Filter de los Get-WmiObject
cmdlets o Get-CimInstance
, así como en el valor de los parámetros Query de estos cmdlets.
Por ejemplo, el siguiente comando obtiene las propiedades Name y ProcessID de los últimos cinco procesos que tienen valores ProcessID mayores que 1004. El comando usa el parámetro Filter para especificar la condición 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 del operador LIKE
El LIKE
operador permite usar caracteres comodín para filtrar los resultados de una consulta 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 [_].
Cuando el LIKE
operador se usa sin caracteres comodín ni operadores de intervalo, se comporta como el operador de igualdad (=
) y devuelve objetos solo cuando son una coincidencia exacta para el patrón.
Puede combinar la operación de intervalo con el carácter comodín de porcentaje (%
) para crear filtros sencillos y eficaces.
Ejemplos de operadores LIKE
Ejemplo 1: [<intervalo>]
Los siguientes comandos inician el Bloc de notas y, a continuación, buscan una instancia de la clase Win32_Process que tiene un nombre que comienza con una letra entre "H" y "N" (sin distinción entre mayúsculas y minúsculas).
La consulta debe devolver cualquier proceso de a través Notepad.exe
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
Ejemplo 2: [<intervalo>] y %
Los siguientes comandos seleccionan todo el proceso que tiene un nombre que comienza con una letra entre A y P (sin distinción entre mayúsculas y minúsculas) seguida de cero o más letras en cualquier combinación.
El Get-WmiObject
cmdlet ejecuta la consulta, el Select-Object
cmdlet obtiene las propiedades Name y ProcessID y el Sort-Object
cmdlet ordena los resultados en orden alfabético por nombre.
$query = "SELECT * FROM Win32_Process WHERE name LIKE '[A-P]%'"
Get-WmiObject -Query $query |
Select-Object -Property Name, ProcessID |
Sort-Object -Property Name
Ejemplo 3: No en el intervalo (^)
El siguiente comando obtiene procesos cuyos nombres no comienzan con ninguna de las letras siguientes: A, S, W, P, R, C, U, N
y siguió cero o más letras.
$query = "SELECT * FROM Win32_Process WHERE name LIKE '[^ASWPRCUN]%'"
Get-WmiObject -Query $query |
Select-Object -Property Name, ProcessID |
Sort-Object -Property Name
Ejemplo 4: Cualquier carácter , o ninguno (%)
Los comandos siguientes obtienen procesos que tienen nombres que comienzan por calc
.
El símbolo percent (%
) es el carácter comodín WQL. Es equivalente al carácter comodín asterisco (*
) en PowerShell.
$query = "SELECT * FROM Win32_Process WHERE Name LIKE 'calc%'"
Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name ProcessID
---- ---------
calc.exe 4424
Ejemplo 5: Un carácter (_)
Los siguientes comandos obtienen procesos que tienen los nombres que tienen el siguiente patrón, c_lc.exe
donde el carácter de subrayado representa cualquier carácter. Este patrón coincide con cualquier nombre de calc.exe
a través czlc.exe
de , o c9lc.exe
, pero no coincide con los nombres en los que los "c" y "l" están separados por más de un carácter.
$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
Ejemplo 6: Coincidencia exacta
Los comandos siguientes obtienen procesos denominados WLIDSVC.exe
. Aunque la consulta usa la LIKE
palabra clave , requiere una coincidencia exacta, ya que el valor no incluye ningún carácter comodín.
$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 del operador OR
Para especificar varias condiciones independientes, use la OR
palabra clave . La OR
palabra clave aparece en la WHERE
cláusula . Realiza una operación inclusiva OR
en dos (o más) condiciones y devuelve elementos que cumplen cualquiera de las condiciones.
El OR
operador tiene el formato siguiente:
WHERE <property> <operator> <value> OR <property> <operator> <value> ...
Por ejemplo, los siguientes comandos obtienen todas las instancias de la clase WMI de Win32_Process , pero las devuelve solo si el nombre del proceso es winword.exe
o excel.exe
.
$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
" OR Name='excel.exe'"
Get-WmiObject -Query $q
La OR
instrucción se puede usar con más de dos condiciones. En la consulta siguiente, la OR
instrucción obtiene Winword.exe
, Excel.exe
o Powershell.exe
.
$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
" OR Name='excel.exe' OR Name='powershell.exe'"
Utilizar el operador AND
Para especificar varias condiciones relacionadas, use la AND
palabra clave . La AND
palabra clave aparece en la WHERE
cláusula . Devuelve elementos que cumplen todas las condiciones.
El AND
operador tiene el formato siguiente:
WHERE <property> <operator> <value> `AND` <property> <operator> <value> ...
Por ejemplo, los siguientes comandos obtienen procesos que tienen un nombre y Winword.exe
el identificador de proceso de 6512.
Tenga en cuenta que los comandos usan el 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
Todos los operadores, incluidos los LIKE
operadores, son válidos con los OR
operadores y AND
. Además, puede combinar los OR
operadores y AND
en una sola consulta con paréntesis que indiquen a WMI qué cláusulas procesar primero.
Este comando usa el carácter de continuación de Windows PowerShell (`
) divide el comando en dos líneas.
Búsqueda de valores NULL
La búsqueda de valores NULL en WMI es complicada, ya que puede provocar resultados imprevisibles. Null
no es cero y no es equivalente a una cadena vacía. Algunas propiedades de clase WMI se inicializan y otras no, por lo que es posible que una búsqueda de null no funcione para todas las propiedades.
Para buscar valores NULL, use el operador Is con un valor de null
.
Por ejemplo, los siguientes comandos obtienen procesos que tienen un valor NULL para la propiedad IntallDate . Los comandos devuelven muchos procesos.
$q = "SELECT * FROM Win32_Process WHERE InstallDate is null"
Get-WmiObject -Query $q
Por el contrario, el siguiente comando obtiene las cuentas de usuario que tienen un valor NULL para la propiedad Description . Este comando no devuelve ninguna cuenta de usuario, aunque la mayoría de las cuentas de usuario no tienen ningún valor para la propiedad Description .
$q = "SELECT * FROM Win32_UserAccount WHERE Description is null"
Get-WmiObject -Query $q
Para buscar las cuentas de usuario que no tienen ningún valor para la propiedad Description , use el operador de igualdad para obtener una cadena vacía. Para representar la cadena vacía, use dos comillas simples consecutivas.
$q = "SELECT * FROM Win32_UserAccount WHERE Description = '' "
Uso de true o false
Para obtener valores booleanos en las propiedades de objetos WMI, use True
y False
.
No distinguen mayúsculas de minúsculas.
La siguiente consulta WQL devuelve solo las cuentas de usuario locales de un equipo unido a un dominio.
$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = True"
Get-CimInstance -Query $q
Para buscar cuentas de dominio, use un valor false, como se muestra en el ejemplo siguiente.
$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = False"
Get-CimInstance -Query $q
Usar el carácter de escape
WQL usa la barra diagonal inversa (\
) como carácter de escape. Esto es diferente de Windows PowerShell, que usa el carácter de retroceso (`
).
Las comillas y los caracteres usados para las comillas, a menudo deben ser de escape para que no se malinterpreten.
Para buscar un usuario cuyo nombre incluya una comilla simple, use una barra diagonal inversa para escapar de la comilla simple, como se muestra en el siguiente comando.
$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
En algunos casos, la barra diagonal inversa también debe escaparse. Por ejemplo, los siguientes comandos generan un error de consulta no válido debido a la barra diagonal inversa en el valor 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
Para escapar de la barra diagonal inversa, use un segundo carácter de barra diagonal inversa, como se muestra en el siguiente comando.
$q = "SELECT * FROM Win32_UserAccount WHERE Caption = 'Fabrikam\\TimO'"
Get-CimInstance -Query $q