Поделиться через


about_WQL

Назначение: Windows PowerShell 2.0, Windows PowerShell 3.0

РАЗДЕЛ

about_WQL

КРАТКОЕ ОПИСАНИЕ

Содержит описание языка запросов WMI (WQL), используемого для получения объектов WMI в Windows PowerShell®.

ПОДРОБНОЕ ОПИСАНИЕ

WQL — это язык запросов инструментария управления Windows (WMI), используемый для получения информации из инструментария WMI.

Для выполнения запроса WMI Windows PowerShell необязательно использовать язык WQL. Вместо этого можно использовать параметры командлета Get-WmiObject или Get-CimInstance. Запросы WQL выполняются немного быстрее, чем стандартные команды Get-WmiObject. Повышение производительности особенно заметно при выполнении команд в сотнях систем. Однако вы должны быть уверены в том, что это преимущество в плане производительности перевесит время, потраченное на создание эффективного запроса WQL.

Основные инструкции WQL — это Select, Where и From.

КОГДА СЛЕДУЕТ ИСПОЛЬЗОВАТЬ WQL

При работе с инструментарием WMI и особенно с языком WQL не забывайте о том, что вы также работаете с Windows PowerShell. Если запрос WQL не работает должным образом, то часто проще использовать стандартную команду Windows PowerShell, чем отлаживать запрос.

Если только вы не получаете значительные объемы данных из удаленных систем в условиях ограниченной пропускной способности, редко имеет смысл тратить часы, пытаясь довести до совершенства сложный и запутанный запрос WQL, когда есть вполне подходящий командлет Windows, который делает то же самое, пусть и немного медленнее.

ИСПОЛЬЗОВАНИЕ ИНСТРУКЦИИ SELECT

Типичный запрос WMI начинается с инструкции Select, получающей все или некоторые свойства класса WMI. Чтобы выбрать все свойства класса WMI, используйте символ звездочки (*). Ключевое слово From задает класс WMI.

Инструкция Select имеет следующий формат:

        Select <property> from <WMI-class>

Например, приведенная ниже инструкция Select выбирает все свойства (*) из экземпляров класса WMI Win32_Bios.

        Select * from Win32_Bios

Чтобы выбрать определенное свойство класса WMI, поместите имя свойства между ключевыми словами Select и From.

Приведенный ниже запрос выбирает только имя BIOS из класса WMI Win32_Bios. Команда сохраняет запрос в переменной $queryName.

        Select Name from Win32_Bios

Чтобы выбрать несколько свойств, разделите их имена запятыми. Приведенный ниже запрос WMI выбирает имя и версию из класса WMI Win32_Bios. Команда сохраняет запрос в переменной $queryNameVersion.

        Select name, version from Win32_Bios

ИСПОЛЬЗОВАНИЕ ЗАПРОСА WQL

Запрос WQL можно использовать в команде Windows PowerShell двумя способами.

Командлет Get-WmiObject

Командлет Get-CimInstance

Ускоритель типа [wmisearcher]

КОМАНДЛЕТ GET-WMIOBJECT

Самый простой способ использования запроса WQL состоит в следующем: заключите его в кавычки (как строку), а затем используйте строку запроса в качестве значения параметра Query командлета Get-WmiObject, как показано в примере ниже.

        PS C:\> Get-WmiObject -Query "Select * from Win32_Bios"
        SMBIOSBIOSVersion : 8BET56WW (1.36 )
        Manufacturer      : LENOVO
        Name              : Default System BIOS
        SerialNumber      : R9FPY3P
        Version           : LENOVO – 1360

Можно также сохранить инструкцию WQL в переменной, а затем использовать эту переменную в качестве значения параметра Query, как показано в приведенной ниже команде.

        PS C:\> $query = "Select * from Win32_Bios"
        PS C:\> Get-WmiObject –Query $query

Оба этих формата можно использовать с любой инструкцией WQL. Приведенная ниже команда использует запрос в переменной $queryName, чтобы получить только свойства имени и версии BIOS компьютера.

        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

Помните, что тот же результат можно получить с помощью параметров командлета Get-WmiObject. Например, приведенная ниже команда также возвращает значения свойств Name и Version экземпляров класса WMI Win32_Bios.

        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

КОМАНДЛЕТ GET-CIMINSTANCE

