WorkBuddy 为什么在 C 盘 Program Files 里装不上?

现象:更新反复弹出,就是装不上

WorkBuddy从 5.8.3 升级到 5.9.3 时出了怪事:每次一启动,“正在安装更新”的窗口就会出现,进度条走完、应用自动重启,可版本一点没变;过一会儿又重来,像陷进了死循环。最后是手动以管理员身份运行安装包才装成功。

01-workbuddy-main.png

图 1 WorkBuddy 5.9.3 主界面:用户在问“安装为什么卡住、本次又是豆包协助装成功的”

现场:安装窗口其实在“空转”

02-update-progress-window.png

图 2 反复出现的“正在安装更新”窗口,提示应用将自动重启

排查中最关键的观察是:安装窗口虽然在跑,但安装目录里的文件没有任何变化,主程序 WorkBuddy.exe 的版本始终是 5.8.3。换句话说,安装器“看起来装完了”,实际上什么都没替换。

根因:没有管理员权限,却要写受保护目录

这是整件事的核心,分四层来看。

第一层,Program Files 是受保护目录。C:\Program Files 是 Windows 的系统级目录,受 UAC(用户账户控制)和 NTFS 权限双重保护。用 icacls 查看实际权限:普通用户组(Users)只有“读取和执行”权限,没有写入、修改、删除的资格;能写入的只有系统账户,以及通过 UAC 提权后的管理员。读取和运行不受影响,被限制的只是“写”。

第二层,自动更新的安装器没有提权。检查自动更新调起的安装进程,它的权限令牌是中等完整性级别(S-1-16-8192),也就是一个没有管理员权限的普通进程。它没有触发 UAC 提权,就直接开始静默安装。

第三层,写入被拒,主程序无法替换。在安装目录里实测创建文件,系统直接返回“访问被拒绝”。于是安装器想替换 Program Files 里的 WorkBuddy.exe 时同样被挡下,版本只能停在 5.8.3。

第四层,安装器没正确报错,于是无限循环。真正让它“卡死”的是安装器的设计缺陷:写入失败后它没有中断、没有报错,日志里反而照常写了“安装完成”,随后自动重启应用。应用重启后又检测到那个还没装上的更新,于是再次退出、再次安装,每约 1.5 分钟一轮。

2289e5b2-a67e-43ed-8b2b-21532a8788ae.png

解决:提权后一次装成功

既然根子在权限,解法就很直接:右键安装包,选择“以管理员身份运行”,在 UAC 弹窗点“是”。提权后的安装器获得了写入资格,文件顺利替换。

03-installing-progress.png

图 3 提权后安装器正常运行,进度条推进 WorkBuddy 5.9.3

04-install-complete.png

图 4 安装程序结束:“WorkBuddy 已经成功安装到本机”

发表评论