Windows 损坏盘问题补丁卸载工具

[复制链接]
72 |11
发表于 7 小时前 | 显示全部楼层 |阅读模式
微软上周发布了一个非常重要的 Defender 更新,适用于 Win10(KB5063709 / KB5063877 / KB5063871 / KB5063889)和 Win11(KB5063878、KB5063875)。  X 用户 @Necoru_cat 发现,KB5063878 在特定情况下可能导致固态硬盘(SSD)和机械硬盘(HDD)出现严重故障,部分设备在大容量数据写入后无法被系统识别。损坏硬盘。
特定做了这个工具



源代码[Python]  
  1. import sys
  2. import subprocess
  3. import platform
  4. import winreg
  5. import tkinter as tk
  6. from PyQt5.QtWidgets import (
  7.     QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
  8.     QListWidget, QPushButton, QLabel, QTextBrowser, QCheckBox,
  9.     QProgressBar, QGroupBox, QMessageBox
  10. )
  11. from PyQt5.QtCore import QThread, pyqtSignal
  12. class PatchUninstaller(QMainWindow):
  13.     def __init__(self):
  14.         super().__init__()
  15.         self.setWindowTitle("Windows 问题补丁卸载工具 by吾爱破解")
  16.         self.setGeometry(300, 300, 800, 600)
  17.         # 定义问题补丁列表
  18.         self.win10_patches = ["KB5063709", "KB5063877", "KB5063871", "KB5063889"]
  19.         self.win11_patches = ["KB5063878", "KB5063875"]
  20.         self.init_ui()
  21.         self.detect_os_and_patches()
  22.     def init_ui(self):
  23.         # 主组件
  24.         main_widget = QWidget()
  25.         main_layout = QVBoxLayout()
  26.         # 操作系统信息
  27.         self.os_label = QLabel()
  28.         self.os_label.setStyleSheet("font-weight: bold; font-size: 14px; color: #2c3e50;")
  29.         main_layout.addWidget(self.os_label)
  30.         # 补丁检测区域
  31.         patch_group = QGroupBox("检测到的问题补丁")
  32.         patch_layout = QVBoxLayout()
  33.         self.patch_list = QListWidget()
  34.         self.patch_list.setSelectionMode(QListWidget.MultiSelection)
  35.         patch_layout.addWidget(self.patch_list)
  36.         # 操作选项
  37.         self.block_reinstall = QCheckBox("卸载后阻止系统重新安装这些补丁")
  38.         self.block_reinstall.setChecked(True)
  39.         patch_layout.addWidget(self.block_reinstall)
  40.         # 进度条
  41.         self.progress = QProgressBar()
  42.         self.progress.setVisible(False)
  43.         patch_layout.addWidget(self.progress)
  44.         # 按钮区域
  45.         button_layout = QHBoxLayout()
  46.         self.select_all_btn = QPushButton("全选")
  47.         self.select_all_btn.setStyleSheet("background-color: #3498db; color: white;")
  48.         self.select_all_btn.clicked.connect(self.select_all)
  49.         self.rescan_btn = QPushButton("重新检测")
  50.         self.rescan_btn.setStyleSheet("background-color: #2ecc71; color: white;")
  51.         self.rescan_btn.clicked.connect(self.detect_os_and_patches)
  52.         self.uninstall_btn = QPushButton("卸载选中补丁")
  53.         self.uninstall_btn.setStyleSheet("background-color: #e74c3c; color: white;")
  54.         self.uninstall_btn.clicked.connect(self.start_uninstall)
  55.         button_layout.addWidget(self.select_all_btn)
  56.         button_layout.addWidget(self.rescan_btn)
  57.         button_layout.addWidget(self.uninstall_btn)
  58.         button_layout.addStretch()
  59.         patch_layout.addLayout(button_layout)
  60.         patch_group.setLayout(patch_layout)
  61.         main_layout.addWidget(patch_group)
  62.         # 日志区域
  63.         log_group = QGroupBox("操作日志")
  64.         log_layout = QVBoxLayout()
  65.         self.log_browser = QTextBrowser()
  66.         self.log_browser.setStyleSheet("""
  67.             background-color: #f8f9fa;
  68.             border: 1px solid #ddd;
  69.             border-radius: 4px;
  70.             padding: 10px;
  71.             font-family: Consolas, monospace;
  72.         """)
  73.         log_layout.addWidget(self.log_browser)
  74.         log_group.setLayout(log_layout)
  75.         main_layout.addWidget(log_group)
  76.         main_widget.setLayout(main_layout)
  77.         self.setCentralWidget(main_widget)
  78.         # 状态栏
  79.         self.statusBar().showMessage("就绪 - 请先检测系统补丁")
  80.     def detect_os_and_patches(self):
  81.         """检测操作系统和已安装的问题补丁"""
  82.         self.log_browser.clear()
  83.         self.log_browser.append("正在检测操作系统版本...")
  84.         try:
  85.             # 获取Windows版本信息
  86.             with winreg.OpenKey(
  87.                 winreg.HKEY_LOCAL_MACHINE,
  88.                 r"SOFTWARE\Microsoft\Windows NT\CurrentVersion"
  89.             ) as key:
  90.                 product_name = winreg.QueryValueEx(key, "ProductName")
  91.                 current_build = winreg.QueryValueEx(key, "CurrentBuild")
  92.             # 确定操作系统类型
  93.             if "Windows 10" in product_name:
  94.                 os_type = "Windows 10"
  95.                 patch_list = self.win10_patches
  96.             elif "Windows 11" in product_name:
  97.                 os_type = "Windows 11"
  98.                 patch_list = self.win11_patches
  99.             else:
  100.                 os_type = f"检测到: {product_name} (仅支持Win10/11)"
  101.                 patch_list = []
  102.             self.os_label.setText(f"操作系统: {os_type} (Build {current_build})")
  103.             self.log_browser.append(f">> 系统检测完成: {product_name} (Build {current_build})")
  104.         except Exception as e:
  105.             self.os_label.setText("操作系统: 检测失败")
  106.             self.log_browser.append(f">> 系统检测失败: {str(e)}")
  107.             self.statusBar().showMessage("操作系统检测失败")
  108.             return
  109.         # 检测问题补丁
  110.         self.log_browser.append("\n正在扫描已安装补丁...")
  111.         self.patch_list.clear()
  112.         found_patches = []
  113.         if patch_list:
  114.             for patch in patch_list:
  115.                 self.log_browser.append(f"检查补丁: {patch}...")
  116.                 try:
  117.                     # 使用WMIC检查补丁安装状态
  118.                     result = subprocess.run(
  119.                         ["wmic", "qfe", "list", "brief"],
  120.                         capture_output=True,
  121.                         text=True,
  122.                         creationflags=subprocess.CREATE_NO_WINDOW
  123.                     )
  124.                     if patch in result.stdout:
  125.                         found_patches.append(patch)
  126.                         self.log_browser.append(f"   [已安装] {patch}")
  127.                     else:
  128.                         self.log_browser.append(f"   [未安装] {patch}")
  129.                 except Exception as e:
  130.                     self.log_browser.append(f"   [检测失败] {patch}: {str(e)}")
  131.         # 显示检测结果
  132.         if found_patches:
  133.             self.patch_list.addItems(found_patches)
  134.             for i in range(self.patch_list.count()):
  135.                 self.patch_list.item(i).setSelected(True)
  136.             self.statusBar().showMessage(f"发现 {len(found_patches)} 个问题补丁")
  137.         else:
  138.             self.log_browser.append("\n>> 未检测到问题补丁")
  139.             self.statusBar().showMessage("未检测到问题补丁")
  140.     def select_all(self):
  141.         """选择/取消所有补丁"""
  142.         if self.patch_list.count() > 0:
  143.             for i in range(self.patch_list.count()):
  144.                 self.patch_list.item(i).setSelected(True)
  145.             self.log_browser.append("\n>> 已选中所有补丁")
  146.     def start_uninstall(self):
  147.         """启动卸载线程"""
  148.         selected_items = self.patch_list.selectedItems()
  149.         if not selected_items:
  150.             QMessageBox.warning(self, "警告", "请选择要卸载的补丁!")
  151.             return
  152.         patches = [item.text() for item in selected_items]
  153.         block_reinstall = self.block_reinstall.isChecked()
  154.         reply = QMessageBox.question(
  155.             self,
  156.             "确认操作",
  157.             f"确定要卸载 {len(patches)} 个补丁吗?\n此操作可能需要几分钟时间,完成后建议重启系统。",
  158.             QMessageBox.Yes | QMessageBox.No
  159.         )
  160.         if reply == QMessageBox.Yes:
  161.             self.progress.setVisible(True)
  162.             self.progress.setRange(0, len(patches))
  163.             self.uninstall_btn.setEnabled(False)
  164.             self.patch_list.setEnabled(False)
  165.             # 启动卸载线程
  166.             self.worker = UninstallWorker(patches, block_reinstall)
  167.             self.worker.progress_signal.connect(self.update_progress)
  168.             self.worker.log_signal.connect(self.log_browser.append)
  169.             self.worker.finished.connect(self.uninstall_finished)
  170.             self.worker.start()
  171.     def update_progress(self, value):
  172.         """更新进度条"""
  173.         self.progress.setValue(value)
  174.     def uninstall_finished(self):
  175.         """卸载完成处理"""
  176.         self.progress.setVisible(False)
  177.         self.uninstall_btn.setEnabled(True)
  178.         self.patch_list.setEnabled(True)
  179.         self.log_browser.append("\n>> 操作已完成! 建议重启系统使更改生效")
  180.         self.statusBar().showMessage("操作完成 - 请查看日志")
  181.         # 显示完成通知
  182.         QMessageBox.information(
  183.             self,
  184.             "完成",
  185.             "卸载操作已完成!\n请在操作日志中查看详细结果。\n\n建议重启系统使更改生效。"
  186.         )
  187. class UninstallWorker(QThread):
  188.     """执行卸载操作的线程"""
  189.     progress_signal = pyqtSignal(int)
  190.     log_signal = pyqtSignal(str)
  191.     finished = pyqtSignal()
  192.     def __init__(self, patches, block_reinstall):
  193.         super().__init__()
  194.         self.patches = patches
  195.         self.block_reinstall = block_reinstall
  196.     def run(self):
  197.         """执行卸载操作"""
  198.         self.log_signal.emit("\n===== 开始卸载操作 =====")
  199.         # 卸载每个选中的补丁
  200.         for i, patch in enumerate(self.patches):
  201.             self.log_signal.emit(f"\n卸载补丁 {patch}...")
  202.             self.progress_signal.emit(i+1)
  203.             try:
  204.                 # 执行卸载命令
  205.                 result = subprocess.run(
  206.                     ["wusa", "/uninstall", f"/kb:{patch[2:]}", "/quiet", "/norestart"],
  207.                     capture_output=True,
  208.                     text=True,
  209.                     creationflags=subprocess.CREATE_NO_WINDOW,
  210.                     timeout=300  # 5分钟超时
  211.                 )
  212.                 if result.returncode == 0:
  213.                     self.log_signal.emit(f"   [成功] {patch} 已卸载")
  214.                     # 应用重装阻止
  215.                     if self.block_reinstall:
  216.                         self.block_patch_reinstall(patch)
  217.                 else:
  218.                     error_msg = result.stderr.strip() or "未知错误"
  219.                     self.log_signal.emit(f"   [失败] 错误代码: {result.returncode}")
  220.                     self.log_signal.emit(f"   错误信息: {error_msg}")
  221.             except subprocess.TimeoutExpired:
  222.                 self.log_signal.emit(f"   [超时] 卸载 {patch} 操作超时")
  223.             except Exception as e:
  224.                 self.log_signal.emit(f"   [异常] 卸载失败: {str(e)}")
  225.         self.log_signal.emit("\n===== 所有操作已完成 =====")
  226.         self.finished.emit()
  227.     def block_patch_reinstall(self, patch):
  228.         """阻止补丁重新安装(通过注册表)"""
  229.         reg_path = r"SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate"
  230.         value_name = f"BlockKB{patch}"
  231.         try:
  232.             with winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, reg_path) as key:
  233.                 winreg.SetValueEx(key, value_name, 0, winreg.REG_DWORD, 1)
  234.                 self.log_signal.emit(f"   [已阻止] 补丁 {patch} 将被禁止重新安装")
  235.         except Exception as e:
  236.             self.log_signal.emit(f"   [警告] 阻止重安装失败: {str(e)}")
  237. if __name__ == "__main__":
  238.     # 检查管理员权限
  239.     if platform.system() == "Windows":
  240.         import ctypes
  241.         if ctypes.windll.shell32.IsUserAnAdmin() == 0:
  242.             ctypes.windll.shell32.ShellExecuteW(
  243.                 None, "runas", sys.executable, " ".join(sys.argv), None, 1
  244.             )
  245.             sys.exit()
  246.     app = QApplication(sys.argv)
  247.     app.setStyle("Fusion")
  248.     window = PatchUninstaller()
  249.     window.show()
  250.     sys.exit(app.exec_())
复制代码


打包exe程序下载地址:通过网盘分享的文件:window补丁卸载.exe
链接: https://pan.baidu.com/s/1cxX_ZLCYbz2LdPQAjEiGWg 提取码: 5izp

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
感谢提供,不过识别有问题,我的windows 11,识别为windows 10,那个补丁存在,但提示未检测到问题补丁
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
感谢提供。windows 11识别成windows 10,在系统设置中查看,那个补丁被安装过,但在卸载界面无卸载选项,而本软件运行后的结果是:提示未检测到问题补丁,很有必要修优化一下。
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
下载使用,谢谢大佬分享!
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
感谢,卸载最安全。
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
给大神点个赞!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
自动化工具对小白友好 谢谢啦
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
幸好我的系统不自动更新。。
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
刚下下来 感谢
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
现在所有的系统都不要更新了,越更新系统问题越多,还越来越慢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表