当前位置: 首页 > news >正文

U盘白名单管控工具(可以添加U盘ID无法实现白名单效果)

U盘白名单管控工具的技术文章大纲

技术背景与需求分析
  • U盘作为常见移动存储设备的安全风险(如病毒传播、数据泄露)
  • 企业或机构对移动存储设备的管控需求
  • 白名单机制的优势(仅允许授权设备访问,提升安全性)
核心功能设计
  • 设备识别与认证(基于硬件ID、序列号等唯一标识)
  • 白名单数据库管理(添加、删除、批量导入授权设备)
  • 实时监控与拦截(非法U盘插入时的阻断与告警)
  • 日志审计与报告生成(记录操作行为便于追溯)
技术实现方案
  • 驱动层拦截技术(如Windows Filter Driver)
  • 用户层权限控制(结合组策略或注册表修改)
  • 数据库设计(SQLite/MySQL存储白名单信息)
  • 加密与签名机制(确保白名单数据不可篡改)
应用场景与案例
  • 企业内部数据防泄密(金融、研发等敏感部门)
  • 政府机构合规要求(等保2.0相关条款)
  • 教育机构机房管理(防止学生使用非授权设备)
挑战与优化方向
  • 兼容性问题(不同操作系统、U盘厂商的适配)
  • 绕过风险(如通过USB Hub或修改设备ID的破解手段)
  • 性能影响(实时监控对系统资源的占用优化)
未来发展趋势
  • 与零信任架构的结合(动态授权与多因素认证)
  • 云同步白名单(多终端统一管理)
  • AI驱动的异常行为检测(自动识别可疑设备)
