4.1 KiB
4.1 KiB
title, type, permalink, stable_id, scope, memory_type, project_id, usage_profile_id, status, revision, request_id, created_at, updated_at
| title | type | permalink | stable_id | scope | memory_type | project_id | usage_profile_id | status | revision | request_id | created_at | updated_at |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Checkpoint 2026-08-20 02:41:42 UTC [8a81e51bd4] | checkpoint | main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/checkpoint-2026-08-20-02-41-42-utc-8a81e51bd4 | 4163f161-0f27-476a-bf98-ba407de20919 | project | checkpoint | ea207d36-693c-4349-b3c8-7c40c8c889f5 | 7aee455b-24cc-4008-bdaf-443721e6f939 | active | 1 | winunlock-ckpt-20260820b | 2026-08-20T02:41:42.672290+00:00 | 2026-08-20T02:41:42.672290+00:00 |
安装方式变更:PowerShell 脚本 → Rust installer(2026-08-20,提交 09662c8)
重要:覆盖上一个检查点里关于 install.ps1 的描述
工程里已经没有任何 .ps1 文件。install/install.ps1、install/uninstall.ps1 已删除,install/ 目录现在只剩 provider.reg(纯注册表模板,作手动备用)。
变更原因(用户提出“为何非得用 ps1”)
- 无 BOM 的 UTF-8 中文 .ps1 在 PowerShell 5.1 + 代码页 936(GBK) 下会被按 ANSI 解码,实测 install.ps1 / uninstall.ps1 分别产生 8 个 / 3 个语法错误,根本跑不起来(虽然转 UTF-8 with BOM 能修好,但仍不如 exe)。
- .ps1 还受 ExecutionPolicy 限制。
- exe 可以在运行时 SetConsoleOutputCP(65001) 自我修正输出编码,这是脚本做不到的。
本次实现
- 新增第五个 crate:crates/installer(package name = installer),产物 winunlock-admin.exe(≈273KB)。
- 子命令:
winunlock-admin install [-t|--unlock-time HH:MM] [-s|--source <目录>] [--skip-task]与winunlock-admin uninstall,另有 --help。 - install 流程:IsUserAnAdmin 校验管理员 → 定位产物(本程序同目录或 target\x86_64-pc-windows-msvc\release)→ 复制 provider.dll/client.exe/setup.exe 到 %PROGRAMDATA%\WinUnLock\bin → icacls 收紧 ACL(仅 SYSTEM/Administrators)→ regsvr32 /s 注册 → schtasks /Create 建每日任务(SYSTEM + /RL HIGHEST,默认 08:30)。
- uninstall 流程:schtasks /Delete → regsvr32 /u(由 DllUnregisterServer 删两处注册表键)→ 删整个数据目录(DLL 被 LogonUI 占用时提示重启后重跑)。注意:install 不会把 winunlock-admin.exe 自己复制到 bin(避免删自己失败),卸载请从构建产物目录运行。
- setup 也加上 SetConsoleOutputCP(65001),中文提示不再需要手动 chcp。
- README 安装/卸载/工程结构/产物路径/crate 职责表/安全说明 共 7 处已全部同步,无 ps1 残留。
验证结果
- cargo build --release 通过;四个产物 provider.dll(573KB)、client.exe(506KB)、setup.exe(632KB)、winunlock-admin.exe(273KB)。
- cargo test --release:14 个单测全过(协议往返/拒绝错误 magic/版本/超长字段/截断、Debug 不泄露密码、账户名解析、配置往返、DPAPI 加解密实测、CLSID 格式化)。
- winunlock-admin.exe --help 与 setup.exe --help 实际运行,退出码 0,中文输出完全正常。
- dumpbin 确认 provider.dll 仍导出 5 个函数。
踩过的坑
给 setup 加 UTF-8 时一次 StrReplace 的 new_string 被截断,把 import 块和 main 函数写坏了(编译报错);已补全修复并重新编译验证通过。教训:大块替换后要立即编译验证。
下一步(给下个会话 / 用户 VM 测试)
- cargo build --release
- 管理员终端:cd target\x86_64-pc-windows-msvc\release 然后 .\winunlock-admin.exe install(可 --unlock-time 改时间)
- 运行 %PROGRAMDATA%\WinUnLock\bin\setup.exe 设账户(.\用户名)与密码
- Win+L 锁屏,把计划任务临时改到 1-2 分钟后,观察自动解锁
- 看 %PROGRAMDATA%\WinUnLock\logs{provider,client}.log
- 卸载:从构建产物目录运行 .\winunlock-admin.exe uninstall 故障恢复不变:安全模式/WinRE 删 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers{E9C67B30-B120-4838-A5A3-FBC2DE03C532} 与 HKCR\CLSID{同} 。
Git
当前工作区干净。提交历史:3e4d09b feat: 实现 WinUnLock 定时自动解锁工程 → 09662c8 refactor: 用 Rust installer 取代 PowerShell 安装脚本。