sergey vasin

The IT blog

Используем PowerShell и скрытые классы WMI для получения информации об устройствах HID – Hey, Scripting Guy! Blog

leave a comment »

Резюме: 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. Часть этого списка приведена на рисунке ниже.

 01

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

 02

В сущности, MSMouse – это абстрактный класс, но он не содержит определителя (qualifier) abstract. Я утвердился в этом, во-первых по тому, что он не обладает экземплярами (кнопка Instances). Затем, я нажал кнопку Drived, и увидел, что два класса происходят от класса MSMouse (то же самое и в случае с MSKeyboard). Эти классы приведены на рисунке.

 03

Теперь, когда я определил нужные мне классы, у меня есть два варианта. Если я воспользуюсь командлетом 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.

 04

В дополнение к двум полученным из него классам существует и третий, как нам показывает утилита WbemTest.

05

Таким образом, когда я запрошу абстрактный класс 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

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2012/12/05/use-hidden-wmi-classes-and-powershell-to-discover-hid-info.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Декабрь 9, 2012 в 15:03

Опубликовано в HeyScriptingGuyBlog, PowerShell

Tagged with , , ,

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s