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