Я знаю, что прошло какое-то время с момента какого-либо действия над этим ответом, но я работаю над проектом, который также требует функциональности, аналогичной этой, и я могу сказать вам, что это действительно возможно. Насколько я могу судить, для этого требуются DDK и PInvoke, для этой информации нет интерфейса C # или WMI. Это требует открытия низкоуровневых устройств корневого концентратора USB и прямой отправки им команд IOCTL драйвера.
Хорошей новостью является то, что Microsoft предоставляет пример приложения C ++, которое полностью перечисляет все USB-устройства и показывает, к каким именно портам они подключены. Это приложение является примером приложения USBView .
Я думаю, вы найдете, если вы скомпилируете и запустите это приложение, вы увидите, что оно точно показывает, где подключено ваше устройство, и если вы подключите какое-либо устройство к этому порту, оно появится там же. Возможно, будет проще, если вы создадите неуправляемую C ++ DLL, которая предоставляет несколько вызовов, которые ваше приложение C # может использовать для получения необходимой информации.
Он имеет это сказать о функции "EnumerateHubPorts ()" в своем коде:
С учетом дескриптора открытого концентратора и количества нисходящих портов на
отправьте концентратору IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX
запрос для каждого нижестоящего порта концентратора, чтобы получить информацию о
устройство (если есть), подключенное к каждому порту.
Чтобы дать представление обо всем, что для этого требуется (все должно быть перечислено, начиная сверху, даже если вас интересует только один порт), вот комментарии, перечисленные в верхней части файла enum.c в коде. :
/*
This source file contains the routines which enumerate the USB bus
and populate the TreeView control.
The enumeration process goes like this:
(1) Enumerate Host Controllers and Root Hubs
EnumerateHostControllers()
EnumerateHostController()
Host controllers currently have symbolic link names of the form HCDx,
where x starts at 0. Use CreateFile() to open each host controller
symbolic link. Create a node in the TreeView to represent each host
controller.
GetRootHubName()
After a host controller has been opened, send the host controller an
IOCTL_USB_GET_ROOT_HUB_NAME request to get the symbolic link name of
the root hub that is part of the host controller.
(2) Enumerate Hubs (Root Hubs and External Hubs)
EnumerateHub()
Given the name of a hub, use CreateFile() to map the hub. Send the
hub an IOCTL_USB_GET_NODE_INFORMATION request to get info about the
hub, such as the number of downstream ports. Create a node in the
TreeView to represent each hub.
(3) Enumerate Downstream Ports
EnumerateHubPorts()
Given an handle to an open hub and the number of downstream ports on
the hub, send the hub an IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX
request for each downstream port of the hub to get info about the
device (if any) attached to each port. If there is a device attached
to a port, send the hub an IOCTL_USB_GET_NODE_CONNECTION_NAME request
to get the symbolic link name of the hub attached to the downstream
port. If there is a hub attached to the downstream port, recurse to
step (2).
GetAllStringDescriptors()
GetConfigDescriptor()
Create a node in the TreeView to represent each hub port
and attached device.
*/