about_WQL
Aplica-se a: Windows PowerShell 2.0, Windows PowerShell 3.0
TÓPICO
about_WQL
DESCRIÇÃO BREVE
Descreve a WMI Query Language (WQL), que pode ser usada para obter objetos WMI em Windows PowerShell®.
DESCRIÇÃO LONGA
WQL é a linguagem de consulta da WMI (Instrumentação de Gerenciamento do Windows), que é a linguagem usada para obter informações do WMI.
Não é necessário usar o WQL para executar uma consulta WMI em Windows PowerShell. Em vez disso, você pode usar os parâmetros dos cmdlets Get-WmiObject ou Get-CimInstance. Consultas WQL são um pouco mais rápidas do que os comandos Get-WmiObject padrão e o desempenho aprimorado é evidente quando os comandos são executados em centenas de sistemas. No entanto, certifique-se de que o tempo gasto para gravar uma consulta WQL bem-sucedida não supere a melhoria de desempenho.
As instruções básicas da WQL de que você precisa para usar a WQL são Select, Where e From.
QUANDO USAR A WQL
Ao trabalhar com o WMI, e especialmente com a WQL, não se esqueça de que você também está usando o Windows PowerShell. Muitas vezes, se uma consulta WQL não funciona conforme o esperado, é mais fácil usar um comando Windows PowerShell padrão do que depurar a consulta WQL.
A menos que você esteja retornando grandes quantidades de dados de sistemas remotos de largura de banda restrita, raramente é produtivo passar horas tentando aperfeiçoar uma consulta WQL complicada, quando há um cmdlet do Windows perfeitamente aceitável que faz a mesma coisa, porém um pouco mais lentamente.
USO DA INSTRUÇÃO SELECT
Uma consulta WMI típica começa com uma instrução Select que usa todas as propriedades ou propriedades específicas de uma classe WMI. Para selecionar todas as propriedades de uma classe WMI, use um asterisco (*). A palavra-chave From especifica a classe WMI.
Uma instrução Select tem o seguinte formato:
Select <property> from <WMI-class>
Por exemplo, a seguinte instrução Select seleciona todas as propriedades (*) das instâncias da classe Win32_Bios WMI.
Select * from Win32_Bios
Para selecionar uma propriedade específica de uma classe WMI, coloque o nome de propriedade entre as palavras-chave Select e From.
A seguinte consulta seleciona apenas o nome do BIOS da classe Win32_Bios WMI. O comando salva a consulta na variável $queryName.
Select Name from Win32_Bios
Para selecionar mais de uma propriedade, use vírgulas para separar os nomes de propriedade. A seguinte consulta WMI seleciona o nome e a versão da classe Win32_Bios WMI. O comando salva a consulta na variável $queryNameVersion.
Select name, version from Win32_Bios
USO DA CONSULTA WQL
Há duas maneiras de usar a consulta WQL no comando Windows PowerShell.
Use o cmdlet Get-WmiObject
Use o cmdlet Get-CimInstance
Use o acelerador de tipo [wmisearcher].
USO DO CMDLET GET-WMIOBJECT
A maneira mais simples 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 de consulta do cmdlet Get-WmiObject, conforme mostrado no seguinte exemplo.
PS C:\> Get-WmiObject -Query "Select * from Win32_Bios"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO – 1360
Você pode também salvar a instrução WQL em uma variável e, em seguida, usar a variável como o valor do parâmetro de consulta, conforme mostrado no seguinte comando.
PS C:\> $query = "Select * from Win32_Bios"
PS C:\> Get-WmiObject –Query $query
Você pode usar qualquer um dos formatos com qualquer instrução WQL. O seguinte comando usa a consulta na variável $queryName para obter somente as propriedades de nome e versão do BIOS do sistema.
PS C:\> $queryNameVersion = "Select Name, Version from Win32_Bios"
PS C:\> 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
Lembre-se de que você pode usar os parâmetros do cmdlet Get-WmiObject para obter o mesmo resultado. Por exemplo, o seguinte comando também obtém os valores das propriedades de nome e versão de instâncias da classe Win32_Bios WMI.
PS C:\> 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
USO DO CMDLET GET-CIMINSTANCE
A partir do Windows PowerShell 3.0, você pode usar o cmdlet Get-CimInstance para executar consultas WQL.
O Get-CimInstance obtém instâncias de classes compatíveis com CIM, incluindo classes WMI. Os cmdlets do CIM, introduzidos pelo Windows PowerShell 3.0, executam as mesmas tarefas que os cmdlets da WMI. Os cmdlets do CIM estão em conformidade com os padrões WS-Management (WSMan) e com o padrão Common Information Model (CIM), que permitem que os cmdlets usem as mesmas técnicas para gerenciar computadores com Windows e computadores que executam outros sistemas operacionais.
O seguinte comando usa o cmdlet Get-CimInstance para executar uma consulta WQL.
Qualquer consulta WQL que pode ser usada com o Get-WmiObject também pode ser usada com o Get-CimInstance.
PS C:\> Get-CimInstance -Query "Select * from Win32_Bios"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO – 1360
O Get-CimInstance retorna um objeto CimInstance, ao invés do ManagementObject retornado pelo Get-WmiObject, mas os objetos são bem semelhantes.
PS C:\>(Get-CimInstance -Query "Select * from Win32_Bios").GetType().FullName
Microsoft.Management.Infrastructure.CimInstance
PS C:\>(Get-WmiObject -Query "Select * from Win32_Bios").GetType().FullName
System.Management.ManagementObject
USO DO ACELERADOR DE TIPO [wmisearcher]
O Acelerador de tipo [wmisearcher] cria um objeto ManagementObjectSearcher por meio de uma cadeia de caracteres da 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 o [wmisearcher], você tem acesso fácil à classe ManagementObjectSearcher .NET Framework. Isso permite que você consulte a WMI e configure o modo como a consulta é realizada.
Para usar o acelerador de tipo [wmisearcher]:
1. Converta a cadeia de caracteres WQL em um objeto ManagementObjectSearcher.
2. Chame o método Get do objeto ManagementObjectSearcher.
Por exemplo, o seguinte comando converte a consulta "selecionar tudo", salva o resultado na variável $bios e, em seguida, chama o método Get do objeto ManagementObjectSearcher na variável $bios.
PS C:\> $bios = [wmisearcher]"Select * from Win32_Bios"
PS C:\> $bios.Get()
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO – 1360
OBSERVAÇÃO:
Por padrão, apenas as propriedades do objeto selecionado são exibidas. Essas propriedades são definidas no arquivo Types.ps1xml.
Você pode usar o acelerador de tipo [wmisearcher] para converter a consulta ou a variável. No seguinte exemplo, o acelerador de tipo [wmisearcher] é usado para converter a variável. O resultado é o mesmo.
PS C:\> [wmisearcher]$bios = "Select * from Win32_Bios"
PS C:\> $bios.Get()
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO – 1360
Quando você usa o acelerador de tipo [wmisearcher], ele transforma a cadeia de caracteres de consulta em um objeto ManagementObjectSearcher, conforme mostrado nos comandos a seguir.
PS C:\>$a = "Select * from Win32_Bios"
PS C:\>$a.GetType().FullName
System.String
PS C:\>$a = [wmisearcher]"Select * from Win32_Bios"
PS C:\>$a.GetType().FullName
System.Management.ManagementObjectSearcher
Esse formato de comando funciona em qualquer consulta. O seguinte comando obtém o valor da propriedade Name da classe Win32_Bios WMI.
PS C:\> $biosname = [wmisearcher]"Select Name from Win32_Bios"
PS C:\> $biosname.Get()
__GENUS : 2
__CLASS : Win32_BIOS
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Name : Default System BIOS
Você pode executar essa operação em um único comando, embora o comando seja um pouco mais difícil de interpretar.
Nesse formato, use o acelerador de tipo [wmisearcher] para converter a cadeia de caracteres de consulta WQL em um ManagementObjectSearcher e, em seguida, chamar o método Get no objeto – tudo em um único comando. Os parênteses () que envolvem a cadeia de caracteres convertida direcionam o Windows PowerShell para converter a cadeia de caracteres antes de chamar o método.
PS C:\> ([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
USO DA INSTRUÇÃO WQL BÁSICA WHERE
A instrução Where estabelece condições para os dados retornados por uma instrução Select.
A instrução Where tem o seguinte formato:
where <property> <operator> <value>
Por exemplo:
where Name = 'Notepad.exe'
A instrução Where é usada com a instrução Select, conforme mostrado no seguinte exemplo.
Select * from Win32_Process where Name = 'Notepad.exe'
Ao usar a instrução Where, o nome da propriedade e o valor devem ser precisos.
Por exemplo, o seguinte comando obtém os processos do Bloco de notas do computador local.
PS C:\> Get-WmiObject -Query "Select * from Win32_Process where name = 'Notepad.exe'"
No entanto, o seguinte comando falha, porque o nome do processo inclui a extensão de nome de arquivo ".exe".
PS C:\> Get-WmiObject -Query "Select * from Win32_Process where name = 'Notepad'"
OPERADORES DE COMPARAÇÃO DA INSTRUÇÃO WHERE
Os seguintes operadores 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
Há outros operadores, mas esses são os usados para fazer comparações.
Por exemplo, a seguinte consulta seleciona as propriedades Name e Priority dos processos na classe Win32_Process em que a prioridade do processo é maior que ou igual a 11. O cmdlet Get-WmiObject executa a consulta.
$highPriority = "Select Name, Priority from Win32_Process where Priority >= 11"
Get-WmiObject -Query $highPriority
USO DOS OPERADORES WQL NO PARÂMETRO DE FILTRO
Os operadores WQL também podem ser usados no valor do parâmetro de filtro dos cmdlets Get-WmiObject ou Get-CimInstance, bem como no valor dos parâmetros de consulta desses cmdlets.
Por exemplo, o seguinte comando obtém as propriedades Name e ProcessID dos últimos cinco processos que têm valores ProcessID maiores que 1004. O comando usa o parâmetro de filtro para especificar a condição ProcessID.
PS C:\> 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
USO DO OPERADOR LIKE
O operador Like permite que você use caracteres curinga para filtrar os resultados de uma consulta WQL.
Descrição do operador Like
[]
Caractere em um intervalo [a-f] ou um conjunto de caracteres [abcdef]. Os itens em um conjunto não precisam ser consecutivos ou listados em ordem alfabética.
^
Caractere não está em um intervalo [^a-f] ou não está em um conjunto [^abcdef]. Os itens em um conjunto não precisam ser consecutivos ou listados em ordem alfabética.
%
Uma cadeia de zero ou mais caracteres
_
Um caractere.
(sublinhado)
OBSERVAÇÃO:
Para usar um sublinhado literal em uma cadeia de caracteres de consulta, coloque-o entre colchetes [_].
Quando o operador Like é usado sem caracteres curinga ou operadores de intervalo, ele se comporta como o operador de igualdade (=) e retorna objetos apenas quando eles são uma correspondência exata para o padrão.
Você pode combinar a operação de intervalo com o caractere curinga de porcentagem para criar filtros simples, mas poderosos.
EXEMPLOS DO OPERADOR LIKE
EXEMPLO 1: [<intervalo>]
Os seguintes comandos iniciam o Bloco de notas e, em seguida, procuram por uma instância da classe Win32_Process que tenha um nome que comece com uma letra entre "H" e "N" (diferencia maiúsculas de minúsculas).
A consulta deve retornar qualquer processo de Hotpad.exe até Notepad.exe.
PS C:\> Notepad # Starts Notepad
PS C:\> $query = "Select * from win32_Process where Name LIKE '[H-N]otepad.exe'"
PS C:\> Get-WmiObject -Query $query | Select Name, ProcessID
Name ProcessID
---- ---------
notepad.exe 1740
EXEMPLO 2: [<intervalo>] e %
Os seguintes comandos selecionam todos os processos que tenham um nome que comece com uma letra entre A e P (diferencia maiúsculas de minúsculas) seguida por 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.
PS C:\>$query = "Select * from win32_Process where name LIKE '[A-P]%'"
PS C:\>Get-WmiObject -Query $query |
Select-Object -Property Name, ProcessID |
Sort-Object -Property Name
EXEMPLO 3: Fora do intervalo (^)
O seguinte comando obtém processos cujos nomes não começam com nenhuma das seguintes letras: A, S, W, P, R, C, U, N e seguidas de zero ou mais letras.
PS C:\>$query = "Select * from win32_Process where name LIKE '[^ASWPRCUN]%'"
PS C:\>Get-WmiObject -Query $query |
Select-Object -Property Name, ProcessID |
Sort-Object -Property Name
EXEMPLO 4: Qualquer caractere, ou nenhum (%)
Os seguintes comandos obtêm processos que tenham nomes que começam com "calc". O símbolo % na WQL é equivalente ao símbolo de asterisco (*) em expressões regulares.
PS C:\> $query = "Select * from win32_Process where Name LIKE 'calc%'"
PS C:\> Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name ProcessID
---- ---------
calc.exe 4424
EXEMPLO 5: Um caractere (_)
Os seguintes comandos obtêm processos que tenham nomes com o padrão a seguir, "c_lc.exe", nos quais o caractere de sublinhado representa qualquer caractere. Esse padrão corresponde a qualquer nome de calc.exe até czlc.exe ou c9lc.exe, mas não corresponde aos nomes nos quais o "c" e "l" são separados por mais de um caractere.
PS C:\> $query = "Select * from Win32_Process where Name LIKE 'c_lc.exe'"
PS C:\> Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name ProcessID
---- ---------
calc.exe 4424
EXEMPLO 6: Correspondência exata
Os seguintes comandos obtêm processos chamados WLIDSVC.exe. Embora a consulta use a palavra-chave Like, ela requer uma correspondência exata, porque o valor não inclui nenhum caractere curinga.
$query = "Select * from win32_Process where name LIKE 'WLIDSVC.exe'"
Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name ProcessID
---- ---------
WLIDSVC.exe 84
USO DO OPERADOR OR
Para especificar várias condições independentes, use a palavra-chave Or. A palavra-chave Or aparece na cláusula Where. Ela executa uma operação OR inclusiva em duas (ou mais) condições e retorna os itens que atendem a qualquer uma das condições.
O operador Or tem o seguinte formato:
Where <property> <operator> <value> or <property> <operator> <value> ...
Por exemplo, os seguintes comandos 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.
PS C:\>$q = "Select * from Win32_Process where Name = 'winword.exe' or Name = 'excel.exe'"
PS C:\>Get-WmiObject -Query $q
A instrução Or pode ser usada com mais de duas condições. Na seguinte consulta, a instrução Or 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'"
USO DO OPERADOR AND
Para especificar várias condições relacionadas, use a palavra-chave And. A palavra-chave And aparece na cláusula Where. Ela retorna os itens que atendem a todas as condições.
O operador And tem o seguinte formato:
Where <property> <operator> <value> and <property> <operator> <value> ...
Por exemplo, os seguintes comandos obtêm os processos que têm um nome de "Winword.exe" e a ID do processo de 6512.
Observe que os comandos usam o cmdlet Get-CimInstance.
PS C:\>$q = "Select * from Win32_Process where Name = 'winword.exe' and ProcessID =6512"
PS C:\> 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 operadores Or e And. E, você pode combinar os operadores Or e And em uma única consulta com parênteses que informam ao Windows PowerShell quais cláusulas serão processadas primeiro.
Este comando usa o caractere de continuação do Windows PowerShell (`) que divide o comando em duas linhas.
PS C:\> $q = "Select * from Win32_Process `
where (Name = 'winword.exe' or Name = 'excel.exe') and HandleCount > 700"
PS C:\> Get-CimInstance -Query $q
ProcessId Name HandleCount WorkingSetSize VirtualSize
--------- ---- ----------- -------------- -----------
6512 WINWORD.EXE 797 117268480 634425344
9610 EXCEL.EXE 727 38858752 323227648
PESQUISA POR VALORES NULOS
Pesquisar por valores nulos no WMI é um desafio porque pode levar a resultados imprevisíveis. Nulo não é zero e não é equivalente a ou uma cadeia de caracteres vazia. Algumas propriedades de classe WMI são inicializadas e outras não, então, uma pesquisa por nulos pode não funcionar para todas as propriedades.
Para procurar por valores nulos, use o operador Is com um valor de "null".
Por exemplo, os seguintes comandos obtêm os processos que tenham um valor nulo para a propriedade IntallDate. Os comandos retornam muitos processos.
PS C:\>$q = "Select * from Win32_Process where InstallDate is null"
PS C:\>Get-WmiObject -Query $q
Por outro lado, o seguinte comando obtém contas de usuário que tenham valor nulo para a propriedade de descrição. Esse comando não retorna nenhuma conta de usuário, embora a maioria das contas de usuário não tenham nenhum valor para a propriedade de descrição.
PS C:\>$q = "Select * from Win32_UserAccount where Description is null"
PS C:\>Get-WmiObject -Query $q
Para localizar as contas de usuário que não tenham nenhum valor para a propriedade de descrição, use o operador de igualdade para obter uma cadeia de caracteres vazia. Para representar a cadeia de caracteres vazia, use duas aspas simples e consecutivas.
$q = "Select * from Win32_UserAccount where Description = '' "
USO DE TRUE OU FALSE
Para obter valores boolianos nas propriedades de objetos WMI, use True e False. Eles não diferenciam maiúsculas de minúsculas.
A seguinte consulta WQL retorna apenas as contas de usuário locais de um computador de domínio associado.
PS C:\>$q = "Select * from Win32_UserAccount where LocalAccount = True"
PS C:\>Get-CimInstance -Query $q
Para localizar contas de domínio, use um valor False, conforme mostrado no seguinte exemplo.
PS C:\>$q = "Select * from Win32_UserAccount where LocalAccount = False"
PS C:\>Get-CimInstance -Query $q
USO DO CARACTERE DE ESCAPE
WQL usa a barra invertida (\) como o caractere de escape. Isso é diferente do Windows PowerShell, que usa o caractere de acento grave (`).
As aspas e os caracteres usados para aspas muitas vezes precisam ser ignorados para que eles não sejam interpretados incorretamente.
Para localizar um usuário cujo nome inclua aspas simples, use uma barra invertida para ignorar as aspas simples, conforme mostrado no seguinte comando.
PS C:\> $q = "Select * from Win32_UserAccount where Name = 'Tim O\'Brian'"
PS C:\> 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 ignorada. Por exemplo, os seguintes comandos geram um erro de consulta inválida devido à barra invertida no valor da legenda.
PS C:\> $q = "Select * from Win32_UserAccount where Caption = 'Fabrikam\TimO'"
PS C:\> Get-CimInstance -Query $q
Get-CimInstance : Invalid query
At line:1 char:1
+ Get-CimInstance -Query $q
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-CimInstance], CimException
+ FullyQualifiedErrorId : HRESULT 0x80041017,Microsoft.Management.Infrastructure.CimCmdlets
Para ignorar a barra invertida, use um segundo caractere de barra invertida, conforme mostrado no seguinte comando.
PS C:\> $q = "Select * from Win32_UserAccount where Caption = 'Fabrikam\\TimO'"
PS C:\> Get-CimInstance -Query $q
CONSULTE TAMBÉM
about_Escape_Characters
about_Quoting_Rules
about_WMI
about_WMI_Cmdlets