TaoEngine
(对没错我就是Tao)
1
今天刷帖子看到以前别人讨论仓颉语言的帖子,心血来潮想看看仓颉语言现在发展的怎么样了,于是跑到仓颉官网看了下,哇多了个 Mirascope 风格的 Agent 开发模板,这下不得不下一个体验体验
装好后发现 PowerShell 的 Oh My Pwsh 不能用了 
查了下 Oh My Pwsh 出故障多半和环境变量有关,然后我跑去查了下我电脑的环境变量,一查真的天塌了 
用户环境变量变得和系统环境变量一个样,这下我电脑的开发环境全掉了
还好之前听了小青蛙
的话,给系统开了时间点动态还原,等我操作下看看是什么问题,还原好了我再看看仓颉语言安装器是不是动了我电脑的环境变量
TaoEngine
(对没错我就是Tao)
2
系统还原好了,丢了点配置啊 
然后我拿 AI 逆向了下,这个安装包确实有坑 
AI 给出的报告如下,说我电脑以前装过仓颉,重新装后触发环境变量覆盖 bug
安装包:cangjie-sdk-windows-x64-1.0.5.exe,NSIS 3 安装器,manifest 声明 requireAdministrator(必定提权)。
问题 1:作用域选择页形同虚设(安装时选“仅当前用户”却写系统变量)
- 环境变量页注册为
Page custom func_516 "" —— Leave 回调是空的,用户点选后没有任何代码去读单选框。
func_516 里先把“所有用户”单选钮用 BM_SETCHECK 强制勾上,紧接着 BM_GETCHECK 读回来,据此把 $_17_ 定为 all(控制流上是必然结果),之后才调用 nsDialogs::Show 显示页面。
$_17_ 全脚本只写 2 次、读 1 次,所以用户选什么都没用。
- 安装区
StrCmp $_17_ all 永远成立 → 写 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 的 CANGJIE_HOME + 改 Machine PATH;那段正确的 HKCU 用户级逻辑(L1435/L1436)成为死代码。
- 因为必然提权,HKLM 写入不会静默失败,所以“给用户装”的结果是变量全进系统变量。
问题 2:卸载程序会把系统 PATH 覆盖到用户 PATH(这才是“用户变量和系统变量变得一模一样”的元凶)
powershell
$currentPath = [Environment]::GetEnvironmentVariable('PATH', 'Machine') # 只读系统
$newPath = ...过滤...
[Environment]::SetEnvironmentVariable('PATH', $newPath, 'Machine')
[Environment]::SetEnvironmentVariable('PATH', $newPath, 'User') # 把系统 PATH 写进用户 PATH
用户自己加的条目被整份抹掉。且不必手动卸载:安装器检测到旧版本时默认“重新安装”,点下一步就静默跑 uninstall.exe /S,缺陷即刻触发。
附带:无论选哪个作用域都无条件写 HKLM 的 Uninstall 键;系统分支还把个人目录 $PROFILE\.cjpm\bin 塞进系统 PATH;默认勾选“所有用户”而非跟随提权状态。
现状:你机器已还原干净(两侧均无 CANGJIE_HOME,PATH 不含仓颉条目,且两侧不相等);但被覆盖掉的用户 PATH 无法从注册表恢复,只能靠还原点或手工补回。