如何使用Python或CMD从Windows获取连接的USB设备列表

6
我需要使用Python或cmd从Windows获取已连接的USB设备列表。
对于Python,我正在尝试以下方法。
import win32com.client
def get_usb_device():
    try:
        usb_list = []
        wmi = win32com.client.GetObject("winmgmts:")
        for usb in wmi.InstancesOf("Win32_USBHub"):
            print(usb.DeviceID)
            print(usb.description)
            usb_list.append(usb.description)

        print(usb_list)
        return usb_list
    except Exception as error:
        print('error', error)


get_usb_device()

因此,我得到了这个结果:
['USB Root Hub (USB 3.0)', 'USB Composite Device', 'USB Composite Device']

但我没有得到一个有意义的名字。

至于cmd,我也在尝试这个:

wmic path CIM_LogicalDevice where "Description like 'USB%'" get /value

我连接USB设备时,它们的名称都很晦涩难懂。例如,鼠标、键盘、U盘或打印机,我希望得到像“a4tech鼠标”这样的名称,即使只有“鼠标”也可以接受。这种名称会在Windows 10设置的设备部分中显示。但实际上我得到的是“USB Root Hub(USB 3.0)”、“USB Composite Device”,这些名称并没有任何意义。

请问是否可能使用Python解决这个问题?如果有人知道答案,请帮忙解决一下,对我非常重要。


但我没有得到一个有意义的名字。- 你期望得到什么? - Pedro Lobito
这个回答解决了你的问题吗?Python:获取USB闪存驱动器设备名称[Windows] - Prudhvi
2个回答

6

不确定这是否符合您的要求,但在Windows 10上使用Python 3和pywin32,您可以使用以下代码获取所有驱动器的字母和类型:

import os
import win32api
import win32file
os.system("cls")
drive_types = {
                win32file.DRIVE_UNKNOWN : "Unknown\nDrive type can't be determined.",
                win32file.DRIVE_REMOVABLE : "Removable\nDrive has removable media. This includes all floppy drives and many other varieties of storage devices.",
                win32file.DRIVE_FIXED : "Fixed\nDrive has fixed (nonremovable) media. This includes all hard drives, including hard drives that are removable.",
                win32file.DRIVE_REMOTE : "Remote\nNetwork drives. This includes drives shared anywhere on a network.",
                win32file.DRIVE_CDROM : "CDROM\nDrive is a CD-ROM. No distinction is made between read-only and read/write CD-ROM drives.",
                win32file.DRIVE_RAMDISK : "RAMDisk\nDrive is a block of random access memory (RAM) on the local computer that behaves like a disk drive.",
                win32file.DRIVE_NO_ROOT_DIR : "The root directory does not exist."
              }

drives = win32api.GetLogicalDriveStrings().split('\x00')[:-1]

for device in drives:
    type = win32file.GetDriveType(device)
    
    print("Drive: %s" % device)
    print(drive_types[type])
    print("-"*72)

os.system('pause')

你的USB设备类型为win32file.DRIVE_REMOVABLE,这就是你要找的。你可以插入一个if条件语句来只处理可移动设备,而不是打印所有驱动器和类型。
请注意:SD卡和其他可移动存储介质具有相同的驱动器类型。
希望对你有所帮助!

更新,2020年7月13日:

要获取有关连接设备的更多信息,请查看Python的WMI模块

请查看这些示例输出,它们列出了有关设备的不同信息,包括制造商描述、序列号等等:

import wmi
c = wmi.WMI()

for item in c.Win32_PhysicalMedia():
    print(item)

for drive in c.Win32_DiskDrive():
    print(drive)

for disk in c.Win32_LogicalDisk():
    print(disk)

os.system('pause')

要访问此输出中列出的特定信息,请使用显示的术语进行直接访问。例如:
for disk in c.Win32_LogicalDisk():
    print(disk.Name)

您能否展示一下如何获取可移动设备的设备ID和产品信息? - S.I.J
@S.I.J:我已经更新了答案,有一个模块可能会帮助您获取所需的信息。 - xph

1
当我通过USB连接鼠标、键盘、U盘或打印机时,我希望它们能拥有这种类型的名称...

它被称为“友好名称”,您可以使用:

import subprocess, json

out = subprocess.getoutput("PowerShell -Command \"& {Get-PnpDevice | Select-Object Status,Class,FriendlyName,InstanceId | ConvertTo-Json}\"")
j = json.loads(out)
for dev in j:
    print(dev['Status'], dev['Class'], dev['FriendlyName'], dev['InstanceId'] )

Unknown HIDClass HID-compliant system controller HID\VID_046D&PID_C52B&MI_01&COL03\9&232FD3F1&0&0002
OK DiskDrive WD My Passport 0827 USB Device USBSTOR\DISK&VEN_WD&PROD_MY_PASSPORT_0827&REV_1012\575836314142354559545058&0
...

当我通过USB连接鼠标、键盘、U盘或打印机时,我想要这种类型的名称。例如,“a4tech鼠标”,即使只有“鼠标”也可以。这种类型的名称出现在Windows 10设置的设备部分中。但是我得到的是“USB Root Hub(USB 3.0)”、“USB Composite Device”,实际上什么也不表示。也许你知道我真正想要什么。 并且还在主问题部分添加了这个。对于我第一次解释不清楚,我很抱歉。 - SNA Nilim
在这个页面上不需要重复4次相同的文本,这是浪费时间和资源。你需要USB的“友好名称”,你可以在我的答案中找到它。 - Pedro Lobito
我使用以下代码和FriendlyName获取到了以下内容:'USB':[ 'USB Root Hub (USB 3.0)', 'Intel(R) USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)', 'USB Composite Device', 'USB Composite Device' ], 'Mouse': [ 'HID-compliant mouse', 'HID-compliant mouse', 'HID-compliant mouse' ],但是在Windows(设置->蓝牙和其他设备->鼠标、键盘和笔)部分,我看到了以下内容:2.4G无线鼠标 USB光学鼠标是否有可能通过此代码或其他代码获取这些名称? - SNA Nilim
把这行代码 dev['Status'], dev['Class'], dev['FriendlyName'], dev['InstanceId'] 改成 dev['FriendlyName'] - Pedro Lobito
如果我的回答对您有帮助,请考虑接受它作为正确答案。谢谢! - Pedro Lobito
是的,我使用这个dev['FriendlyName']并获得以下内容'USB':[ 'USB Root Hub (USB 3.0)', 'Intel(R) USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)', 'USB Composite Device', 'USB Composite Device' ], 'Mouse': [ 'HID-compliant mouse', 'HID-compliant mouse', 'HID-compliant mouse' ],这是我之前评论中提到的。 但是我确切地想要这个。 [2.4G无线鼠标,USB光学鼠标]我在这里看到 (设置->蓝牙和其他设备->鼠标、键盘和笔) 区域。 - SNA Nilim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接