Вопрос или проблема
Какова синтаксис запроса 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'}"
Досадно, но перечисления не показывают родительские и дочерние устройства, хотя Диспетчер устройств отображает все красиво и имеет родителя.
Может, просто так, как я сформулировал вопрос. Многие другие варианты вызывали ошибку, поэтому я провёл исследование и увидел этот синтаксис. Изначально я думал использовать команду gwmi
. В любом случае, я знаю из Диспетчера устройств
, что есть подключенные устройства, но вышеупомянутая команда выдала пустой экран.
WMI Explorer
не много помог.
Какое было бы утверждение SELECT
для использования?
Ух ты!… WMI Explorer, я не видел, чтобы его использовали годами. Но он у меня есть, как и другие подобные. PowerShellScript-o-Matic и подобные 8^}
Есть лучшие инструменты вместо WMI Explorer, все написаны на PS.
Посмотрите:
-
http://blog.ctglobalservices.com/powershell/kaj/coretech-wmi-and-powershell-browser
-
https://gallery.technet.microsoft.com/PoweShell-ISE-Addon-CIM-5c9af37a
В любом случае, что касается вашего запроса. Не все возможно сделать только с 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
Ответ или решение
Чтобы получить список всех устройств, подключённых к конкретному USB-хабу, вам необходимо использовать запросы WMI (Windows Management Instrumentation) и WQL (WMI Query Language). Это может быть немного запутанно, особенно если вы только начинаете работать с PowerShell и WMI. В этом ответе я постараюсь объяснить, как составить необходимые запросы, чтобы добиться нужного результата.
Что такое WMI и WQL?
WMI — это компонент Windows, который предоставляет информацию о системах, сетях и устройствах. WQL — это язык запросов, который используется для извлечения данных из WMI. Вы можете использовать WQL для получения информации об устройствах, таких как USB-хабы и подключенные к ним устройства.
Шаги для получения всех подключённых устройств
-
Идентификация USB-хаба: Сначала вам нужно идентифицировать USB-хаб, к которому вы хотите получить доступ. В вашем случае у вас уже есть
PNPDeviceID
хаба, например,USB\VID_0451&PID_DD01\6&16FAF918&1&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#, или использовать специализированные утилиты.