Files
MemRelay/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/WinUnLock 端到端解锁测试失败时的排查线索.md

28 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: WinUnLock 端到端解锁测试失败时的排查线索
type: experience
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/win-un-lock-端到端解锁测试失败时的排查线索
stable_id: 8d83fdf5-683a-41ce-94ed-da186cf32c71
scope: project
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
memory_type: experience
status: active
revision: 1
restored_from_commit: 6a6a895eafcca6052e81a14fca103a42635dd1c2
created_at: '2026-09-23T15:12:03.146977+00:00'
updated_at: '2026-09-23T15:12:03.147031+00:00'
---
适用场景:在虚拟机里安装完 WinUnLock(winunlock-admin install + setup.exe 设凭据)并 Win+L 锁屏后,到点没有自动解锁。按以下顺序排查(来自实现者对自己代码风险点的评估):
1. 先看 %PROGRAMDATA%\WinUnLock\logs\provider.log 里有没有「凭据已就绲,请求自动登录」这行(GetCredentialCount 的 autologon 分支)。
- 有:管道已通、凭据已送达,问题在后续提交/验证环节。
- 无:凭据没送达,查 client.log 与 client.exe 退出码(退出码 10 = 管道不存在,通常意味着触发时并未锁屏,并非故障;2/3/4 分别是 config.toml 、cred.bin 读取失败与 DPAPI 解密失败)。
2. GetSerialization 里的 ulAuthenticationPackage:Negotiate 认证包 ID 通过 LsaLookupAuthenticationPackage 查询,失败时代码会 unwrap_or(0) 退回 0,这会导致 LSA 直接拒绝凭据。怀疑时在 provider 里把该 ID 打到日志确认非 0。
3. 域账户时 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。