
最近微信更新了,增加了三栏布局,说实话真的很难用,于是我做了一个 Windows 微信更新屏蔽工具,已开源github
需求听起来特别简单:不要自动更新。
结果折腾下来才发现,这事真没那么容易。
最后我干脆写了个工具:wechat-update-blocker。
一个专门给 Windows 微信 4.x / xwechat 用的更新屏蔽工具。代码已经开源,可以直接下 Release,也可以自己编译。

1. 痛点:我只是不想升级,怎么这么难?📌
一个软件不想让它自动更新,正常人的第一反应都是这几招:
- 设置里关掉「自动更新」
- 禁止更新程序运行
- 把更新程序删掉
- 禁用计划任务
- 防火墙拦住联网
理论上总有一招管用。但微信 4.x / xwechat 的更新机制,比我想的复杂一点。
1.1 禁止一个更新 EXE,不等于禁止更新
我一开始的思路特别简单。
找到 WeixinUpdate.exe 这种更新程序,直接禁止它运行:
bash
icacls "xxx\WeixinUpdate.exe" /deny Users:(RX)
看起来搞定了。结果用了一段时间发现,更新程序还是会冒出来。
问题在于,更新器不是一个固定不变的文件。xwechat 可以重新释放新的更新组件。
翻译一下就是:
我:禁止 WeixinUpdate.exe 执行
微信:行,那我重新放一个。
只盯着一个 EXE,本质上就是打地鼠。
1.2 删除更新程序,也不彻底
那就直接删掉?问题还是一样。
只要上游还能往这两个地方写文件,今天删了,明天它照样生成:
sql
XPlugin\Plugins\WeixinUpdate
xwechat\update
所以真正的问题不是「怎么删掉更新器」。而是「怎么阻止新的更新器被写进去」。
这个思路一转,后面就顺了。
1.3 只禁用计划任务,也不是完整方案
Windows 软件很爱用计划任务做后台更新,所以我自然也去翻了「任务计划程序」。
这招有用。但我不想让整个工具只押在某一种触发方式上。
因为更新机制会变。今天走计划任务,明天可能换个玩法。
所以我的思路变成了四个点一起处理:
进程 → 更新程序 → 更新目录 → 计划任务
2. 换个思路:别拦「文件」,拦「更新路径」💡
我重新理了一遍微信更新的大致逻辑,简化后大概是这样:
markdown
微信主程序
│
▼
触发更新逻辑
│
├──────────────┐
▼ ▼
计划任务 更新组件
│
▼
WeixinUpdate 目录
│
▼
update 目录
│
▼
替换 / 安装新版
如果只禁止 WeixinUpdate.exe,防护位置其实太靠后了。
所以我决定:把拦截点往前移。
不只禁止已有的更新程序执行,还把更新器依赖的目录一起锁住:
shell
%APPDATA%\Tencent\xwechat\XPlugin\Plugins\WeixinUpdate
%APPDATA%\Tencent\xwechat\update
核心目的就一句话:阻止更新组件继续往这些位置写文件。

3. 我最后做了三层防护
3.1 第一层:结束正在运行的更新进程
如果更新器已经启动了,你再去改权限,很可能已经晚一步。
所以点「屏蔽更新」之后,第一步是处理掉当前正在跑的相关更新进程。
3.2 第二层:禁止已有更新 EXE 执行
对已经找到的微信更新程序,给普通 Users 用户组加上拒绝执行权限。
结果是:
主程序还能正常用
更新器不能执行
注意,我没有直接删微信的文件。
3.3 第三层:锁住更新目录(最关键)
这是整个方案里我认为最重要的一层。
针对前面那两个目录设置 Windows ACL。而且权限会继承给后续创建的文件。
也就是说,限制的不是「现在这个文件不能执行」,而是:
写入 / 新建 / 删除 / 覆盖 / 执行
全给你挡在目录这一层。
这样即使微信以后想再释放一个新更新器,也会撞到目录权限上。
从:
我知道你现在的更新器是谁,所以禁止你运行
变成:
我不管你以后更新器叫什么,这条更新路径我直接锁了
稳定性就好很多了。