@echo off
:: 定义当前文件夹路径(使用脚本所在目录)
set "CURRENT_DIR=%~dp0":: 定义脚本路径和日志路径(日志文件生成在当前文件夹下,命名为 USBWhitelistManager_日志.txt)
set "PY_SCRIPT=%CURRENT_DIR%USBWhitelistManager.py"
set "LOG_FILE=%CURRENT_DIR%USBWhitelistManager_日志.txt":: 输出当前运行时间到日志
echo ============================================== >> %LOG_FILE%
echo 脚本运行时间:%date% %time% >> %LOG_FILE%
echo ============================================== >> %LOG_FILE%:: 调用 Python 运行脚本,并将输出/报错写入日志(同时在窗口显示)
python "%PY_SCRIPT%" >> %LOG_FILE% 2>&1
:: 提示运行完成,按任意键关闭窗口
echo.
echo 脚本运行完成!日志已保存至:%LOG_FILE%
pause
import wmi
import winreg
import tkinter as tk
from tkinter import ttk, messagebox
import subprocess
import re
import sys  # 补充sys模块导入(原代码权限检查依赖)class USBDeviceManager:def __init__(self, root):self.root = rootself.root.title("U盘白名单管控工具")self.whitelist = self.load_whitelist()self.init_ui()self.start_monitoring()def init_ui(self):# 白名单列表tk.Label(self.root, text="U盘白名单(硬件ID):").pack(pady=5)self.whitelist_frame = ttk.Frame(self.root)self.whitelist_frame.pack(fill=tk.X, padx=10)self.whitelist_listbox = tk.Listbox(self.whitelist_frame, height=5)self.whitelist_listbox.pack(side=tk.LEFT, fill=tk.X, expand=True)scrollbar = ttk.Scrollbar(self.whitelist_frame, orient=tk.VERTICAL, command=self.whitelist_listbox.yview)scrollbar.pack(side=tk.RIGHT, fill=tk.Y)self.whitelist_listbox.config(yscrollcommand=scrollbar.set)self.refresh_whitelist_display()# 按钮区btn_frame = ttk.Frame(self.root)btn_frame.pack(pady=10)ttk.Button(btn_frame, text="添加当前插入的U盘到白名单", command=self.add_current_usb).pack(side=tk.LEFT, padx=5)ttk.Button(btn_frame, text="从白名单移除选中项", command=self.remove_selected).pack(side=tk.LEFT, padx=5)ttk.Button(btn_frame, text="刷新状态", command=self.refresh_whitelist_display).pack(side=tk.LEFT, padx=5)# 状态区与调试信息(聚焦两种检测方式结果)self.status_var = tk.StringVar(value="监控中... 插入U盘将自动验证")ttk.Label(self.root, textvariable=self.status_var).pack(pady=10, fill=tk.X)self.debug_var = tk.StringVar(value="调试信息:未检测到设备")ttk.Label(self.root, textvariable=self.debug_var, foreground="gray").pack(pady=5, fill=tk.X)def load_whitelist(self):try:key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\USBWhitelistManager", 0, winreg.KEY_READ)whitelist = []i = 0while True:try:name, value, _ = winreg.EnumValue(key, i)whitelist.append(value)i += 1except OSError:breakwinreg.CloseKey(key)return whitelistexcept FileNotFoundError:return []def save_whitelist(self):key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, "Software\\USBWhitelistManager")# 清空原有键值i = 0while True:try:name, _, _ = winreg.EnumValue(key, i)winreg.DeleteValue(key, name)except OSError:break# 写入新白名单for i, usb_id in enumerate(self.whitelist):winreg.SetValueEx(key, f"USB{i}", 0, winreg.REG_SZ, usb_id)winreg.CloseKey(key)self.refresh_whitelist_display()def refresh_whitelist_display(self):self.whitelist_listbox.delete(0, tk.END)for usb_id in self.whitelist:self.whitelist_listbox.insert(tk.END, usb_id)def add_current_usb(self):usb_ids = self.get_all_usb_ids()  # 仅调用两种方式的查询if not usb_ids:messagebox.showinfo("提示", "未检测到插入的U盘")# 调试信息:显示两种方式的具体结果wmi_direct = self.get_wmi_direct_ids()wmic_cmd = self.get_usb_ids_via_wmic()self.debug_var.set(f"调试:WMI直接查询结果={wmi_direct},WMIC命令查询结果={wmic_cmd}")return# 弹窗选择要添加的U盘IDdialog = tk.Toplevel(self.root)dialog.title("选择U盘添加到白名单")tk.Label(dialog, text="请选择要添加的U盘硬件ID:").pack(pady=5)listbox = tk.Listbox(dialog, height=5)listbox.pack(padx=10, pady=5, fill=tk.X)for usb_id in usb_ids:listbox.insert(tk.END, usb_id)def confirm():selected = listbox.curselection()if selected:usb_id = listbox.get(selected[0])if usb_id not in self.whitelist:self.whitelist.append(usb_id)self.save_whitelist()messagebox.showinfo("成功", f"已添加到白名单:{usb_id}")dialog.destroy()ttk.Button(dialog, text="确认添加", command=confirm).pack(pady=5)# 核心:仅保留两种查询方式(去重合并结果)def get_all_usb_ids(self):# 方式1:WMI直接查询Win32_PnPEntitywmi_direct_ids = self.get_wmi_direct_ids()# 方式2:WMIC命令行补充查询wmic_cmd_ids = self.get_usb_ids_via_wmic()# 合并并去重(确保结果唯一)all_ids = list(set(wmi_direct_ids + wmic_cmd_ids))# 调试信息:显示两种方式的结果及最终合并结果self.debug_var.set(f"调试:WMI直接查询到{len(wmi_direct_ids)}个ID={wmi_direct_ids},WMIC命令查询到{len(wmic_cmd_ids)}个ID={wmic_cmd_ids},最终合并={all_ids}")return all_ids# 方式1:WMI直接查询Win32_PnPEntity(提取USB存储设备ID)def get_wmi_direct_ids(self):usb_ids = []try:c = wmi.WMI()for dev in c.Win32_PnPEntity():# 筛选条件:PNP设备ID含USB + 设备名称含存储/U盘/Disk(覆盖中英文场景)if "USB" in dev.PNPDeviceID and ("存储" in dev.Name or "U盘" in dev.Name or "Disk" in dev.Name):# 提取核心硬件ID(格式:USB\VID_XXX&PID_XXX)match = re.search(r"(USB\\VID_\w+&PID_\w+)", dev.PNPDeviceID)if match and match.group(1) not in usb_ids:usb_ids.append(match.group(1))except Exception as e:self.debug_var.set(f"调试:WMI直接查询报错:{str(e)}")return usb_ids# 方式2:WMIC命令行补充查询(绕过WMI接口可能的限制)def get_usb_ids_via_wmic(self):usb_ids = []try:# 执行WMIC命令:查询PNP设备中含USB且名称含存储的设备result = subprocess.run('wmic path Win32_PnPEntity where "PNPDeviceID like \'%USB%\'" get PNPDeviceID, Name',shell=True,capture_output=True,text=True,timeout=10  # 防止命令超时)output = result.stdout.strip()if not output:return usb_ids# 解析命令输出(跳过表头行)lines = output.splitlines()[1:]for line in lines:line = line.strip()if not line:continue# 提取PNP设备ID(格式:USB\XXX...)pnp_match = re.search(r"(USB\\.+?)(?=\s+|$)", line)if not pnp_match:continuepnp_id = pnp_match.group(1)# 检查设备名称是否含存储标识(过滤非存储设备)if "存储" in line or "Disk" in line:# 提取核心硬件ID(格式:USB\VID_XXX&PID_XXX)core_match = re.search(r"(USB\\VID_\w+&PID_\w+)", pnp_id)if core_match and core_match.group(1) not in usb_ids:usb_ids.append(core_match.group(1))except Exception as e:self.debug_var.set(f"调试:WMIC命令查询报错:{str(e)}")return usb_idsdef remove_selected(self):selected = self.whitelist_listbox.curselection()if selected:usb_id = self.whitelist_listbox.get(selected[0])self.whitelist.remove(usb_id)self.save_whitelist()messagebox.showinfo("成功", f"已从白名单移除:{usb_id}")# 设备监控:仅保留基础的插入/移除事件检测def start_monitoring(self):try:self.c = wmi.WMI()self.watcher = self.c.Win32_VolumeChangeEvent()self.root.after(1000, self.check_events)except Exception as e:self.status_var.set(f"监控初始化失败:{str(e)}")def check_events(self):try:for event in self.watcher:if event.EventType == 2:  # 2=设备插入self.status_var.set(f"检测到新设备插入:{event.DriveName}")self.root.update()self.handle_usb_insert()  # 简化:直接重新查询所有USB IDelif event.EventType == 3:  # 3=设备移除self.status_var.set(f"设备已移除:{event.DriveName}")except Exception as e:self.debug_var.set(f"监控事件处理报错:{str(e)}")finally:self.root.after(1000, self.check_events)  # 循环监控# 处理设备插入:验证白名单并禁用未授权设备def handle_usb_insert(self):usb_ids = self.get_all_usb_ids()if not usb_ids:self.status_var.set("检测到设备,但未识别出USB存储ID")return# 检查是否在白名单中in_whitelist = any(usb_id in self.whitelist for usb_id in usb_ids)if in_whitelist:self.status_var.set(f"允许访问:已识别{len(usb_ids)}个授权U盘ID")else:self.status_var.set(f"禁止访问:检测到{len(usb_ids)}个未授权U盘ID")# 禁用所有未授权的USB存储设备for usb_id in usb_ids:if self.disable_usb(usb_id):self.debug_var.set(f"调试:已禁用未授权设备ID={usb_id}")messagebox.showwarning("未授权设备", "检测到未授权U盘,已自动禁用!")# 禁用USB设备(基于硬件ID)def disable_usb(self, usb_id):try:c = wmi.WMI()for dev in c.Win32_PnPEntity():if usb_id in dev.PNPDeviceID and ("存储" in dev.Name or "Disk" in dev.Name):# 执行devcon禁用命令(需确保系统有devcon工具)subprocess.run(f'devcon disable "{dev.PNPDeviceID}"',shell=True,check=True,capture_output=True,text=True)return Trueexcept subprocess.CalledProcessError as e:self.status_var.set(f"禁用失败(ID={usb_id}):{e.stderr}")except Exception as e:self.status_var.set(f"禁用过程报错(ID={usb_id}):{str(e)}")return False# 启用USB设备(保留功能,如需可手动调用)def enable_usb(self, usb_id):try:c = wmi.WMI()for dev in c.Win32_PnPEntity():if usb_id in dev.PNPDeviceID and ("存储" in dev.Name or "Disk" in dev.Name):subprocess.run(f'devcon enable "{dev.PNPDeviceID}"',shell=True,check=True,capture_output=True,text=True)return Trueexcept subprocess.CalledProcessError as e:self.status_var.set(f"启用失败(ID={usb_id}):{e.stderr}")except Exception as e:self.status_var.set(f"启用过程报错(ID={usb_id}):{str(e)}")return Falseif __name__ == "__main__":# 强制管理员权限检查(必须保留,否则无法控制USB设备)try:import ctypesif not ctypes.windll.shell32.IsUserAnAdmin():messagebox.showerror("权限错误", "必须以管理员身份运行!否则无法检测和控制U盘。")# 尝试自动重启为管理员模式ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)sys.exit()except Exception as e:messagebox.showerror("权限检查失败", f"请手动以管理员身份运行:{str(e)}")sys.exit()# 启动UIroot = tk.Tk()app = USBDeviceManager(root)root.mainloop()

