如何识别同时连接到 USB 集线器的相同 USB 加密狗

How to identify identical USB dongles connected at the same time to an USBhub

我有一个 USB 集线器 (D-Link DUB-H7) 通过 Windows 10 连接到我的笔记本电脑。连接到集线器的是 4 个相同的 PEAK 加密狗,用于与 CANbus 通信。现在,我的问题是以编程方式识别这 4 个独立的加密狗并知道哪个是哪个。加密狗固定在集线器中。

首先,我下载并安装了 USBDeview 以查看我的设备。在程序中,我可以看到我的 4 个 PCAN-USB 加密狗,我可以看到它们的 Instance ID 是不同的。很好,现在我有了我的标识符。但是,一旦我尝试使用 Python 获取 ID,情况就不妙了。这是我的以下测试程序:

import win32com.client


wmi = win32com.client.GetObject("winmgmts:")

input("Connect the hub")

dongle_list = [(usb.name, usb.DeviceID) for usb in wmi.InstancesOf("Win32_USBHub")]

input("Disconnect the hub")

nod_list = [(usb.name, usb.DeviceID) for usb in wmi.InstancesOf("Win32_USBHub")]

diff = list(set(dongle_list) - set(nod_list))
for d in diff:
    print(d)

运行 这只给我 2 个新的 USB 设备和 ID 指向 USBhub 而不是连接到集线器的加密狗。我也尝试过 wmi.InstancesOf("CIM_USBDevice") 但结果保持不变。

('Generic USB Hub', 'USB\VID_05E3&PID_0608\5&4A43CD6&0&4') 
('Generic USB Hub', 'USB\VID_05E3&PID_0608\6&9EBFB9C&0&4')

那么如何使用 Python 或 powershell/cmd 调用的 Python 检索连接到 USBhub 的设备的 USB 信息?

我认为我可以采取的另一条路线是使用端口标识符。如果我断开加密狗,我可以看到它连接到 Port_#0001.Hub_#000x,其中 x 是一个正整数。所以也许我可以轮询端口以查看加密狗是否已连接,然后我也知道哪个是哪个(加密狗固定在集线器中)。虽然我认为使用 Instance ID 更简单。

我最终创建了一个 powershell 命令并使用 Python 调用它。但是我注意到 InstanceID 是 USBhub 的硬件地址,而不是加密狗。 我还注意到加密狗有时会根据它们的连接方式切换地址。所以我还需要禁用它们并按照我想要的顺序再次启用它们。

这是我现在拥有的:

poll_cmd = """
$ret = (Get-PnpDevice | ? {($_.description -like "*pcan*") -and ($_.status -eq "ok")} | sort instanceid).instanceid;
$ret | % {Disable-PnpDevice $_ -Confirm:$False};
$ret | % {Start-Sleep -Seconds 1; Enable-PnpDevice $_ -Confirm:$False};
$ret
"""

usbs = (
    subprocess.check_output(["powershell.exe", poll_cmd])
    .decode()
    .strip()
    .split("\r\n")
)

usbs 包含我感兴趣的 USB 加密狗列表。

然而,这又给我带来了一个问题:UAC。我需要管理员权限才能启用 USB。并使用 Request UAC elevation from within a Python script? 的最佳答案授予我的程序管理员权限。