python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python USB安全弹出

基于Python开发一个专业级USB安全弹出工具

作者:创客白泽

在日常使用计算机时,我们经常会遇到"该设备正在使用中,无法安全移除"的烦人提示,所以我们就来使用使用Python开发一个专业级USB安全弹出工具吧

概述:为什么需要专业USB弹出工具

在日常使用计算机时,我们经常会遇到"该设备正在使用中,无法安全移除"的烦人提示。传统解决方法要么是暴力拔插(可能损坏数据),要么是反复尝试弹出(效率低下)。本文将介绍如何使用Python开发一个专业级USB安全弹出工具,它能够:

相比Windows自带的弹出功能,我们的工具具有进程可视化、强制解锁、操作日志等高级特性,是IT技术人员和普通用户的实用利器。

功能全景图

功能模块实现技术特色亮点
驱动器检测ctypes.windll.kernel32实时刷新可移动设备列表
进程扫描psutil库全量扫描+精准定位
进程终止win32process权限提升处理
卷解锁win32file IOCTL控制底层磁盘操作
设备弹出IOCTL_STORAGE_EJECT_MEDIA硬件级控制
GUI界面PyQt5专业级交互体验
系统托盘QSystemTrayIcon后台常驻+快捷操作

效果展示

主界面截图

进程检测效果

[14:25:33] 🔍 正在获取进程列表...
[14:25:34] 📊 找到 156 个进程,正在扫描...
[14:25:37] ⚠️ 找到 2 个锁定进程:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[14:25:37] 🆔 PID: 1234
[14:25:37] 📛 名称: explorer.exe
[14:25:37] 📂 路径: C:\Windows\explorer.exe
[14:25:37] 💻 命令: explorer /select,D:\test.docx
[14:25:37] 👤 用户: DESKTOP-Admin
[14:25:37] 📊 状态: running
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

系统托盘菜单

开发环境准备

必备组件

pip install pywin32 psutil PyQt5 ctypes

特别说明

本程序需要管理员权限运行,因为涉及:

核心代码解析

1. 驱动器检测机制

def get_removable_drives(self):
    """获取所有可移动驱动器"""
    drives = []
    bitmask = ctypes.windll.kernel32.GetLogicalDrives()
    for letter in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
        if bitmask & 1:
            drive_type = ctypes.windll.kernel32.GetDriveTypeW(f"{letter}:\\")
            if drive_type == win32con.DRIVE_REMOVABLE:
                drives.append(f"{letter}:")
        bitmask >>= 1
    return drives

关键技术点:

GetLogicalDrives()获取所有逻辑驱动器位掩码

GetDriveTypeW()判断驱动器类型

位运算遍历26个字母驱动器

2. 进程扫描引擎

def find_locking_processes(self):
    # 获取进程列表(约150-200个系统进程)
    processes = list(psutil.process_iter(['pid', 'name', 'exe', 'cmdline']))
    
    # 双重检测机制
    for proc in processes:
        # 检测1:打开的文件句柄
        for item in proc.open_files():
            if item.path.lower().startswith(drive_path):
                locking_processes.append(proc.info)
        
        # 检测2:工作目录
        try:
            cwd = proc.cwd()
            if cwd and cwd.lower().startswith(drive_path):
                locking_processes.append(proc.info)

3. 底层解锁三连击

# 1. 锁定卷(禁止写入)
win32file.DeviceIoControl(
    h_volume,
    FSCTL_LOCK_VOLUME,  # 控制码0x00090018
    None, None, None
)

# 2. 卸载文件系统
win32file.DeviceIoControl(
    h_volume,
    FSCTL_DISMOUNT_VOLUME,  # 控制码0x00090020
    None, None, None
)

​​​​​​​# 3. 物理弹出
win32file.DeviceIoControl(
    h_volume,
    IOCTL_STORAGE_EJECT_MEDIA,  # 控制码0x2D4808
    None, None, None
)

4. PyQt5多线程处理

class WorkerThread(QThread):
    update_progress = pyqtSignal(str, int, int)  # 进度更新信号
    
    def run(self):
        try:
            if self.operation_type == 'find':
                self.find_locking_processes()
            elif self.operation_type == 'unlock_and_eject':
                self.unlock_and_eject_drive()
        except Exception as e:
            self.log_message(f"线程错误: {str(e)}")

使用教程

基本操作流程

启动程序(自动获取管理员权限)

从列表选择目标USB驱动器

点击"查找占用进程"分析问题

点击"解除占用并弹出"安全移除

高级技巧

托盘快捷操作:右键系统图标直接选择驱动器

自动刷新:每5秒自动更新驱动器列表

日志分析:查看完整的操作记录和错误信息

完整源码下载

完整项目源码:

项目结构:

USB_Ejector_Pro/
├── main.py              # 主程序入口
├── requirements.txt     # 依赖库列表
├── assets/              # 资源文件
│   ├── icon.ico         # 程序图标
│   └── screenshot.png   # 截图
└── README.md            # 使用说明

技术深度剖析

1. Windows IOCTL控制原理

IOCTL(Input/Output Control)是Windows提供的设备控制接口,我们的程序使用了三类关键控制码:

控制码功能说明
FSCTL_LOCK_VOLUME0x00090018独占锁定卷
FSCTL_DISMOUNT_VOLUME0x00090020卸载文件系统
IOCTL_STORAGE_EJECT_MEDIA0x2D4808物理弹出设备

2. 进程终止的权限问题

普通进程无法终止系统关键进程,我们的解决方案:

3. PyQt5的多线程模型

GUI线程与工作线程分离的关键点:

性能优化建议

进程扫描加速:缓存系统进程列表,增量更新

异常处理增强:对僵尸进程的特殊处理

日志系统改进:增加日志分级和文件输出

多语言支持:使用Qt的翻译系统

未来扩展方向

总结

本文详细介绍了一个专业级USB安全弹出工具的开发全过程,关键技术包括:

这个工具不仅解决了实际痛点,更展示了Python在系统编程方面的强大能力。读者可以根据自身需求进一步扩展功能,比如增加自动备份、磁盘修复等高级特性。

到此这篇关于基于Python开发一个专业级USB安全弹出工具的文章就介绍到这了,更多相关Python USB安全弹出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文