4. 三个设计取舍,我觉得比功能本身更有意思
工具能跑起来不难。难的是这几个「要不要这么做」的决定。
4.1 计划任务我禁用,但没删
很多屏蔽更新的脚本上来就是一句:
arduino
schtasks /delete
我没这么干。
我的选择是禁用,而不是删除。原因很简单:我希望所有修改都是可以恢复的。
今天不想更新,不代表以后永远不更新。比如新版修了严重 Bug,或者某个功能必须新版才能用。再比如出了安全更新,我自己突然想升级。
这时候如果之前删得乱七八糟,还得重新研究一遍微信的更新机制。没必要。
所以这个工具一直遵守一条原则:
屏蔽更新 ≠ 破坏更新机制
只是暂时关掉更新能力,需要的时候再完整打开。
4.2 「允许更新」不是摆设
既然改的是 ACL,那恢复功能也得认真做。
工具就两个状态:屏蔽更新 和 允许更新。
选「允许更新」之后,它会删掉自己加的拒绝 ACL,再按选项恢复计划任务。
整个逻辑更像一个开关:
markdown
┌────────────┐
│ 微信更新 │
└─────┬──────┘
│
┌────────┴────────┐
▼ ▼
屏蔽更新 允许更新
│ │
▼ ▼
添加 ACL 移除 ACL
禁用任务 恢复任务
而不是一次性的「删文件、删任务、删目录」。
4.3 状态不能靠软件自己记
小工具特别容易犯一个错。
程序内部写一个 blocked = true,下次打开就显示「当前已屏蔽」。
这其实不可靠。用户完全可能手动改权限、删目录、重装微信。也可能覆盖安装旧版本,或者用别的脚本改 ACL。
只信自己上次存的状态,那 UI 和真实系统迟早对不上。
所以这个工具不记「上一次点的是哪个按钮」。它每次都重新读 Windows ACL,按系统当前的实际权限来判断状态。
也就是:
UI 状态 ← Windows 当前 ACL
而不是:
arduino
UI 状态 ← config.json
对这类改系统配置的工具,我觉得这样才靠谱。
5. 为什么我用 AutoIt,而不是 Electron
做这个工具时我还有个要求:它必须足够小。
因为这软件干的事特别简单:
检查微信 + 调用 Windows 命令 + 修改 ACL + 控制计划任务
就为这点功能上 Electron,得拖进来 node_modules、Chromium、Node.js Runtime,几十上百 MB。
多少有点:
为了拧一颗螺丝,开了一台挖掘机过来。
Tauri 确实轻很多,但这个项目连 WebView 都不是刚需。
最后我选了 AutoIt。它特别适合这种 Windows 小工具。GUI、系统命令、文件操作、Windows API,编译出来就是一个单文件 EXE。
项目里我甚至直接带了一份绿色版 AutoIt 工具链,放在 autoit-tool/。用的人不用额外装环境。
编译就一条命令:
css
.\src\wechat-update-blocker\build.ps1
脚本自动跑一遍:
Au3Check → 语法检查 → Aut2Exe → 生成 x64 EXE
产物:
sql
dist\wechat-update-blocker.exe
对这种单功能 Windows 工具来说,这个方式反而很舒服。
怎么用:三步搞定
运行需要管理员权限,这个没法避免。因为 ACL 和计划任务本身就属于系统配置。

基本流程:
- 下载 Release,或者自己编译
- 以管理员身份运行
dist\wechat-update-blocker.exe - 确认检测到的微信目录,不对就点「浏览...」手动选
- 选「屏蔽更新」,点确认
完事。
想停在某个旧版本? 那就先装好对应版本的微信,再打开屏蔽。
项目 issue 里推荐的是 v4.1.7 ,仓库在 Rodert/wechat-win-versions,Windows、macOS、Linux 的包都有。
顺序别反:先旧版回退,再屏蔽更新。
想升级了? 打开工具选「允许更新」,恢复权限,然后正常升级就行。
7. 边界和风险,我得说清楚
这个工具不会做的事
- 不修改微信主程序
- 不删聊天记录
- 不改账号数据
- 不破解微信,也不改微信的任何功能
它本质上只用了 Windows 自带的两样东西:ACL 文件权限,还有任务计划程序。而且所有操作都能恢复。
风险也要讲 🔥
屏蔽软件更新,意味着你可能拿不到安全补丁和 Bug 修复。
另外微信的更新机制未来完全可能改。所以我不会承诺「100% 永久有效」,只能跟着当前的更新机制持续调整。
如果哪天真遇到微信跑不起来、某些功能异常,或者必须升级才能用。最直接的办法就是打开工具,选「允许更新」。恢复权限以后再升级。
8. 写在最后
这个项目最开始只是我自己的一个小需求。
想法甚至只有一句话:微信,你先别更新。
结果从禁止一个 EXE,一路研究到更新目录。再到 ACL 继承、计划任务和状态恢复,最后干脆做成了一个独立小工具。
有时候这种工具反而挺有意思。
没有复杂架构,没有微服务,没有数据库,没有几十个 npm 包。核心逻辑就是几条 Windows 命令。
但它确实解决了一个每天都可能遇到的小痛点。
自动更新当然有它的好处。对大多数人来说,自动修 Bug、自动补安全漏洞、自动拿新功能,都挺合理。
但对开发者来说,版本稳定性有时候比「永远最新版」更重要。
旧插件兼容、旧 UI 使用习惯、自动化脚本兼容、企业环境兼容,都算。
我们真正需要的其实不是「永远不更新」,而是:
我决定什么时候更新。
这两件事差别很大。
拓展阅读
- 项目地址:github.com/hot-kitty/w...
- 旧版微信下载:github.com/Rodert/wech...
- 更新机制参考博客:www.cnblogs.com/JavaPub/p/1...