You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于PyUSB在Windows下获取USB大容量存储设备指定信息

解决方法

要筛选出USB大容量存储设备并获取设备级信息,核心是先遍历所有USB设备,再检查设备是否包含bInterfaceClass为0x8的接口,一旦确认是目标设备,直接从设备对象中提取idVendor、idProduct,再通过描述符获取iSerialNumber。

修正后的代码

import usb.core
import libusb_package

def get_usb_msd_devices():
    # 获取所有USB设备
    all_devices = libusb_package.find(find_all=True)
    
    for dev in all_devices:
        is_msd = False
        # 遍历设备的所有配置
        for cfg in dev:
            # 遍历配置下的所有接口
            for interface in cfg:
                # 检查接口类是否为大容量存储(0x8)
                if interface.bInterfaceClass == 8:
                    is_msd = True
                    break
            if is_msd:
                break
        
        if is_msd:
            # 获取设备级的idVendor和idProduct
            vendor_id = dev.idVendor
            product_id = dev.idProduct
            
            # 获取iSerialNumber字符串(部分设备可能无序列号,需处理异常)
            try:
                serial_number = usb.util.get_string(dev, dev.iSerialNumber)
            except:
                serial_number = "无序列号"
            
            print(f"供应商ID: 0x{vendor_id:04X}, 产品ID: 0x{product_id:04X}, 序列号: {serial_number}")

if __name__ == "__main__":
    get_usb_msd_devices()

关键说明

  1. 层级关系纠正:libusb_package.find(find_all=True)返回的是usb.core.Device对象列表,每个设备包含多个配置,每个配置包含多个接口。你之前的代码错误地将设备列表当成配置列表遍历,导致无法访问设备级属性。
  2. 序列号处理:dev.iSerialNumber是描述符索引,需要通过usb.util.get_string转换为实际字符串,部分设备未提供序列号,因此要添加异常捕获。
  3. 效率优化:一旦发现设备包含目标接口,立即跳出内层循环,避免无意义的遍历。

内容的提问来源于stack exchange,提问作者dlystyr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:01:26