我将USBhub(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)


运行此命令仅给我两个新的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或Python调用的powershell / cmd检索连接到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?中的最高答案来授予我的程序管理员权限。

关于windows-10 - 如何识别同时连接到USBhub的相同USB加密狗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58873893/

10-12 17:04