Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Назначение: 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