Каков запрос WQL для получения всех устройств, подключенных к конкретному хабу?

Вопрос или проблема

Какова синтаксис запроса WMI / WQL для получения всех устройств, подключенных к конкретному USB-хабу?

Я могу открыть терминал PS и перечислить все устройства USB-хаба, вот так:

 gwmi Win32_UsbHub | fl *

Вывод вернёт список всех устройств USB-хаба в системе. Вот пример одного из таких устройств.

Device ID: USB\VID_0451&PID_DD01\6&16FAF918&1&2, PNP Device ID: USB\VID_0451&PID_DD01\6&16FAF918&1&2, Description: Generic SuperSpeed USB Hub
    Availability
    Caption=Generic SuperSpeed USB Hub
    ClassCode
    ConfigManagerErrorCode=0
    ConfigManagerUserConfig=False
    CreationClassName=Win32_USBHub
    CurrentAlternateSettings
    CurrentConfigValue
    Description=Generic SuperSpeed USB Hub
    DeviceID=USB\VID_0451&PID_DD01\6&16FAF918&1&2
    ErrorCleared
    ErrorDescription
    GangSwitched
    InstallDate
    LastErrorCode
    Name=Generic SuperSpeed USB Hub
    NumberOfConfigs
    NumberOfPorts
    PNPDeviceID=USB\VID_0451&PID_DD01\6&16FAF918&1&2
    PowerManagementCapabilities
    PowerManagementSupported
    ProtocolCode
    Status=OK
    StatusInfo
    SubclassCode
    SystemCreationClassName=Win32_ComputerSystem
    SystemName=JMR-ENG-SARAH
    USBVersion

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

Я совершенно не разбираюсь в PS и WMI, но подумал использовать ASSOCIATES OF следующим образом:

Get-WmiObject Win32_PnPEntity | select "ASSOCIATORS OF {Win32_UsbHub.DeviceID='USB\VID_0451&PID_DD01\6&16FAF918&1&2'}"

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

Вид Диспетчера устройств на <code>Generic USB Hub</code> и <code>Generic SuperSpeed USB Hub</code> с отображением дочерних устройств

Может, просто так, как я сформулировал вопрос. Многие другие варианты вызывали ошибку, поэтому я провёл исследование и увидел этот синтаксис. Изначально я думал использовать команду gwmi. В любом случае, я знаю из Диспетчера устройств, что есть подключенные устройства, но вышеупомянутая команда выдала пустой экран.

WMI Explorer не много помог.

WMI Explorer

Какое было бы утверждение SELECT для использования?

Ух ты!… WMI Explorer, я не видел, чтобы его использовали годами. Но он у меня есть, как и другие подобные. PowerShellScript-o-Matic и подобные 8^}

Есть лучшие инструменты вместо WMI Explorer, все написаны на PS.
Посмотрите:

В любом случае, что касается вашего запроса. Не все возможно сделать только с PS. Есть много случаев, когда вам нужно использовать настоящий код, то есть C#/C/C+/C++, чтобы получить такие вещи.

Большая часть того, что вы видите в таких MMC ОС, это вызовы непосредственно к некоторым DLL/OCX файлам / программным ссылкам, которые не доступны напрямую для PS. Вот почему существует Add-Type, чтобы можно было добавить C#/C/C+/C++, другие языковые конструкции для получения или взаимодействия с необходимым.

С учетом всего вышесказанного… Это ближе к тому, что вы ищете?

Get-WmiObject -Class Win32_USBControllerDevice | 
%{[wmi]($_.Dependent)} |
Sort Manufacturer,Description,DeviceID |
Format-Table -AutoSize -GroupBy Manufacturer Description,Service,DeviceID

   Manufacturer: (Generic USB Audio)

Description      Service  DeviceID                                     
-----------      -------  --------                                     
USB Audio Device usbaudio USB\VID_047F&PID_C009&MI_00\8&461FC04&0&0000 
USB Audio Device usbaudio USB\VID_17A0&PID_0305&MI_00\9&109E1BB1&0&0000

   Manufacturer: (Standard keyboards)

Description         Service DeviceID                                     
-----------         ------- --------                                     
HID Keyboard Device kbdhid  HID\VID_045E&PID_00DB&MI_00\A&163A9F80&0&0000

   Manufacturer: (Standard monitor types)

Description         Service DeviceID                          
-----------         ------- --------                          
Generic PnP Monitor monitor DISPLAY\ACI2183\C&8538F4&0&UID256 
Generic PnP Monitor monitor DISPLAY\ACI27F6\8&5458763&0&UID256
Generic PnP Monitor monitor DISPLAY\ACI27F6\8&5458763&0&UID257

Или это…

Get-WmiObject Win32_PNPEntity | 
Select Manufacturer,Description,Name,Service,DeviceID

Или посмотрите это…

Команды PowerShell для управления устройствами

