如何使用Python获取USB设备的硬件序列号(非卷序列号)?
Python 3.6 下获取USB设备唯一硬件序列号解决方案
你遇到的NoBackendError报错是pyusb依赖的libusb动态库未在系统中安装导致的,这类需要额外后端的方案不适合给普通客户部署,优先推荐以下依赖更少的实现方案:
方案1:调用系统原生API(无额外后端依赖)
Windows 平台实现
使用兼容Python 3.6的pywin32模块调用WMI接口获取,无需安装其他系统组件:
- 安装对应版本依赖
pip install pywin32==228 - 代码示例:
import win32com.client def get_removable_usb_serial(): """仅获取可移动USB存储设备的硬件序列号""" wmi = win32com.client.GetObject("winmgmts:") disk_list = wmi.InstancesOf("Win32_DiskDrive") usb_serials = [] for disk in disk_list: if disk.InterfaceType == "USB" and disk.MediaType == "Removable Media": serial = disk.SerialNumber if serial: usb_serials.append(serial.strip()) return usb_serials # 测试调用 if __name__ == "__main__": print(get_removable_usb_serial())
Linux 平台实现
直接读取系统sysfs文件系统即可获取,无需安装第三方依赖:
import os def get_removable_usb_serial(): usb_serials = [] usb_dev_root = "/sys/bus/usb/devices/" for dev_name in os.listdir(usb_dev_root): # 校验是否为可移动存储设备 removable_path = os.path.join(usb_dev_root, dev_name, "removable") serial_path = os.path.join(usb_dev_root, dev_name, "serial") if os.path.exists(removable_path) and os.path.exists(serial_path): with open(removable_path, "r") as f: if f.read().strip() != "1": continue with open(serial_path, "r") as f: serial = f.read().strip() if serial: usb_serials.append(serial) return usb_serials
方案2:C/C++封装后Cython调用
如果需要更高的兼容性和防破解能力,可以用C++分别实现各平台的USB序列号获取逻辑,编译为动态库后通过Cython封装供Python调用,该方案的校验逻辑更难被逆向破解,适合商业软件授权场景。
授权校验优化建议
- 不要仅校验硬件序列号,可结合U盘的VID、PID、实际容量做多维度校验,降低序列号被伪造的风险
- 校验逻辑建议做代码混淆,避免被逆向工程直接跳过校验步骤
- 随售的U盘建议提前批量测试,部分低质U盘可能存在硬件序列号重复或者为空的问题
内容的提问来源于stack exchange,提问作者user13441977
相关产品推荐
相关产品推荐

