about_WQL
Краткое описание
Содержит описание языка WQL, используемого для получения объектов WMI в Windows PowerShell.
Подробное описание
WQL — это язык запросов инструментария управления Windows (WMI), который используется для получения сведений из WMI.
Для выполнения запроса WMI в Windows PowerShell не требуется использовать WQL.
Вместо этого можно использовать параметры Get-WmiObject
командлетов или Get-CimInstance
командлетов. Запросы WQL несколько быстрее, чем стандартные Get-WmiObject
команды, и улучшенная производительность очевидна при выполнении команд на сотнях систем. Однако убедитесь, что время, затрачивается на запись успешного запроса WQL, не перевешивает повышение производительности.
Основные инструкции WQL, необходимые для использования WQL, WHERE
— SELECT
и 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]
акселератор типов, выполните следующие действия.
- Приведение строки WQL к объекту ManagementObjectSearcher .
- Вызовите метод 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.exe
czlc.exe
c9lc.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.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
командлет.
$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
См. также
PowerShell