Начиная с версии Windows PowerShell 3.0 можно выполнять запросы WQL с помощью командлета Get-CimInstance.

Командлет Get-CimInstance возвращает экземпляры классов, совместимых с моделью CIM, включая классы WMI. Командлеты CIM, появившиеся в Windows PowerShell 3.0, выполняют те же задачи, что и командлеты WMI. Командлеты CIM соответствуют стандартам WS-Management (WSMan) и CIM, что позволяет им использовать одинаковые способы для управления компьютерами с ОС Windows и другими операционными системами.

В приведенной ниже команде командлет Get-CimInstance используется для выполнения запроса WQL.

Любой запрос WQL, который можно использовать с командлетом Get-WmiObject, также можно использовать с командлетом 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

Командлет Get-CimInstance возвращает объект CimInstance вместо объекта ManagementObject, возвращаемого командлетом Get-WmiObject, но эти объекты во многом схожи.

        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

УСКОРИТЕЛЬ ТИПА [wmisearcher]

Ускоритель типа [wmisearcher] создает объект ManagementObjectSearcher на основе строки с инструкцией WQL. У объекта ManagementObjectSearcher много свойств и методов, но самый основной из них — это метод Get, который вызывает указанный запрос WMI и возвращает полученные объекты.

Ускоритель [wmisearcher] упрощает доступ к классу .NET Framework ManagementObjectSearcher. Это позволяет запрашивать инструментарий WMI и настраивать способ выполнения запроса.

Для использования ускорителя типа [wmisearcher] выполните указанные ниже действия.

1. Приведите строку WQL к объекту ManagementObjectSearcher.

2. Вызовите метод Get объекта ManagementObjectSearcher.

Например, приведенная ниже команда приводит запрос «выбрать все», сохраняет результат в переменной $bios, а затем вызывает метод Get объекта ManagementObjectSearcher в переменной $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

ПРИМЕЧАНИЕ.

По умолчанию отображаются только выбранные свойства объекта. Эти свойства определены в файле Types.ps1xml.

С помощью ускорителя типа [wmisearcher] можно привести запрос или переменную. В примере ниже ускоритель типа [wmisearcher] используется для приведения переменной. Результат будет такой же.

        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

При использовании ускорителя типа [wmisearcher] он изменяет строку запроса на объект ManagementObjectSearcher, как показано в приведенных ниже командах.

        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

Этот формат команды применим к любому запросу. Приведенная ниже команда возвращает значение свойства Name класса WMI Win32_Bios.

        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

Эту операцию можно выполнить в одной команде, хотя она будет немного сложнее для интерпретации.

В этом формате строка запроса WQL приводится к объекту ManagementObjectSearcher с помощью ускорителя типа [wmisearcher], а затем вызывается метод Get этого объекта — все это в одной команде. Круглые скобки (), в которые заключена приводимая строка, предписывают среде Windows PowerShell привести строку перед вызовом метода.

        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

ИСПОЛЬЗОВАНИЕ БАЗОВОЙ ИНСТРУКЦИИ WHERE ЯЗЫКА WQL

Инструкция Where задает условия, определяющие данные, которые возвращает инструкция Select.

Инструкция Where имеет следующий формат:

        where <property> <operator> <value>

Например:

        where Name = 'Notepad.exe'

Инструкция Where используется с инструкцией Select, как показано в примере ниже.

        Select * from Win32_Process where Name = 'Notepad.exe'

При использовании инструкции Where нужно точно указывать имя и значение свойства.

Например, приведенная ниже команда возвращает процессы Блокнота на локальном компьютере.

        PS C:\> Get-WmiObject -Query "Select * from Win32_Process where name = 'Notepad.exe'"

Однако следующая команда завершается ошибкой, так как имя процесса включает расширение «.exe».

        PS C:\> Get-WmiObject -Query "Select * from Win32_Process where name = 'Notepad'"

ОПЕРАТОРЫ СРАВНЕНИЯ В ИНСТРУКЦИИ WHERE

В инструкции Where языка WQL допустимы указанные ниже операторы.

    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

Есть и другие операторы, но для сравнения используются эти.

Например, приведенный ниже запрос выбирает свойства Name и Priority процессов класса Win32_Process, приоритет которых больше или равен 11. Запрос выполняется командлетом Get-WmiObject.

        $highPriority = "Select Name, Priority from Win32_Process where Priority >= 11"
        Get-WmiObject -Query $highPriority

ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ WQL В ПАРАМЕТРЕ FILTER

