《Windows Internals》10.1.6 HKEY_USERS:为什么它才是真正的“已加载用户配置大本营”?
个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化《Windows Internals》10.1.6 HKEY_USERS为什么它才是真正的“已加载用户配置大本营”《Windows Internals》10.1.6 HKEY_USERS为什么它才是真正的“已加载用户配置大本营”1. 先说结论HKCU 是入口HKU 才是仓库2. HKEY_USERS 到底是什么它比名字看起来更重要2.1 loaded user profile2.2 user class registration database3. 为什么我说 HKU 才是真正的“已加载用户配置大本营”3.1 它能看到“全部已加载用户”3.2 它直接按 SID 组织3.3 它能把“当前用户”和“非当前用户”放在同一张地图上4. HKU.DEFAULT 到底是什么它不是“新用户默认模板”那么简单4.1 这句话意味着什么4.2 那新用户初始配置从哪来5. 用户配置到底存在哪HKU、ProfileList、Ntuser.dat 三者怎么连起来6. HKU 和 HKCU 到底是什么关系一句话讲透6.1 HKU 是总表6.2 HKCU 是当前视图7. 服务账户为什么也会出现在 HKU 下面这正说明 HKU 不是只给“普通用户”准备的7.1 这说明什么8. 书里那个 Runas 实验为什么特别有价值因为它能直接看到 HKU 的“动态变化”8.1 这个实验为什么重要8.2 这对桌面支持有什么价值9. 从桌面支持角度看HKU 最有实战价值的 4 个场景9.1 同机不同用户问题只影响某一个人9.2 分析“用户配置损坏”到底损坏在哪一层9.3 分析服务账户相关问题9.4 登录界面异常、背景异常10. 最容易搞混的 5 个点我帮你一次理顺10.1 HKU 不是“系统里所有历史用户”10.2 HKU.DEFAULT 不是“未来所有用户默认配置”10.3 HKCU 不是独立于 HKU 的另一套数据10.4 用户配置不是只存在注册表里10.5 服务账户也属于“用户配置体系”11. 我的学习理解HKU 真正让人建立的是“配置加载”视角而不只是“路径记忆”12. 总结提升下一篇预告《Windows Internals》10.1.6 HKEY_USERS为什么它才是真正的“已加载用户配置大本营”学注册表的时候很多人会先认识HKCU因为它最贴近“当前用户”。但如果继续往下学我会发现一个更关键的事实真正承载“所有已加载用户配置”的地方不是 HKCU而是 HKEY_USERSHKU。《Windows Internals》这一节写得非常直接HKU 包含系统上每一个已加载用户配置文件loaded user profile以及用户类注册数据库的子键它还包含一个特殊子键HKU\.DEFAULT这个子键链接到system 的 profile例如Winlogon就会使用它所以改这里的桌面背景甚至会影响登录界面。书里还继续说明系统的 profile 存储根位置默认由HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\ProfilesDirectory定义通常是%SystemDrive%\UsersProfileList会按SID记录系统已有 profile并保存最后加载时间、SID 二进制值以及对应Ntuser.dat的磁盘路径。所以这篇文章我就专门把10.1.6 HKEY_USERS讲透为什么我说它不是“一个冷门根键”而是 Windows 用户配置体系里真正的大本营。1. 先说结论HKCU 是入口HKU 才是仓库如果只用一句话总结这节内容我会这样说HKCU 更像“当前用户快捷入口”HKU 才是“所有已加载用户配置的总仓库”。前一篇我已经讲过HKCU 本质上是当前上下文下映射到HKEY_USERS中当前 SID 那一支的逻辑入口。书里也明确说当某个用户 profile 被加载时HKCU 会被创建出来并映射到 HKEY_USERS 下该用户对应的键。这就意味着想看“当前用户”配置HKCU 很方便想看“系统里到底加载了哪些用户配置”就得看 HKU想理解多用户、多服务账户、Winlogon、ProfileList、Ntuser.dat 的关系也必须回到 HKU 这层所以从学习路径上说注册表用户配置体系HKCU 当前用户入口HKU 已加载用户配置总仓当前上下文视图所有已加载 SID 分支普通用户服务账户.DEFAULT / System Profile2. HKEY_USERS 到底是什么它比名字看起来更重要《Windows Internals》原文对 HKU 的定义非常清楚HKU contains a subkey for each loaded user profile and user class registration database on the system.翻成更容易理解的话就是只要某份用户配置已经被系统加载进来HKU 下面就会出现对应的那一支。这里有两个关键词特别重要2.1 loaded user profile不是“系统里存在过的所有用户”而是已经被加载的 profile。这个“加载”可能发生在用户正常登录桌面某服务以特定用户名上下文运行使用Runas启动了一个当前未登录账户下的进程这也是为什么 HKU 的内容不是一成不变的而是会随着上下文动态变化。2.2 user class registration database这句话说明 HKU 下面不只是“用户偏好”还和用户级类注册数据库有关。这一点后面和Usrclass.dat、HKCU\Software\Classes、HKCR的关系会串起来。书里在 HKCR 那一节明确说过用户级类注册数据来自HKCU\Software\Classes它映射到磁盘上的Usrclass.dat。也就是说HKU 不只是“桌面设置集合”它实际上承载的是用户 profile 注册表数据用户级类注册数据与用户上下文相关的系统行为配置3. 为什么我说 HKU 才是真正的“已加载用户配置大本营”因为它具备三个 HKCU 不具备的视角。3.1 它能看到“全部已加载用户”HKCU 只能代表“当前这一个”。但 HKU 能把系统当前已经加载进来的用户 profile 全部摊开来看。这对理解多用户场景特别关键本机同时登录多个用户某个账户未打开桌面但被服务或 Runas 间接加载服务账户 profile 被加载进来Winlogon 正在使用 system profile这些在 HKCU 里看不全但在 HKU 里能看到整体。3.2 它直接按 SID 组织书里明确说ProfileList里的每个 profile 对应子键都是按SID命名的而 HKU 下每份用户配置本质上也是以 SID 为核心标识。这意味着 Windows 底层识别“谁是谁”不是按用户名字符串而是按 SID。所以 HKU 更接近系统真实的用户配置组织方式。3.3 它能把“当前用户”和“非当前用户”放在同一张地图上这点很重要。你平时看 HKCU只能看到“我现在这个上下文”。但一旦切到 HKU你会看到当前用户 SID其他已加载用户 SID服务账户 SID.DEFAULT某些_Classes分支也就是说HKU 更像全局总览HKCU 更像单点快捷方式。4. HKU.DEFAULT 到底是什么它不是“新用户默认模板”那么简单这是很多人最容易误解的地方。书里写得非常明确HKU 下面有一个叫.DEFAULT的子键它链接到system 的 profile这个 profile 会被running under the local system account的进程使用Winlogon就会使用它所以改这里的桌面背景会影响登录界面。4.1 这句话意味着什么它意味着HKU\.DEFAULT在这一节的语境里重点不是“新建用户默认配置模板”而是当前系统账户Local System正在使用的那份 profile 入口。所以很多人以为.DEFAULT “以后所有新用户都会继承这里”这个理解至少在这节内容里并不准确。书在这里强调的重点其实是它和system profile有关它和Winlogon有关它会影响登录屏幕的表现。4.2 那新用户初始配置从哪来书里也紧接着给了答案当一个用户第一次登录系统且不依赖 roaming domain profile系统会基于%SystemDrive%\Users\Default存放的 profile 来创建她的 profile。所以要分清两件事HKU\.DEFAULTsystem profile / Winlogon 用的%SystemDrive%\Users\Default首次创建新用户配置时的基础模板来源。这两个“Default”长得像但语义完全不是一回事。5. 用户配置到底存在哪HKU、ProfileList、Ntuser.dat 三者怎么连起来这一段特别值得彻底吃透。书里给出了非常完整的链路系统默认把 profile 存在%SystemDrive%\Users这个根位置由HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\ProfilesDirectory定义ProfileList保存系统里已经存在的 profile 列表每个 profile 对应一个以SID命名的子键子键里会保存最近一次加载时间LocalProfileLoadTimeLow账户 SID 的二进制值Sid磁盘上的 profile 路径ProfileImagePath对应的 hive 文件也就是Ntuser.dat的路径信息。我把它整理成一张图渲染错误:Mermaid 渲染失败: Lexical error on line 4. Unrecognized text. ... D[\Users\ ]D -- E[Ntuser.dat -----------------------^这张图的核心含义就是磁盘上的用户配置文件、注册表里的 SID 分支、当前上下文下的 HKCU其实是同一条链路上的不同层。6. HKU 和 HKCU 到底是什么关系一句话讲透前面几篇已经讲了不少这里我再用最直接的方式概括一次6.1 HKU 是总表它存放所有已加载用户 profile服务账户 profile.DEFAULT用户级类注册相关分支6.2 HKCU 是当前视图它只是当前上下文下指向 HKU 中“当前 SID 那一支”的快捷入口。所以可以这么理解维度HKCUHKU视角当前用户所有已加载用户用途快速访问当前用户配置观察全局用户配置加载情况组织方式当前上下文映射按 SID 分支组织是否能看全局不能可以这也是为什么我会说HKCU 是“当前用户窗口”HKU 是“后台总机房”。7. 服务账户为什么也会出现在 HKU 下面这正说明 HKU 不是只给“普通用户”准备的这一点特别能说明 HKU 的“系统级价值”。在服务这一部分书里提到Network Service账户的 profile 会加载到HKU\S-1-5-20它对应的文件和目录位于%SystemRoot%\ServiceProfiles\NetworkServiceLocal Service账户的 profile 会加载到HKU\S-1-5-19它对应的文件和目录位于%SystemRoot%\ServiceProfiles\LocalService。7.1 这说明什么说明 HKU 不只是“桌面用户配置集合”它其实是所有已被系统加载的用户/服务身份配置的大集合。换句话说普通用户有自己的 HKU服务账户也有自己的 HKULocal System 还会通过.DEFAULT这类入口参与其中这一下就把 HKU 的定位拉高了它不是某个普通用户能不能看到壁纸那么简单而是 Windows 身份上下文和配置加载机制的一部分。8. 书里那个 Runas 实验为什么特别有价值因为它能直接看到 HKU 的“动态变化”《Windows Internals》给了一个非常经典的实验用Runas启动一个当前没有登录到机器上的账户下的进程进程运行时打开 Regedit观察HKEY_USERS下加载出来的新 profile key结束该进程后在 Regedit 里按F5刷新这个 profile key 应该就不再存在了。8.1 这个实验为什么重要因为它能一眼证明HKU 下面的内容不是静态死数据某个 profile 是否存在于 HKU取决于它当前是否被加载用户没真正登录桌面也可能因为某个进程上下文而触发 profile 加载。8.2 这对桌面支持有什么价值非常大。它能帮助我更准确地理解这类问题某服务为什么会读到一个“没登录用户”的配置某程序用Runas后为什么行为变化了某个 HKU 分支为什么一会儿有、一会儿没为什么“当前没人在桌面登录”系统里仍然会出现某些用户 profile 分支这就是系统机制视角和表面现象视角的区别。9. 从桌面支持角度看HKU 最有实战价值的 4 个场景这一部分最贴近工作。9.1 同机不同用户问题只影响某一个人比如某用户 Outlook 异常另一个用户正常某用户打印机连接丢失别人没问题某用户登录后桌面异常换个账号就好这类问题只看 HKCU 很容易局限在当前人切到 HKU我就能更直接对照不同 SID 的配置差异。9.2 分析“用户配置损坏”到底损坏在哪一层如果新用户正常旧用户持续异常某个用户软件偏好怎么都不对那就要联想到这条链ProfileListProfileImagePathNtuser.datHKU\SID当前上下文下的HKCU这比一上来“重装系统”要专业得多。9.3 分析服务账户相关问题很多人排障时只盯普通用户账户但实际上Network ServiceLocal ServiceLocal System也都和 profile、注册表分支有关。书里已经明确指出 Local Service 和 Network Service 的 profile 会分别加载到 HKU 对应 SID 下。所以某些服务行为异常根因未必在 HKLM也可能在它自己的 HKU 分支。9.4 登录界面异常、背景异常这一类问题很容易被忽略。因为书里专门提到Winlogon 使用的是 HKU.DEFAULT 对应的 system profile所以这里的桌面背景设置会反映到登录屏幕。也就是说登录界面问题不一定是“桌面用户的 HKCU”问题也可能是 HKU.DEFAULT 这层问题。10. 最容易搞混的 5 个点我帮你一次理顺10.1 HKU 不是“系统里所有历史用户”更准确地说它是系统里当前已加载的用户 profile 集合。10.2 HKU.DEFAULT 不是“未来所有用户默认配置”在本节语境里它重点指向system profile / Winlogon 使用的 profile。10.3 HKCU 不是独立于 HKU 的另一套数据HKCU 本质上是当前上下文下映射到 HKU 中当前 SID 那一支的快捷入口。10.4 用户配置不是只存在注册表里它既有注册表层面的HKU\SID也有磁盘层面的Ntuser.dat再加上ProfileList中的元信息。10.5 服务账户也属于“用户配置体系”不要只盯普通登录用户。服务账户的 profile 同样会被加载到 HKU 下。11. 我的学习理解HKU 真正让人建立的是“配置加载”视角而不只是“路径记忆”我觉得 10.1.6 这一节真正厉害的地方不在于它告诉我 HKU 下面有哪些分支而在于它让我从“背路径”升级到了“理解加载机制”。以前我可能只会记HKCU 是当前用户HKLM 是本机HKU 好像不太常用但学到这里之后我会意识到如果我要理解 Windows 是怎么把不同身份的配置装进系统里的HKU 才是最关键的观察窗口。因为它能把这些东西放到同一个框架里当前登录用户其他已加载用户服务账户system profileSIDNtuser.datProfileListRunas 触发的动态加载。这套视角一建立后面你再看用户配置损坏临时配置文件服务账户行为差异per-user 类注册UAC 虚拟化与用户视图就会明显顺很多。12. 总结提升如果让我用一句话总结10.1.6 HKEY_USERS我会这样说HKEY_USERS 不是一个可有可无的冷门根键而是 Windows 把所有“当前已加载的用户身份配置”统一组织起来的核心入口HKCU 只是从这里切出当前上下文那一份给你看。这篇最值得记住的 7 个结论是HKU 包含系统上每一个已加载用户 profile 和用户类注册数据库的子键。HKU.DEFAULT 链接到 system profileWinlogon 会使用它。新用户首次登录时profile 会基于%SystemDrive%\Users\Default创建。ProfileList 默认位于HKLM\...\ProfileList并按 SID 记录已有 profile。每个 profile 的信息包括最后加载时间、SID 二进制值、以及Ntuser.dat的路径。Runas 实验能直接看到 HKU 中 profile 的加载与卸载。服务账户 profile 也会加载进 HKU例如 Local Service 和 Network Service。学完这一节后后面你再继续看10.1.7 HKEY_CLASSES_ROOTUsrclass.datHKCU\Software\Classes服务账户 profileProfileList 与临时配置文件问题会更顺因为你已经把“用户配置总仓库”这层看明白了。下一篇预告《Windows Internals》10.1.7 HKEY_CLASSES_ROOT为什么它看起来像文件关联根目录其实本质是用户级与系统级 Classes 的合并视图这一篇会和文件关联COM 注册HKCU\Software\ClassesHKLM\Software\ClassesUsrclass.dat全部串起来实战价值很高。返回顶部