http://www.dtcms.com/a/478018.html

相关文章:

  • 【仿真测试】基于FPGA的完整DQPSK通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
  • 网站开发推荐资料柯城区住房和城乡建设局网站
  • 算法沉淀第一天(Triple Removal)
  • PGLRNet论文笔记
  • 如何利用docker部署springboot应用
  • 前端学习3:学习时间:40分钟
  • 网站建设主页文档互联网网站运营推广
  • 七台河网站网站建设做网站有什么意义
  • 【完整源码+数据集+部署教程】种子检测系统源码和数据集:改进yolo11-swintransformer
  • python进阶_Day7
  • DDD架构——实体、聚合、值对象
  • 一次搞懂!我用ChatGPT做学术文献综述的完整实操流程
  • 文献解读-病理区域重要性标记+细胞类型形态相互作用可解释性分析
  • Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
  • 网站建设 项目要求成都网站设计建设推荐
  • 一件代发应该在哪个网站上做怎么用域名建网站
  • Ubuntu 20.04 安装Aerial Gym Simulator - 基于 Gym 的无人机强化学习仿真器
  • Java HashSet 的实现原理
  • Happy DOM曝CVSS 9.4严重RCE漏洞,PoC已公开(CVE-2025-61927)
  • 关于网站建设的句子微营销app
  • 静态网站托管平台wordpress论坛源码
  • mac idea 解决properties文件乱码问题
  • IDEA 常用设置
  • 【XML】基础篇
  • 免费的企业建站系统网站上添加百度地图导航
  • Kernel Debugging Options
  • RoboTwin 2.0 测试ACT模型记录
  • tcpdump 抓包数据分析实战,命令、过滤、常见故障定位与真机补充流程
  • Maven的安装和配置以及IDEA的配置
  • 个人网站制作方法企业网站建设的作用