Compartilhar via


about_WQL

Descrição curta

Descreve a WQL (Linguagem de Consulta WMI), que pode ser usada para obter objetos WMI no PowerShell.

Descrição longa

WQL é a linguagem de consulta WMI (Instrumentação de Gerenciamento do Windows), que é a linguagem usada para obter informações do WMI.

Você não precisa usar o WQL para executar uma consulta WMI no PowerShell. Em vez disso, você pode usar os parâmetros dos cmdlets CIM. As consultas WQL são um pouco mais rápidas do que os comandos CIM padrão e o desempenho aprimorado fica evidente quando os comandos são executados em centenas de sistemas. No entanto, certifique-se de que o tempo gasto para escrever uma consulta WQL bem-sucedida não supere a melhoria de desempenho.

As instruções WQL básicas que você precisa para usar o WQL são SELECT, WHERE, e FROM.

Quando usar o WQL

Ao trabalhar com o WMI e, especialmente, com o WQL, não se esqueça de que você também está usando o PowerShell. Geralmente, se uma consulta WQL não funcionar conforme o esperado, é mais fácil usar um comando padrão do PowerShell do que depurar a consulta WQL.

A menos que sua consulta retorne grandes quantidades de dados, raramente é produtivo passar horas tentando aperfeiçoar uma consulta WQL complicada quando há um cmdlet aceitável do PowerShell que faz a mesma coisa.

Usando a instrução SELECT

Uma consulta WMI típica começa com uma SELECT instrução que obtém todas as propriedades ou propriedades específicas de uma classe WMI. Para selecionar todas as propriedades de uma classe WMI, use um asterisco (*). A FROM palavra-chave especifica a classe WMI.

Uma SELECT instrução tem o seguinte formato:

SELECT <property> FROM <WMI-class>

Por exemplo, a instrução SELECT a seguir seleciona todas as propriedades (*) nas instâncias da classe WMI Win32_BIOS.

SELECT * FROM Win32_BIOS

Observação

O PowerShell exibe apenas as propriedades padrão do objeto. Essas propriedades são definidas no Types.ps1xml arquivo. Use o Select-Object cmdlet ou um Format-* cmdlet para exibir propriedades adicionais.

Para selecionar uma propriedade específica de uma classe WMI, coloque o nome da propriedade entre as SELECT palavras-chave e FROM .

A consulta a seguir seleciona apenas o nome do BIOS na classe WMI Win32_BIOS. O comando salva a $queryName consulta na variável.

SELECT Name FROM Win32_BIOS

Para selecionar mais de uma propriedade, use vírgulas para separar os nomes das propriedades. A consulta WMI a seguir seleciona o nome e a versão da classe WMI Win32_BIOS. O comando salva a $queryNameVersion consulta na variável.

SELECT name, version FROM Win32_BIOS

Usando a consulta WQL

Há duas maneiras de usar a consulta WQL no comando do PowerShell.

  • Usar os cmdlets do CIM
  • Usar o acelerador de [wmisearcher] tipo

Usando o cmdlet Get-CimInstance

Get-CimInstance obtém instâncias de classes compatíveis com CIM, incluindo classes WMI. Os cmdlets CIM, introduzidos no PowerShell 3.0, executam as mesmas tarefas que os cmdlets WMI. Os cmdlets CIM estão em conformidade com os padrões WS-Management (WSMan) e com o padrão Common Information Model (CIM), que permite que os cmdlets usem as mesmas técnicas para gerenciar computadores Windows e computadores que executam outros sistemas operacionais.

O comando a seguir usa o Get-CimInstance cmdlet para executar uma consulta WQL.

Qualquer consulta WQL que possa ser usada também Get-WmiObject pode ser usada com Get-CimInstance.

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

Get-CimInstance retorna um objeto CimInstance , em vez do ManagementObject que Get-WmiObject retorna, mas os objetos são bastante semelhantes.

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

Usando o acelerador de [wmisearcher] tipo

O [wmisearcher] acelerador de tipo cria um objeto ManagementObjectSearcher a partir de uma cadeia de caracteres de instrução WQL. O objeto ManagementObjectSearcher tem muitas propriedades e métodos, mas o método mais básico é o método Get, que invoca a consulta WMI especificada e retorna os objetos resultantes.

Usando [wmisearcher]o , você obtém acesso fácil à classe ManagementObjectSearcher .NET. Isso permite consultar o WMI e configurar a maneira como a consulta é conduzida.

Para usar o acelerador de [wmisearcher] tipo:

  1. Converta a cadeia de caracteres WQL em um objeto ManagementObjectSearcher .
  2. Chame o método Get do objeto ManagementObjectSearcher .

Por exemplo, o comando a seguir converte a consulta "selecionar tudo", salva o resultado na $bios variável e chama o Get() método do objeto ManagementObjectSearcher na $bios variável.

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

Você pode usar o [wmisearcher] acelerador de tipo para converter a consulta ou a variável. No exemplo a seguir, o [wmisearcher] acelerador de tipo é usado para converter a variável. O resultado é o mesmo.

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

Quando você usa o acelerador de [wmisearcher] tipo, ele altera a cadeia de caracteres de consulta em um objeto ManagementObjectSearcher , conforme mostrado nos comandos a seguir.

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

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

Esse formato de comando funciona em qualquer consulta. O comando a seguir obtém o valor da propriedade Name da 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   :

Usando a instrução WQL WHERE básica

Uma WHERE instrução estabelece condições para os dados retornados por uma SELECT instrução.

A WHERE instrução tem o seguinte formato:

WHERE <property> <operator> <value>

Por exemplo:

WHERE Name = 'Notepad.exe'

A WHERE instrução é usada com a SELECT instrução, conforme mostrado no exemplo a seguir.

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

Ao usar a WHERE instrução, o nome e o valor da propriedade devem ser precisos.

Por exemplo, o comando a seguir obtém os processos do Bloco de Notas no computador local.

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

No entanto, o comando a seguir falha, pois o nome do processo inclui a extensão do .exe arquivo.

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

Operadores de comparação de instrução WHERE

Os operadores a seguir são válidos em uma instrução 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

Existem outros operadores, mas esses são os usados para fazer comparações.

Por exemplo, a consulta a seguir seleciona as propriedades Name e Priority de processos na classe Win32_Process em que a prioridade do processo é maior ou igual a 11. O Get-WmiObject cmdlet executa a consulta.

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

Usando os operadores WQL no parâmetro -Filter

Os operadores WQL também podem ser usados no valor do parâmetro Filter do Get-CimInstance cmdlet, bem como no valor dos parâmetros de consulta desses cmdlets.

Por exemplo, o comando a seguir obtém as propriedades Name e ProcessId dos últimos cinco processos que têm valores ProcessId superiores a 1004. O comando usa o parâmetro Filter para especificar a condição ProcessId.

$getCimInstance = @{
    Class = 'Win32_Process'
    Property = 'Name', 'ProcessId'
    Filter = "ProcessId >= 1004"
}
Get-CimInstance @getCimInstance |
    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

Usando o operador LIKE

O LIKE operador permite que você use caracteres curinga para filtrar os resultados de uma 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 [_].

Quando o LIKE operador é usado sem caracteres curinga ou operadores de intervalo, ele se comporta como o operador de igualdade (=) e retorna objetos somente quando eles são uma correspondência exata para o padrão.

Você pode combinar a operação de intervalo com o caractere curinga percent (%) para criar filtros simples, mas poderosos.

Exemplos de operadores LIKE

Exemplo 1: [<intervalo>]

Os comandos a seguir iniciam o Bloco de Notas e, em seguida, procuram uma instância da classe Win32_Process que tenha um nome que comece com uma letra entre "H" e "N" (sem distinção entre maiúsculas e minúsculas).

A consulta deve retornar qualquer processo de Hotepad.exe até .Notepad.exe

Notepad   # Starts Notepad
$query = "SELECT * FROM Win32_Process WHERE Name LIKE '[H-N]otepad.exe'"
Get-CimInstance -Query $query | select Name, ProcessId
Name                                ProcessId
----                                ---------
notepad.exe                              1740

Exemplo 2: [<intervalo>] e %

Os comandos a seguir selecionam todos os processos que têm um nome que começa com uma letra entre A e P (sem distinção entre maiúsculas e minúsculas) seguida por zero ou mais letras em qualquer combinação.

O cmdlet Get-CimInstance executa a consulta, o cmdlet Select-Object obtém as propriedades Name e ProcessId e o cmdlet Sort-Object classifica os resultados em ordem alfabética por nome.

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

Exemplo 3: Fora do intervalo (^)

O comando a seguir obtém processos cujos nomes não começam com nenhuma das seguintes letras: A, S, W, P, R, C, U, N

e seguiu zero ou mais letras.

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

Exemplo 4: Qualquer caractere -- ou nenhum (%)