Операторы WQL также можно использовать в значении параметра Filter командлетов Get-WmiObject и Get-CimInstance, а также в значении параметра Query этих командлетов.

Например, приведенная ниже команда возвращает свойства Name и ProcessID последних пяти процессов, значение свойства ProcessID которых больше 1004. В команде используется параметр Filter для указания условия 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

ИСПОЛЬЗОВАНИЕ ОПЕРАТОРА LIKE

Оператор Like позволяет использовать подстановочные знаки для фильтрации результатов запроса WQL.

Описание оператора Like

[]

Символ из диапазона [a–f] или набор символов [abcdef]. Элементы в наборе не обязательно должны следовать подряд или в алфавитном порядке.

^

Символ, не относящийся к диапазону [^a–f] или набору [^abcdef]. Элементы в наборе не обязательно должны следовать подряд или в алфавитном порядке.

%

Строка из нуля или более символов

_

Один символ.

(символ подчеркивания)

ПРИМЕЧАНИЕ.

Чтобы использовать символ подчеркивания в строке запроса в качестве литерала, заключите его в квадратные скобки [_].

Когда оператор Like используется без подстановочных знаков и операторов диапазона, он ведет себя как оператор равенства (=) и возвращает объекты только в том случае, если они точно соответствуют шаблону.

Оператор диапазона можно объединять с подстановочным знаком в виде символа процента для создания простых, но эффективных фильтров.

ПРИМЕРЫ ОПЕРАТОРА LIKE

ПРИМЕР 1. [<диапазон>]

Приведенные ниже команды запускают Блокнот, а затем ищут экземпляр класса Win32_Process, имя которого начинается с буквы в диапазоне от «H» до «N» (без учета регистра).

Запрос должен вернуть любой процесс от Hotpad.exe до 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

ПРИМЕР 2. [<диапазон>] и %

Приведенные ниже команды выбирают все процессы с именами, начинающимися с буквы в диапазоне от «A» до «P» (без учета регистра), за которой следует ноль или несколько букв в любом сочетании.

Командлет Get-WmiObject выполняет запрос, командлет Select-Object возвращает свойства Name и ProcessID, а командлет Sort-Object сортирует результаты по имени в алфавитном порядке.

        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

ПРИМЕР 3. Не в диапазоне (^)

Приведенная ниже команда возвращает процессы, имена которых не начинаются с буквы «A», «S», «W», «P», «R», «C», «U» или «N», за которой следует ноль или несколько букв.

        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

ПРИМЕР 4. Любые символы или ни одного символа (%)

Приведенные ниже команды возвращают процессы, имена которых начинаются с «calc». Символ «%» в языке WQL эквивалентен символу звездочки (*) в регулярных выражениях.

        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

ПРИМЕР 5. Один символ (_)

Приведенные ниже команды возвращают процессы, имена которых соответствуют шаблону «c_lc.exe», где символ подчеркивания представляет любой символ. Этому шаблону соответствуют любые имена от calc.exe до czlc.exe или c9lc.exe, но не соответствуют имена, в которых между буквами «c» и «l» имеется более одного символа.

      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

ПРИМЕР 6. Точное совпадение

Приведенные ниже команды возвращают процессы с именем WLIDSVC.exe. Хотя в запросе используется ключевое слово Like, требуется точное совпадение, так как в значении нет подстановочных знаков.

        $query = "Select * from win32_Process where name LIKE 'WLIDSVC.exe'"
        Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
        Name                                 ProcessID
        ----                                 ---------
        WLIDSVC.exe                                84

ИСПОЛЬЗОВАНИЕ ОПЕРАТОРА OR

Чтобы указать несколько независимых условий, используйте ключевое слово Or. Ключевое слово Or используется в предложении Where. Оно выполняет операцию включающего ИЛИ над двумя (или более) условиями и возвращает элементы, отвечающие любому из условий.

Оператор Or имеет следующий формат:

        Where <property> <operator> <value> or <property> <operator> <value> ...

Например, приведенные ниже команды получают все экземпляры класса WMI Win32_Process, но возвращают их только в том случае, если процесс имеет имя winword.exe или excel.exe.

        PS C:\>$q = "Select * from Win32_Process where Name = 'winword.exe' or Name = 'excel.exe'"
        PS C:\>Get-WmiObject -Query $q

