{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "f53ca1dd", "metadata": {}, "outputs": [], "source": [ "import wmi\n", "import subprocess\n", "import time\n", "from threading import Lock\n", "\n", "# 配置部分\n", "KEY_FILE = \".key\" # U盘中的密码文件\n", "EXPECTED_PASSWORD = \"1234\" # 预设密码\n", "DEVCON_PATH = r\"E:\\下载器\\Devcon\\x64\\devcon.exe\"\n", "DISABLED_DEVICES = set()\n", "device_lock = Lock()\n", "\n", "def disable_device(dev_id):\n", " subprocess.run([DEVCON_PATH, \"disable\", dev_id], shell=True, capture_output=True)\n", " with device_lock:\n", " DISABLED_DEVICES.add(dev_id)\n", "\n", "def enable_device(dev_id):\n", " subprocess.run([DEVCON_PATH, \"enable\", dev_id], shell=True, capture_output=True)\n", " with device_lock:\n", " if dev_id in DISABLED_DEVICES:\n", " DISABLED_DEVICES.remove(dev_id)\n", "\n", "def get_usb_storage_drives():\n", " \"\"\"获取所有可移动USB存储设备的盘符\"\"\"\n", " c = wmi.WMI()\n", " drives = []\n", " for disk in c.Win32_DiskDrive(InterfaceType=\"USB\"):\n", " for p in disk.associators(\"Win32_DiskDriveToDiskPartition\"):\n", " for d in p.associators(\"Win32_LogicalDiskToPartition\"):\n", " drives.append(d.DeviceID)\n", " return drives\n", "\n", "def check_usb_key(drive):\n", " \"\"\"检查U盘根目录的密钥文件\"\"\"\n", " try:\n", " key_path = fr\"{drive}\\{KEY_FILE}\"\n", " with open(key_path, \"r\") as f:\n", " return f.read().strip() == EXPECTED_PASSWORD\n", " except:\n", " return False\n", "\n", "def handle_storage_insert():\n", " \"\"\"处理U盘插入事件\"\"\"\n", " time.sleep(2) # 等待系统分配盘符\n", " for drive in get_usb_storage_drives():\n", " if check_usb_key(drive):\n", " print(f\"在 {drive} 发现有效密钥\")\n", " with device_lock:\n", " for dev_id in list(DISABLED_DEVICES):\n", " enable_device(dev_id)\n", " return True\n", " return False\n", "\n", "def monitor_devices():\n", " c = wmi.WMI()\n", " \n", " # 存储设备监听线程\n", " def storage_watcher():\n", " storage_monitor = c.Win32_DeviceChangeEvent.watch_for(\n", " event_type=2, # 设备插入\n", " delay_secs=2\n", " )\n", " while True:\n", " try:\n", " storage_monitor()\n", " if handle_storage_insert():\n", " print(\"成功启用被禁用的键盘设备\")\n", " except Exception as e:\n", " print(f\"存储设备监控异常: {e}\")\n", "\n", " # 键盘设备监听\n", " keyboard_monitor = c.Win32_DeviceChangeEvent.watch_for(\n", " EventType=2,\n", " delay_secs=1\n", " )\n", " \n", " # 启动存储监控线程\n", " import threading\n", " threading.Thread(target=storage_watcher, daemon=True).start()\n", "\n", " while True:\n", " try:\n", " keyboard_monitor()\n", " print(\"检测到新输入设备...\")\n", " c = wmi.WMI()\n", " for dev in c.Win32_PnPEntity():\n", " if \"Keyboard\" in str(dev.Description) and \"USB\" in str(dev.Description):\n", " dev_id = dev.DeviceID\n", " if dev_id not in DISABLED_DEVICES:\n", " print(f\"禁用USB键盘: {dev_id}\")\n", " disable_device(dev_id)\n", " except Exception as e:\n", " print(f\"键盘监控异常: {e}\")\n", "\n", "# if __name__ == \"__main__\":\n", "# # 检查管理员权限\n", "# import ctypes, sys\n", "# if ctypes.windll.shell32.IsUserAnAdmin() == 0:\n", "# ctypes.windll.shell32.ShellExecuteW(None, \"runas\", sys.executable, __file__, None, 1)\n", "# else:\n", "# monitor_devices()" ] }, { "cell_type": "code", "execution_count": null, "id": "f0f8c644", "metadata": {}, "outputs": [], "source": [ "c = wmi.WMI()" ] }, { "cell_type": "code", "execution_count": null, "id": "ebc809a7", "metadata": {}, "outputs": [], "source": [ "watcher = c.Win32_VolumeChangeEvent.watch_for(\n", " EventType=2 # 2表示卷载入(设备插入)\n", ")\n", "event = watcher()\n", "drive_letter = event.DriveName" ] }, { "cell_type": "code", "execution_count": null, "id": "c2d33b3f", "metadata": {}, "outputs": [], "source": [ "drive_letter" ] }, { "cell_type": "code", "execution_count": null, "id": "1e6d53e6", "metadata": {}, "outputs": [], "source": [ "import wmi\n", "import time\n", "\n", "def wait_for_usb():\n", " c = wmi.WMI()\n", "\n", " # 监听USB存储设备插入事件\n", " watcher = c.Win32_VolumeChangeEvent.watch_for(\n", " EventType=2 # 2表示卷载入(设备插入)\n", " )\n", "\n", " print(\"等待U盘插入...\")\n", " while True:\n", " try:\n", " event = watcher()\n", " drive_letter = event.DriveName\n", " print(f\"检测到U盘插入,盘符: {drive_letter}\")\n", " return drive_letter\n", " except wmi.x_wmi_timed_out:\n", " # 超时后继续等待\n", " time.sleep(0.1)\n", " except KeyboardInterrupt:\n", " print(\"\\n已停止监听\")\n", " break\n", "\n", "if __name__ == \"__main__\":\n", " usb_drive = wait_for_usb()\n", " if usb_drive:\n", " print(f\"接下来可以使用 {usb_drive} 访问U盘文件\")\n", " # 示例:列出U盘根目录文件\n", " import os\n", " print(\"根目录文件:\", os.listdir(usb_drive))" ] }, { "cell_type": "code", "execution_count": null, "id": "70115805", "metadata": {}, "outputs": [], "source": [ "keyboard_monitor = c.Win32_DeviceChangeEvent.watch_for(\n", " EventType=2,\n", " delay_secs=1\n", ")\n", "keyboard_monitor()\n", "for dev in c.Win32_PnPEntity(fields=[\"Description\",\"DeviceID\"]):\n", " if \"Keyboard\" in str(dev.Description):\n", " print(f\"检测到键盘设备: {dev.Description} - ID: {dev.DeviceID}\")\n", " os.system(rf'''E:\\下载器\\Devcon\\x64\\devcon.exe remove @\"{dev.DeviceID}\"''')" ] }, { "cell_type": "code", "execution_count": null, "id": "e4475bb3", "metadata": {}, "outputs": [], "source": [ "\n", " # if \"Keyboard\" in str(dev.Description) and \"USB\" in str(dev.Description):\n", " # dev_id = dev.DeviceID\n", " # if dev_id not in DISABLED_DEVICES:\n", " # print(f\"禁用USB键盘: {dev_id}\")\n", " # disable_device(dev_id)" ] }, { "cell_type": "code", "execution_count": null, "id": "e78487c2", "metadata": {}, "outputs": [], "source": [ "subprocess.run([DEVCON_PATH, \"remove\", r'''@\"HID\\VID_0C45&PID_8071&MI_00\\7&612DDAA&0&0000\"'''], shell=True, capture_output=True)" ] }, { "cell_type": "code", "execution_count": null, "id": "f7c7a31c", "metadata": {}, "outputs": [], "source": [ "import os \n" ] }, { "cell_type": "code", "execution_count": null, "id": "2787e77e", "metadata": {}, "outputs": [], "source": [ "for disk in c.Win32_DiskDrive():\n", " print(f\"USB设备: {disk.InterfaceType}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "113e0a8e", "metadata": {}, "outputs": [], "source": [ "import tkinter as tk\n", "\n", "def show_auto_close_message(title, message, duration=3):\n", " # 创建主窗口(隐藏)\n", " root = tk.Tk()\n", " root.withdraw()\n", "\n", " # 创建弹窗\n", " popup = tk.Toplevel()\n", " popup.title(title)\n", " \n", " # 设置消息内容\n", " label = tk.Label(popup, text=message, padx=30, pady=20)\n", " label.pack()\n", " \n", " # 禁止窗口缩放\n", " popup.resizable(False, False)\n", " \n", " # 计算居中位置\n", " popup.update_idletasks() # 强制更新窗口尺寸\n", " width = popup.winfo_width()\n", " height = popup.winfo_height()\n", " x = (popup.winfo_screenwidth() - width) // 2\n", " y = (popup.winfo_screenheight() - height) // 2\n", " popup.geometry(f\"+{x}+{y}\")\n", "\n", " # 设置自动关闭\n", " def close():\n", " popup.destroy()\n", " root.destroy() # 同时销毁主窗口\n", "\n", " popup.after(duration * 1000, close)\n", " popup.mainloop()\n", "\n", "# 使用示例\n", "if __name__ == \"__main__\":\n", " show_auto_close_message(\"操作成功\", \"设备已启用!\", 3)" ] }, { "cell_type": "code", "execution_count": 7, "id": "4c8043c5", "metadata": {}, "outputs": [ { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[7], line 33\u001b[0m\n\u001b[0;32m 30\u001b[0m popup\u001b[38;5;241m.\u001b[39mafter(\u001b[38;5;241m3000\u001b[39m, close_window)\n\u001b[0;32m 32\u001b[0m \u001b[38;5;66;03m# 启动主循环\u001b[39;00m\n\u001b[1;32m---> 33\u001b[0m \u001b[43mroot\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmainloop\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32md:\\Anaconda3\\lib\\tkinter\\__init__.py:1429\u001b[0m, in \u001b[0;36mMisc.mainloop\u001b[1;34m(self, n)\u001b[0m\n\u001b[0;32m 1427\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmainloop\u001b[39m(\u001b[38;5;28mself\u001b[39m, n\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m):\n\u001b[0;32m 1428\u001b[0m \u001b[38;5;124;03m\"\"\"Call the mainloop of Tk.\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1429\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtk\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmainloop\u001b[49m\u001b[43m(\u001b[49m\u001b[43mn\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "import tkinter as tk\n", "\n", "def close_window():\n", " # 关闭弹窗和主窗口(确保程序退出)\n", " popup.destroy()\n", " root.destroy()\n", "\n", "# 创建主窗口并隐藏\n", "root = tk.Tk()\n", "root.withdraw()\n", "\n", "# 创建弹窗\n", "popup = tk.Toplevel(root)\n", "popup.title(\"提示\")\n", "\n", "# 设置弹窗大小和居中显示\n", "window_width = 300\n", "window_height = 200\n", "screen_width = root.winfo_screenwidth()\n", "screen_height = root.winfo_screenheight()\n", "x = (screen_width - window_width) // 2\n", "y = (screen_height - window_height) // 2\n", "popup.geometry(f\"{window_width}x{window_height}+{x}+{y}\")\n", "\n", "# 添加文本标签\n", "label = tk.Label(popup, text=\"3秒后自动关闭\", font=(\"微软雅黑\", 12))\n", "label.pack(expand=True, pady=50)\n", "\n", "# 设置3秒后关闭窗口\n", "popup.after(3000, close_window)\n", "\n", "# 启动主循环\n", "root.mainloop()" ] }, { "cell_type": "markdown", "id": "458bd510", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "base", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" } }, "nbformat": 4, "nbformat_minor": 5 }