Os comandos a seguir obtêm processos que têm nomes que começam com calc. O símbolo de porcentagem (%) é o caractere curinga WQL. É equivalente ao curinga asterisco (*) no PowerShell.

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

Exemplo 5: Um caractere (_)

Os comandos a seguir obtêm processos que têm nomes que têm o padrão a seguir, c_lc.exe em que o caractere sublinhado representa qualquer caractere. Esse padrão corresponde a qualquer nome de calc.exe , czlc.exeou c9lc.exe, mas não corresponde a nomes nos quais o "c" e o "l" são separados por mais de um caractere.

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

Exemplo 6: Correspondência exata

Os comandos a seguir obtêm processos chamados WLIDSVC.exe. Mesmo que a consulta use a palavra-chave, ela requer uma correspondência exata, pois o valor não inclui nenhum caractere curinga LIKE .

$query = "SELECT * FROM Win32_Process WHERE name LIKE 'WLIDSVC.exe'"
Get-CimInstance -Query $query | Select-Object -Property Name, ProcessId
Name                                 ProcessId
----                                 ---------
WLIDSVC.exe                                84

Usando o operador OR

Para especificar várias condições independentes, use a OR palavra-chave. A OR palavra-chave aparece na WHERE cláusula. Ele executa uma operação inclusiva OR em duas (ou mais) condições e retorna itens que atendem a qualquer uma das condições.

O OR operador tem o seguinte formato:

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

Por exemplo, os comandos a seguir obtêm todas as instâncias da classe WMI Win32_Process , mas as retornam somente se o nome do processo for winword.exe ou excel.exe.

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

A OR instrução pode ser usada com mais de duas condições. Na consulta a seguir, a OR instrução obtém Winword.exe, Excel.exe, ou powershell.exe.

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

Usando o operador AND

Para especificar várias condições relacionadas, use a AND palavra-chave. A AND palavra-chave aparece na WHERE cláusula. Ele retorna itens que atendem a todas as condições.

O AND operador tem o seguinte formato:

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

Por exemplo, os comandos a seguir obtêm processos que têm um nome e a ID do Winword.exe processo 6512.

Observe que os comandos usam o 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 os operadores, incluindo os operadores LIKE , são válidos com os OR operadores e AND . E você pode combinar os operadores and OR em uma única consulta com parênteses que informam ao AND WMI quais cláusulas devem ser processadas primeiro.

Esse comando usa o caractere de continuação do PowerShell (`) dividir o comando em duas linhas.

Pesquisando valores nulos

Pesquisar valores nulos no WMI é um desafio, pois pode levar a resultados imprevisíveis. Null não é zero e não é equivalente a uma cadeia de caracteres vazia. Algumas propriedades de classe WMI são inicializadas e outras não, portanto, uma pesquisa por null pode não funcionar para todas as propriedades.

Para pesquisar valores nulos, use o operador Is com um valor de null.

Por exemplo, os comandos a seguir obtêm processos que têm um valor nulo para a propriedade InstallDate . Os comandos retornam muitos processos.

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

Por outro lado, o comando a seguir obtém contas de usuário que têm um valor nulo para a propriedade Description . Esse comando não retorna nenhuma conta de usuário, embora a maioria das contas de usuário não tenha nenhum valor para a propriedade Description .

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

Para localizar as contas de usuário que não têm valor para a propriedade Description , use o operador de igualdade para obter uma cadeia de caracteres vazia. Para representar a cadeia de caracteres vazia, use duas aspas simples consecutivas.

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

Usando true ou false

Para obter valores booleanos nas propriedades de objetos WMI, use True e False. Eles não diferenciam maiúsculas de minúsculas.

A consulta WQL a seguir retorna apenas contas de usuário locais de um computador ingressado no domínio.

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

Para localizar contas de domínio, use um valor de False, conforme mostrado no exemplo a seguir.

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

Usando o caractere de escape

O WQL usa a barra invertida (\) como seu caractere de escape. Isso é diferente do PowerShell, que usa o caractere backtick (`).

As aspas e os caracteres usados para aspas geralmente precisam ser escapados para que não sejam mal interpretados.

Para localizar um usuário cujo nome inclua aspas simples, use uma barra invertida para escapar das aspas simples, conforme mostrado no comando a seguir.

$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

Em alguns casos, a barra invertida também precisa ser escapada. Por exemplo, os comandos a seguir geram um erro de Consulta Inválida devido à barra invertida no valor da Legenda.

$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 da barra invertida, use um segundo caractere de barra invertida, conforme mostrado no comando a seguir.

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

Consulte também