Оператор Or можно использовать с более чем двумя условиями. В приведенном ниже запросе инструкция Or возвращает процессы Winword.exe, Excel.exe или Powershell.exe.

        $q = "Select * from Win32_Process where Name = 'winword.exe' or Name = 'excel.exe' or Name = 'powershell.exe'"

ИСПОЛЬЗОВАНИЕ ОПЕРАТОРА AND

Чтобы указать несколько связанных условий, используйте ключевое слово And. Ключевое слово And используется в предложении Where. Оно возвращает элементы, отвечающие всем условиям.

Оператор And имеет следующий формат:

        Where <property> <operator> <value> and <property> <operator> <value> ...

Например, приведенные ниже команды возвращают процессы с именем «Winword.exe» и идентификатором 6512.

Обратите внимание, что в командах используется командлет 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

С операторами Or и And допускается использовать любые операторы, включая Like. Кроме того, вы можете объединять операторы Or и And в одном запросе с помощью круглых скобок, которые указывают среде Windows PowerShell, какие предложения следует обработать первыми.

В этой команде символ продолжения Windows PowerShell (`) используется для разделения команды на две строки.

        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

ПОИСК ЗНАЧЕНИЙ NULL

Поиск значений null в инструментарии WMI является сложной задачей, так как может приводить к непредсказуемым результатам. Значение null не эквивалентно нулю или пустой строке. Некоторые свойства класса WMI инициализируются, а другие нет, поэтому поиск значений null может работать не для всех свойств.

Для поиска значений null используйте оператор Is со значением «null».

Например, приведенные ниже команды возвращают процессы, свойство IntallDate которых имеет значение null. Эти команды возвращают много процессов.

PS C:\>$q = "Select * from Win32_Process where InstallDate is null"
        PS C:\>Get-WmiObject -Query $q

В свою очередь, приведенная ниже команда должна возвращать учетные записи пользователей, свойство Description которых имеет значение null. Эта команда не возвращает ни одной учетной записи, хотя у большинства учетных записей свойство Description не имеет значения.

        PS C:\>$q = "Select * from Win32_UserAccount where Description is null"
        PS C:\>Get-WmiObject -Query $q

Чтобы найти учетные записи пользователей, свойство Description которых не имеет значения, используйте оператор равенства для получения пустой строки. Для представления пустой строки используются две идущие подряд одинарные кавычки.

        $q = "Select * from Win32_UserAccount where Description = '' "

ИСПОЛЬЗОВАНИЕ ЗНАЧЕНИЯ TRUE ИЛИ FALSE

Для получения логических значений в свойствах объектов WMI используйте True и False. Регистр в них не учитывается.

Приведенный ниже запрос WQL возвращает только локальные учетные записи пользователей с присоединенных к домену компьютеров.

        PS C:\>$q = "Select * from Win32_UserAccount where LocalAccount = True"
        PS C:\>Get-CimInstance -Query $q

Чтобы найти учетные записи домена, используйте значение False, как показано в примере ниже.

        PS C:\>$q = "Select * from Win32_UserAccount where LocalAccount = False"
        PS C:\>Get-CimInstance -Query $q

ИСПОЛЬЗОВАНИЕ ESCAPE-СИМВОЛА

В языке WQL в качестве escape-символа используется обратная косая черта (\). В Windows PowerShell в этих целях используется обратный апостроф (`).

Кавычки и символы, используемые в их качестве, часто нужно экранировать, чтобы они интерпретировались правильно.

Чтобы найти пользователя, имя которого содержит символ одинарной кавычки, используйте обратную косую черту для экранирования одинарной кавычки, как показано в приведенной ниже команде.

        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

В некоторых случаях обратную косую черту также нужно экранировать. Например, приведенные ниже команды выдают ошибку «Недопустимый запрос» из-за обратной косой черты в значении свойства Caption.

        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

Чтобы экранировать обратную косую черту, используйте еще один символ обратной косой черты, как в приведенной ниже команде.

        PS C:\> $q = "Select * from Win32_UserAccount where Caption = 'Fabrikam\\TimO'"
        PS C:\> Get-CimInstance -Query $q

СМ. ТАКЖЕ

about_Escape_Characters

about_Quoting_Rules

about_WMI

about_WMI_Cmdlets