about_WQL

Краткое описание

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

Подробное описание

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

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

Основные инструкции WQL, необходимые для использования WQL, WHERESELECTи FROM.

Когда следует использовать WQL

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

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

Использование инструкции SELECT

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

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

SELECT <property> FROM <WMI-class>

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

SELECT * FROM Win32_Bios

Примечание.

PowerShell отображает только свойства объектов по умолчанию. Эти свойства определены в Types.ps1xml файле. Select-Object Используйте командлет или Format-* командлет для отображения дополнительных свойств.

Чтобы выбрать определенное свойство класса 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-запрос заключается в том, чтобы заключить его в кавычки (в виде строки), а затем использовать строку запроса в качестве значения параметра Get-WmiObject запроса командлета, как показано в следующем примере.

Get-WmiObject -Query "SELECT * FROM Win32_Bios"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R9FPY3P
Version           : LENOVO - 1360

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

$query = "SELECT * FROM Win32_Bios"
Get-WmiObject -Query $query

Вы можете использовать любой формат с любой инструкцией WQL. Следующая команда использует запрос в переменной $queryName , чтобы получить только свойства Name и Version системы BIOS.

$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   :

Помните, что для получения того же результата можно использовать параметры командлета Get-WmiObject . Например, следующая команда также получает значения свойств Name и Version экземпляров класса 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   :

Использование командлета Get-CimInstance

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

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

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

Любой запрос WQL, с которым можно использовать Get-WmiObject , также можно использовать с Get-CimInstance.

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

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

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

Использование акселератора типов wmisearcher

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

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

Чтобы использовать [wmisearcher] акселератор типов, выполните следующие действия.

  1. Приведение строки WQL к объекту ManagementObjectSearcher .
  2. Вызовите метод Get объекта ManagementObjectSearcher .

Например, следующая команда приводит запрос "выбрать все", сохраняет результат в $bios переменной, а затем вызывает Get() метод объекта ManagementObjectSearcher в переменной $bios .

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

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

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

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

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

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

Этот формат команды работает в любом запросе. Следующая команда получает значение свойства Name класса 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   :

Использование базовой инструкции WQL WHERE

Инструкция WHERE устанавливает условия для данных, возвращаемых оператором SELECT .

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

WHERE <property> <operator> <value>

Например:

WHERE Name = 'Notepad.exe'

Инструкция WHERE используется с оператором SELECT , как показано в следующем примере.

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

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

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

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

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

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

Операторы сравнения инструкций WHERE

Следующие операторы допустимы в инструкции 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

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

Например, следующий запрос выбирает свойства 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 командлетов, а также в значении параметров запроса этих командлетов.

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

использование оператора LIKE

Оператор LIKE позволяет использовать дикие символы карта для фильтрации результатов запроса 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 [_].

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

Можно объединить операцию диапазона с символом "процент"%карта для создания простых, но мощных фильтров.

Примеры операторов LIKE

Пример 1. [<диапазон>]

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

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

Пример 2: [<диапазон>] и %

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

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

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

Пример 3. Не в диапазоне (^)

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

и следовало за нулевыми или более буквами.

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

Пример 4. Любые символы - или нет (%)

Следующие команды получают процессы с именами, начинающимися с calc. Символ процента (%) — это дикий символ WQL карта. Это эквивалентно звездочку (*) дикую карта в PowerShell.

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

Пример 5. Один символ (_)

Следующие команды получают процессы с именами, имеющими следующий шаблон, c_lc.exe где символ подчеркивания представляет любой символ. Этот шаблон соответствует любому имени от имени или calc.execzlc.exec9lc.exe, но не соответствует именам, в которых "c" и "l" разделены несколькими символами.

$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

Пример 6. Точное соответствие

Следующие команды получают процессы с именем WLIDSVC.exe. Несмотря на то что запрос использует LIKE ключевое слово, требуется точное совпадение, так как значение не включает в себя какие-либо дикие карта символы.

$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

Использование оператора OR

Чтобы указать несколько независимых условий OR , используйте ключевое слово. В OR предложении WHERE отображается ключевое слово. Она выполняет инклюзивную OR операцию по двум (или более) условиям и возвращает элементы, удовлетворяющие любому из условий.

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

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

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

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

Инструкцию OR можно использовать с более чем двумя условиями. В следующем запросе OR оператор получает Winword.exeилиExcel.exePowershell.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 командлет.

$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

Все операторы, включая LIKE операторы, допустимы с OR операторами и AND операторами. Кроме того, можно объединить OR операторы и AND операторы в одном запросе с скобками, которые сообщают WMI, какие предложения следует сначала обрабатывать.

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

Поиск значений NULL

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

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

Например, следующие команды получают процессы, имеющие значение NULL для свойства IntallDate . Команды возвращают множество процессов.

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

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

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

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

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

Использование true или false

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

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

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

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

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

Использование escape-символов

WQL использует обратную косую черту (\) в качестве escape-символа. Это отличается от Windows PowerShell, в котором используется символ backtick (`).

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

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

$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

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

$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

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

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

См. также