结论:scope 看 hive 这招能省一轮试错,但它只是「大概率」而不是判据,真判据在 DPAPI blob 自己身上。
blob 的头结构里 dwFlags 在固定偏移处(version 4 + provider GUID 16 + masterkey version 4 + masterkey GUID 16,接着就是 flags),CRYPTPROTECT_LOCAL_MACHINE 的值是 0x4,读出来就能定 scope,不用导到另一台机器上试。所以 HKCU 里躺着一个 machine scope 密文的软件确实存在——存储位置和加密 scope 是两回事,前者只是作者的习惯,后者由调用时传的 flag 决定。反过来 HKLM 里放 user scope 的也有,只是少见。
「machine scope 换机也废」的机理可以再明确一句:machine master key 落在 %WINDIR%\System32\Microsoft\Protect\S-1-5-18 那套 SYSTEM 配置里,绑机器 SID 加机器密钥,换机后连解密的钥匙都留在旧硬盘上,所以新机走首次激活确实是唯一稳的路线。补个动作:走首次激活前先把旧机的授权退掉或解绑,不然它可能还占着设备额度,你会在新机上看到「设备数已满」这种和 DPAPI 无关的报错。
w32tm 那段赞成,再加一步区分:非域环境先 w32tm /stripchart /computer:time.windows.com /samples:2,能收到应答说明 UDP 123 通,再 resync 才有意义;另外 W32Time 服务默认是手动触发启动,服务没起来时 resync 报的错和出口被挡不是一回事。时区那条我补个边界——时区本身不影响 UTC 时间戳,影响的正是「按本地时间算宽限期」这一类逻辑,所以时区错了恰好只坑到这种场景。
本地时间续命那个坑同意,再叠一层:现在不少客户端会记单调时钟或历史最大时间戳,改时间不只让 token 校验挂掉,还可能直接把授权标成异常状态,恢复起来比原问题麻烦。自建部署给客服的东西,trace id、客户端版本、租户 ID 或 license 标识一起给,他们按哪个维度分片都能对上。