Этот модуль предоставляет команды, которые вызывают функции SetupAPI и
обеспечивают функции перечисления и управления устройствами.

https://gallery.technet.microsoft.com/Device-Management-7fad2388


Обновление по комментарию OP:

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

UsbTreeView: Просмотр USB-устройств и хабов, в которых они находятся, в удобной
форме

http://flow-morewithless.blogspot.com/2014/05/usbtreeview-view-usb-devices-and-hubs.html

Вы не можете получить информацию о соединениях, потому что Microsoft
хочет, чтобы эта информация оставалась скрытой. Единственный способ получить
информацию о связи родитель-дочерний – обратиться на уровень драйвера.

Проект Visual C, скомпилированный в EXE.

https://github.com/mkielar/get-parent-device

Создание списка удобных имен (массив хэш-таблиц PowerShell) находится в файле
UsbDeviceNames.ps1

$OwnUsbDeviceNames = @{
"USB\VID_04E5&PID_0605\6&13F4C3E&0&6"    = "Hama 4port passive USB hub (серый)";
"USB\VID_1A40&PID_0101\6&DF2EE03&0&5"    = "Deltaco Active Usb 2.0 cable";
"USB\VID_1A40&PID_0101\7&19BC4090&0&1"    = "Delock USB2.0 4port active mini hub (черный круглый)";
"USB\VID_0403&PID_6001\FTFSDFHD"        = "FTDI Serial (COM5) к проектору";
"USB\VID_0403&PID_6001\FTFXXLHS"        = "FTDI Serial (COM8) к телевизору";
"Something" = "ничто"
}

Инструмент PS

https://github.com/MarkoMarjamaa/UsbTreeView

Ответ или решение

Чтобы получить список всех устройств, подключённых к конкретному USB-хабу, вам необходимо использовать запросы WMI (Windows Management Instrumentation) и WQL (WMI Query Language). Это может быть немного запутанно, особенно если вы только начинаете работать с PowerShell и WMI. В этом ответе я постараюсь объяснить, как составить необходимые запросы, чтобы добиться нужного результата.

Что такое WMI и WQL?

WMI — это компонент Windows, который предоставляет информацию о системах, сетях и устройствах. WQL — это язык запросов, который используется для извлечения данных из WMI. Вы можете использовать WQL для получения информации об устройствах, таких как USB-хабы и подключенные к ним устройства.

Шаги для получения всех подключённых устройств

  1. Идентификация USB-хаба: Сначала вам нужно идентифицировать USB-хаб, к которому вы хотите получить доступ. В вашем случае у вас уже есть PNPDeviceID хаба, например, USB\VID_0451&PID_DD01\6&16FAF918&1&2.

  2. Запрос WQL для получения подключённых устройств: Используйте следующий запрос, чтобы получить все устройства, подключённые к конкретному USB-хабу. Мы воспользуемся классом Win32_USBControllerDevice, который связывает USB-устройки и любое другое устройство.

Get-WmiObject -Query "SELECT * FROM Win32_USBControllerDevice WHERE DeviceID LIKE '%USB\VID_0451&PID_DD01%'"

Более подробный запрос

Если вам нужно вывести дополнительные данные о подключённых устройствах, такие как производитель, описание и DeviceID, вы можете использовать следующий подход:

Get-WmiObject -Query "SELECT * FROM Win32_USBControllerDevice" | ForEach-Object {
    $device = [WMI]($_.Dependent)
    if ($device.DeviceID -like 'USB\VID_0451&PID_DD01*') {
        [PSCustomObject]@{
            Manufacturer = $device.Manufacturer
            Description  = $device.Description
            DeviceID     = $device.DeviceID
        }
    }
} | Format-Table -AutoSize

Возможные проблемы

  • Отсутствие данных: Иногда при выполнении WMI-запросов вы можете не получить ожидаемых результатов. Это может быть связано с тем, что Microsoft не предоставляет все скрытые свойства для общего доступа через WMI. В таких случаях можно рассмотреть использование низкоуровневых инструментов или библиотек.

  • Код на C# или другой язык: Для получения более детальной иерархической информации о подключённых устройствах вы можете использовать другие языки программирования, такие как C#. Это позволит вам обращаться к более низкоуровневым API для USB.

Ресурсы и альтернативные инструменты

  • UsbTreeView: Этот инструмент позволяет визуально исследовать устройства USB и хабы в удобном интерфейсе. Вам может быть полезно протестировать его, чтобы получить более четкое представление о текущих подключениях.

  • Дополнительные ссылки:

Заключение

С помощью вышеуказанных запросов WMI и WQL вы сможете получить список всех устройств, подключенных к конкретному USB-хабу. Если вам нужно более глубокое взаимодействие, возможно, потребуется перейти на использование языков программирования, таких как C#, или использовать специализированные утилиты.

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

Капча загружается...