如何识别同时连接到 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? 的最佳答案授予我的程序管理员权限。
我有一个 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? 的最佳答案授予我的程序管理员权限。