chore: 导入旧记忆备份供恢复

This commit is contained in:
2026-09-23 22:38:40 +08:00
parent 5313fcee7a
commit 6a6a895eaf
638 changed files with 29816 additions and 1 deletions
@@ -0,0 +1,54 @@
---
title: Checkpoint 2026-08-20 02:41:42 UTC [8a81e51bd4]
type: checkpoint
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/checkpoint-2026-08-20-02-41-42-utc-8a81e51bd4
stable_id: 4163f161-0f27-476a-bf98-ba407de20919
scope: project
memory_type: checkpoint
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-ckpt-20260820b
created_at: '2026-08-20T02:41:42.672290+00:00'
updated_at: '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”)
1. 无 BOM 的 UTF-8 中文 .ps1 在 PowerShell 5.1 + 代码页 936(GBK) 下会被按 ANSI 解码,实测 install.ps1 / uninstall.ps1 分别产生 8 个 / 3 个语法错误,根本跑不起来(虽然转 UTF-8 with BOM 能修好,但仍不如 exe)。
2. .ps1 还受 ExecutionPolicy 限制。
3. 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 测试)
1. cargo build --release
2. 管理员终端:cd target\x86_64-pc-windows-msvc\release 然后 .\winunlock-admin.exe install(可 --unlock-time 改时间)
3. 运行 %PROGRAMDATA%\WinUnLock\bin\setup.exe 设账户(.\用户名)与密码
4. Win+L 锁屏,把计划任务临时改到 1-2 分钟后,观察自动解锁
5. 看 %PROGRAMDATA%\WinUnLock\logs\{provider,client}.log
6. 卸载:从构建产物目录运行 .\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 安装脚本。