about_WQL
Breve descrição
Descreve a WQL (WMI Query Language), que pode ser usada para obter objetos WMI no Windows 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.
Não é necessário usar WQL para executar uma consulta WMI no Windows PowerShell.
Em vez disso, você pode usar os parâmetros dos Get-WmiObject
cmdlets or Get-CimInstance
. As consultas WQL são um pouco mais rápidas do que os comandos padrão Get-WmiObject
e o desempenho melhorado é 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 WQL são SELECT
, WHERE
e FROM
.
Quando usar WQL
Ao trabalhar com WMI, e especialmente com WQL, não se esqueça de que você também está usando o Windows PowerShell. Muitas vezes, se uma consulta WQL não funcionar como esperado, é mais fácil usar um comando padrão do Windows PowerShell do que depurar a consulta WQL.
A menos que você esteja retornando grandes quantidades de dados de sistemas remotos com restrição de largura de banda, raramente é produtivo passar horas tentando aperfeiçoar uma consulta WQL complicada quando há um cmdlet PowerShell aceitável 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
declaração tem o seguinte formato:
SELECT <property> FROM <WMI-class>
Por exemplo, a instrução SELECT
a seguir seleciona todas as propriedades (*
) das instâncias da classe WMI Win32_BIOS.
SELECT * FROM Win32_BIOS
Nota
O PowerShell exibe apenas as propriedades do objeto padrão. 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 da 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á três maneiras de usar a consulta WQL no comando Windows PowerShell.
- Usar o
Get-WmiObject
cmdlet - Usar o
Get-CimInstance
cmdlet - Use o acelerador de
[wmisearcher]
tipo.
Usando o cmdlet Get-WmiObject
A maneira mais básica de usar a consulta WQL é colocá-la entre aspas (como uma cadeia de caracteres) e, em seguida, usar a cadeia de caracteres de consulta como o valor do parâmetro Query do Get-WmiObject
cmdlet, conforme mostrado no exemplo a seguir.
Get-WmiObject -Query "SELECT * FROM Win32_BIOS"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO - 1360
Você também pode salvar a instrução WQL em uma variável e, em seguida, usar a variável como o valor do parâmetro Query , conforme mostrado no comando a seguir.
$query = "SELECT * FROM Win32_BIOS"
Get-WmiObject -Query $query
Você pode usar qualquer formato com qualquer instrução WQL. O comando a seguir usa a consulta na $queryName
variável para obter apenas as propriedades Name e Version do BIOS do 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 :
Lembre-se de que você pode usar os parâmetros do Get-WmiObject
cmdlet para obter o mesmo resultado. Por exemplo, o comando a seguir também obtém os valores das propriedades Name e Version de instâncias da 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 :
Usando o cmdlet Get-CimInstance
A partir do Windows PowerShell 3.0, você pode usar o Get-CimInstance
cmdlet para executar consultas WQL.
Get-CimInstance
obtém instâncias de classes compatíveis com CIM, incluindo classes WMI. Os cmdlets CIM, introduzidos no Windows 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 CIM (Common Information Model), 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 com Get-WmiObject
o .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 tipo wmisearcher
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 que você consulte o WMI e configure a maneira como a consulta é conduzida.
Para usar o acelerador de [wmisearcher]
tipo:
- Converta a cadeia de caracteres WQL em um objeto ManagementObjectSearcher .
- 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 transmitir 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
Este 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
declaração estabelece condições para os dados que uma SELECT
declaração retorna.
A WHERE
declaraçã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, como 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-WmiObject -Query "SELECT * FROM Win32_Process WHERE name='Notepad.exe'"
No entanto, o comando a seguir falha, porque o nome do processo inclui a extensão de .exe
arquivo.
Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE name='Notepad'"
Operadores de comparação de instruções 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 estes são os utilizados para fazer comparações.
Por exemplo, a consulta a seguir seleciona as propriedades Name e Priority de processos na classe Win32_Process onde 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-WmiObject -Query $highPriority
Usando os operadores WQL no parâmetro -Filter
Os operadores WQL também podem ser usados no valor do parâmetro Filter dos Get-WmiObject
cmdlets or Get-CimInstance
, bem como no valor dos parâmetros Query desses cmdlets.
Por exemplo, o comando a seguir obtém as propriedades Name e ProcessId dos últimos cinco processos que têm ProcessId valores maiores que 1004. O comando usa o parâmetro Filter para especificar a condição 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
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 porcentagem (%
) 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-WmiObject -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 (não diferencia maiúsculas de minúsculas) seguida de zero ou mais letras em qualquer combinação.
O cmdlet Get-WmiObject
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-WmiObject -Query $query |
Select-Object -Property Name, ProcessId |
Sort-Object -Property Name
Exemplo 3: Não está no 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-WmiObject -Query $query |
Select-Object -Property Name, ProcessId |
Sort-Object -Property Name
Exemplo 4: Quaisquer caracteres -- ou nenhum (%)
Os comandos a seguir obtêm processos com 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-WmiObject -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 seguinte padrão, c_lc.exe
onde o caractere sublinhado representa qualquer caractere. Este padrão corresponde a qualquer nome de através calc.exe
de czlc.exe
, ou c9lc.exe
, mas não corresponde a nomes em que o "c" e "l" estão separados por mais de um caractere.
$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
Exemplo 6: Correspondência exata
Os comandos a seguir obtêm processos denominados WLIDSVC.exe
. Embora a consulta use a LIKE
palavra-chave, ela requer uma correspondência exata, porque o valor não inclui caracteres curinga.
$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
Utilização do operador das RUP
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-WmiObject -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 de e a ID do Winword.exe
processo de 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
e AND
operadores. Além disso, você pode combinar os operadores e OR
em uma única consulta com parênteses que informam ao AND
WMI quais cláusulas processar primeiro.
Este comando usa o caractere de continuação do Windows PowerShell (`
) dividir o comando em duas linhas.
Procurando valores nulos
A pesquisa de valores nulos no WMI é um desafio, porque 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 procurar 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 IntallDate . Os comandos retornam muitos processos.
$q = "SELECT * FROM Win32_Process WHERE InstallDate is null"
Get-WmiObject -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 . Este comando não retorna nenhuma conta de usuário, mesmo que 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-WmiObject -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 verdadeiro ou falso
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
WQL usa a barra invertida (\
) como seu caráter de escape. Isso é diferente do Windows PowerShell, que usa o caractere backtick (`
).
As aspas, e os caracteres usados para aspas, muitas vezes 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, o backslash também precisa ser escapado. Por exemplo, os comandos a seguir geram um erro de consulta inválida devido à barra invertida no valor de 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