【问题标题】:Python - getting SerialNumber of usb-devices with pyUsb in windowsPython - 在 Windows 中使用 pyUsb 获取 USB 设备的序列号
【发布时间】:2022-09-30 19:30:56
【问题描述】:

我正在尝试创建所有 USB 大容量存储设备及其供应商、ProductId 和序列号的列表。

因此我使用 pyUsb 模块并运行以下程序。

import sys
import usb
import usb.core
import usb.util

devs = usb.core.find(find_all=True)

nCount=0

for dev in devs:
    try:
        for cfg in dev:
            intf = usb.util.find_descriptor(cfg,bInterfaceClass=0x8)
            if intf is not None:
                nCount += 1
                try:
                    sys.stdout.write(\"USB device \" + usb.util.get_string(dev,dev.iProduct,None) + \'\\n\')    
                except:
                    sys.stdout.write(\"USB device \" + str(nCount) + \'\\n\')      
                sys.stdout.write(\"------\" + \'\\n\')       
                sys.stdout.write(\"VendorId = \" + hex(dev.idVendor) + \'\\n\')
                sys.stdout.write(\"ProductId = \" + hex(dev.idProduct) + \'\\n\')
                if not dev.iSerialNumber == 0:
                    sys.stdout.write(\"SerialNbr = \" + usb.util.get_string(dev,dev.iSerialNumber,None) + \'\\n\')
                else:
                     sys.stdout.write(\"SerialNbr = none\" + \'\\n\')                   
                sys.stdout.write(\'\\n\')       
    except usb.core.USBError:
        pass

通常脚本有效。根据设备,我得到如下输出:

USB device USB DISK
-------
VendorId = 0x90c  
ProductId = 0x2000  
SerialNbr = none 

但是对于各种设备,我收到以下错误:

文件 \"C:\\Users\\UerXy\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\usb\\backend\\libusb1.py\", 第 600 行,在 _check raise NotImplementedError(_strerror(ret)) NotImplementedError:此平台上不支持或未实现的操作

调试代码时,尝试使用函数 usbutil.get_string() 读取字符串描述符时发生错误

我在某处读到,该功能取决于驱动程序。 这是真的?是否可以在不关心使用过的 USB 驱动程序的情况下读取任何给定 USB 设备的序列号?

如何解决此错误并从每个设备读取描述符?

  • 该问题仅出现在 Windows 平台上。 ubuntu 系统中的相同代码适用于所有设备。有任何想法吗?

标签: python windows usb libusb pyusb


【解决方案1】:

您可以使用以下代码获取所有连接的驱动器(闪存和硬盘)的信息。

import os 
os.system('echo list volume > Ravi.txt')
path1 = os.path.join(os.getcwd(),"Ravi.txt")
os.system('diskpart /s '+path1+' > logfile.txt')
path2 = os.path.join(os.getcwd(),"logfile.txt")
Str = open(path2).read()
Str = Str.split('\n')
matching = [s for s in Str if "Removable" in s]
for i in matching:
    i = ' '.join(i.split())
    i = i.split(" ")
    print(i)

import subprocess  
serials = subprocess.check_output('wmic diskdrive get SerialNumber').decode().split('\n')[1:]
serials = [s.strip() for s in serials if s.strip()]

运行这段代码后,会在当前位置创建两个txt文件,里面写着想要的信息

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2020-03-25
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多