Резюме: Microsoft Scripting Guy, Ed Wilson рассказывает об использовании двух классов WMI из пространства имен Root\WMI для получения дополнительной информации об устройствах HID.
И еще раз определяем мышь и клавиатуру через WMI
Во время полета из Франкфурта в Шарлотту, у меня было время (на самом деле уйма времени) чтобы поиграться с Windows PowerShell. (Я знаю, что можно было смотреть скучные фильмы на 5-дюймовом экране, который трясется каждый раз, как двигается человек в кресле cпереди. В моем случае, количество просмотренных фильмов равнялось 0). Однако у них неплохая подборка джазовой музыки, так что я надел наушники, запустил Windows PowerShell ISEи приступил к процессу.
На прошлой неделе, я написал пост «Используем PowerShell и WMI для нахождения беспроводных клавиатуры и мыши».
Итак, я игрался с функцией Get-NameSpace, которую я написал для моей новой книги «Windows PowerShell 3.0 Step by Step» и решил исследовать другие пространства имен для нахождения информации о клавиатуре и мыши.
Заметка: Пространство имен Root\Cimv2 хорошо документировано на MSDN, и входящие в него классы поддерживаются для использования. Классы из других пространств имен не документированы на MSDNи не поддерживаются.
То, что класс WMI не поддерживается – это не означает, что он не будет работать. Это означает только то, что я не смогу позвонить в службу поддержки Microsoft, в случае, если что то перестанет работать, или будет работать с ошибками. Осознавая все это, я начал свое расследование.
Заметка: После всего, я решил включить функцию Get-NameSpace в мой модуль HSG*WMI*.
Get-WMINameSpace Function
Function Get-WmiNameSpace
{
Param(
$nameSpace = «root»,
$computer = «localhost»
)
Get-WmiObject -class __NameSpace -computer $computer `
-namespace $namespace -ErrorAction «SilentlyContinue» |
Foreach-Object `
-Process `
{
$subns = Join-Path -Path $_.__namespace -ChildPath $_.name
if($subns -notmatch ‘directory’) {$subns}
$namespaces += $subns + «`r`n»
Get-WmiNameSpace -namespace $subNS -computer $computer
}
} #end Get-WmiNameSpace
Запустив функцию Get-WmiNameSpace, я получил обширный список новых пространств имен WMI на моем компьютере с Windows 8. Часть этого списка приведена на рисунке ниже.
По мере просмотра списка, я заметил несколько пространств имен, которые показались мне достаточно интересными. Одно из них – это Root\Hardware. Я запустил следующие команды, чтобы определить, есть ли в нем что-нибудь, относящееся к клавиатуре и мыши. Как вы можете видеть, ничего не нашлось.
PS C:\> Get-CimClass *mouse* -Namespace root\hardware
PS C:\> Get-CimClass *keyboard* -Namespace root\hardware
PS C:\>
Я попробовал использовать синтаксис Windows PowerShell 2.0, но результаты оказались такими же.
PS C:\> Get-WmiObject -List *mouse* -Namespace root\hardware
PS C:\> Get-WmiObject -List *keyboard* -Namespace root\hardware
PS C:\>
После исследования нескольких других пространств имен, я направился туда, где, как мне казалось, меня ждал успех – пространство имен Root\WMI. Выполнив запрос, я обнаружил несколько классов, которые я мог использовать.
PS C:\> «*mouse*»,»*keyboard*» | % {Get-CimClass $_ -Namespace root\WMI}
NameSpace: ROOT/wmi
CimClassName CimClassMethods CimClassProperties
———— ————— ——————
MSMouse {} {}
MSMouse_ClassInformation {} {Active, DeviceId, …
MSMouse_PortInformation {} {Active, Buttons, C…
MSKeyboard {} {}
MSKeyboard_ExtendedID {} {Active, InstanceNa…
MSKeyboard_PortInformation {} {Active, ConnectorT…
MSKeyboard_ClassInformation {} {Active, DeviceId, …
Заметьте, что классы MSMouse и MSKeyboard не содержат каких либо свойств (колонка CimClassProperties). Я перепроверил это с помощью утилиты WbemTest.
В сущности, MSMouse – это абстрактный класс, но он не содержит определителя (qualifier) abstract. Я утвердился в этом, во-первых по тому, что он не обладает экземплярами (кнопка Instances). Затем, я нажал кнопку Drived, и увидел, что два класса происходят от класса MSMouse (то же самое и в случае с MSKeyboard). Эти классы приведены на рисунке.
Теперь, когда я определил нужные мне классы, у меня есть два варианта. Если я воспользуюсь командлетом Get-CimInstance, мне нужно будет указать оба класса: MSMouse_ClassInformation и MSMouse_PortInformation. Но если я использую командлет Get-WmiObject, то я могу воспользоваться еще одним неподдерживаемым трюком. Помните, я говорил, что классы MSMouce и MSKeyboard– абстрактные? Запрос абстрактных классов не поддерживается, и Get-CimInstance действует в соответствии с этим запретом. Однако Get-WmiObject этого не запрещает. Таким образом, когда я запрашиваю абстрактный класс, команда автоматически запрашивает два происходящих от него класса и возвращает ответ.
Запрос приведен ниже – я передал результаты функции HasWmiValue из моего модуля HSG*WMI*, чтобы отфильтровать пустые и системные свойства.
PS C:\> gwmi msmouse -Namespace root\wmi | ? instancename -match ‘hid’ | haswmivalue
\\EDLT\root\wmi:MSMouse_PortInformation.InstanceName=»HID\\{00001124-0000-1000-8000-00805f9b34fb}_VID&0002045e_PID&0702&Col02\\9&da0cc6e&0&0001_0″
============================================================================================
Name Value
—- ——
Active True
Buttons 5
ConnectorType 2
DataQueueSize 2
InstanceName HID\{00001124-0000-1000-8000-00805f9b34fb}_VID&0002045e_PID&0702&Col02\9…
\\EDLT\root\wmi:MSMouse_ClassInformation.InstanceName=»HID\\{00001124-0000-1000-8000-00805f9b34fb}_VID&0002045e_PID&0702&Col02\\9&da0cc6e&0&0001_0″
============================================================================================
Active True
DeviceId 18446738026718451632
InstanceName HID\{00001124-0000-1000-8000-00805f9b34fb}_VID&0002045e_PID&0702&Col02\9…
То же самое я сделал и для класса MSKeyboard. Класс WMI MSKeyboard содержит определитель abstract.
В дополнение к двум полученным из него классам существует и третий, как нам показывает утилита WbemTest.
Таким образом, когда я запрошу абстрактный класс WMI MSKeyboard, результаты запроса будут включать информацию от трех классов вместо двух, как было в случае с MSMouse. Вывод команды приведен ниже.
PS C:\> gwmi mskeyboard -Namespace root\wmi | ? instancename -match ‘hid’ | haswmivalue
\\EDLT\root\wmi:MSKeyboard_ClassInformation.InstanceName=»HID\\{00001124-0000-1000-8000-00805f9b34fb}_VID&0002045e_PID&0762&Col01\\9&5c4d6fc&0&0000_0″
============================================================================================
Name Value
—- ——
Active True
DeviceId 18446738026714008784
InstanceName HID\{00001124-0000-1000-8000-00805f9b34fb}_VID&0002045e_PID&0762&Col01\9&5c4d…
\\EDLT\root\wmi:MSKeyboard_ExtendedID.InstanceName=»HID\\{00001124-0000-1000-8000-00805f9b34fb}_VID&0002045e_PID&0762&Col01\\9&5c4d6fc&0&0000_0″
============================================================================================
Active True
InstanceName HID\{00001124-0000-1000-8000-00805f9b34fb}_VID&0002045e_PID&0762&Col01\9&5c4d…
Type 81
\\EDLT\root\wmi:MSKeyboard_PortInformation.InstanceName=»HID\\{00001124-0000-1000-8000-00805f9b34fb}_VID&0002045e_PID&0762&Col01\\9&5c4d6fc&0&0000_0″
============================================================================================
Active True
ConnectorType 2
DataQueueSize 1
FunctionKeys 12
Indicators 3
InstanceName HID\{00001124-0000-1000-8000-00805f9b34fb}_VID&0002045e_PID&0762&Col01\9&5c4d…
На этом все.
Автор:
Ed Wilson, Microsoft Scripting Guy
Оригинал:
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell