Files
MemRelay/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/Checkpoint 2026-08-20 02-41-42 UTC [8a81e51bd4].md
T

4.1 KiB
Raw Blame History

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”)

  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 安装脚本。