2.4 KiB
2.4 KiB
title, type, permalink, stable_id, scope, project_id, memory_type, status, revision, restored_from_commit, created_at, updated_at
| title | type | permalink | stable_id | scope | project_id | memory_type | status | revision | restored_from_commit | created_at | updated_at |
|---|---|---|---|---|---|---|---|---|---|---|---|
| WinUnLock 端到端解锁测试失败时的排查线索 | experience | main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/win-un-lock-端到端解锁测试失败时的排查线索 | 8d83fdf5-683a-41ce-94ed-da186cf32c71 | project | ea207d36-693c-4349-b3c8-7c40c8c889f5 | experience | active | 1 | 6a6a895eaf |
2026-09-23T15:12:03.146977+00:00 | 2026-09-23T15:12:03.147031+00:00 |
适用场景:在虚拟机里安装完 WinUnLock(winunlock-admin install + setup.exe 设凭据)并 Win+L 锁屏后,到点没有自动解锁。按以下顺序排查(来自实现者对自己代码风险点的评估):
- 先看 %PROGRAMDATA%\WinUnLock\logs\provider.log 里有没有「凭据已就绲,请求自动登录」这行(GetCredentialCount 的 autologon 分支)。
- 有:管道已通、凭据已送达,问题在后续提交/验证环节。
- 无:凭据没送达,查 client.log 与 client.exe 退出码(退出码 10 = 管道不存在,通常意味着触发时并未锁屏,并非故障;2/3/4 分别是 config.toml 、cred.bin 读取失败与 DPAPI 解密失败)。
- GetSerialization 里的 ulAuthenticationPackage:Negotiate 认证包 ID 通过 LsaLookupAuthenticationPackage 查询,失败时代码会 unwrap_or(0) 退回 0,这会导致 LSA 直接拒绝凭据。怀疑时在 provider 里把该 ID 打到日志确认非 0。
- 域账户时 full_username 的拼接是否符合 LSA 期望(本地账户用 .\用户名 一般没问题;域账户需 域\用户 或 UPN)。
其它已知坑:仅支持账户文本密码,Windows Hello PIN 不适用;睡眠/休眠状态下本方案不会唤醒机器(需另配勾选「唤醒计算机运行此任务」的任务,并把解锁任务安排在其后几十秒);密码变更后必须重跑 setup,否则反复失败可能触发账户锁定策略。
环境教训:rust-toolchain.toml 不要写死具体版本(如 channel = "1.94.1")—— rustup 会在任何 cargo 命令前尝试联网重装整条工具链,若本机 toolchain 目录处于部分安装状态会反复失败(os error 32 文件被占用)。用 channel = "stable" 即可。
windows crate 0.62.2 API 差异(实现时踩到并修正):GetLocalTime() 直接返回 SYSTEMTIME 而非用出参;WaitNamedPipeW 返回 BOOL 而非 Result。