《Windows Internals》10.1.6 HKEY_USERS:为什么它才是真正的“已加载用户配置大本营”?
《Windows Internals》10.1.6 HKEY_USERS:为什么它才是真正的“已加载用户配置大本营”?
- 《Windows Internals》10.1.6 HKEY_USERS:为什么它才是真正的“已加载用户配置大本营”?
- 1. 先说结论:HKCU 是入口,HKU 才是仓库
- 2. HKEY_USERS 到底是什么?它比名字看起来更重要
- 2.1 loaded user profile
- 2.2 user class registration database
- 3. 为什么我说 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_USERS(HKU)。
《Windows Internals》这一节写得非常直接:HKU 包含系统上每一个已加载用户配置文件(loaded user profile)以及用户类注册数据库的子键;它还包含一个特殊子键HKU\.DEFAULT,这个子键链接到system 的 profile,例如Winlogon就会使用它,所以改这里的桌面背景甚至会影响登录界面。书里还继续说明:系统的 profile 存储根位置默认由HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\ProfilesDirectory定义,通常是%SystemDrive%\Users;ProfileList会按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 这层
所以从学习路径上说:
2. 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\.DEFAULT:system 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的路径信息。
- 最近一次加载时间
我把它整理成一张图:
这张图的核心含义就是:
磁盘上的用户配置文件、注册表里的 SID 分支、当前上下文下的 HKCU,其实是同一条链路上的不同层。
6. HKU 和 HKCU 到底是什么关系?一句话讲透
前面几篇已经讲了不少,这里我再用最直接的方式概括一次:
6.1 HKU 是总表
它存放:
- 所有已加载用户 profile
- 服务账户 profile
.DEFAULT- 用户级类注册相关分支
6.2 HKCU 是当前视图
它只是:
- 当前上下文下
- 指向 HKU 中“当前 SID 那一支”的快捷入口。
所以可以这么理解:
| 维度 | HKCU | HKU |
|---|---|---|
| 视角 | 当前用户 | 所有已加载用户 |
| 用途 | 快速访问当前用户配置 | 观察全局用户配置加载情况 |
| 组织方式 | 当前上下文映射 | 按 SID 分支组织 |
| 是否能看全局 | 不能 | 可以 |
这也是为什么我会说:
HKCU 是“当前用户窗口”,HKU 是“后台总机房”。
7. 服务账户为什么也会出现在 HKU 下面?这正说明 HKU 不是只给“普通用户”准备的
这一点特别能说明 HKU 的“系统级价值”。
在服务这一部分,书里提到:
- Network Service账户的 profile 会加载到
HKU\S-1-5-20 - 它对应的文件和目录位于
%SystemRoot%\ServiceProfiles\NetworkService - Local Service账户的 profile 会加载到
HKU\S-1-5-19 - 它对应的文件和目录位于
%SystemRoot%\ServiceProfiles\LocalService。
7.1 这说明什么?
说明 HKU 不只是“桌面用户配置集合”,它其实是:
所有已被系统加载的用户/服务身份配置的大集合。
换句话说:
- 普通用户有自己的 HKU
- 服务账户也有自己的 HKU
- Local 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 Service
- Local Service
- Local 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 profile
- SID
Ntuser.datProfileList- Runas 触发的动态加载。
这套视角一建立,后面你再看:
- 用户配置损坏
- 临时配置文件
- 服务账户行为差异
- per-user 类注册
- UAC 虚拟化与用户视图
就会明显顺很多。
12. 总结提升
如果让我用一句话总结10.1.6 HKEY_USERS,我会这样说:
HKEY_USERS 不是一个可有可无的冷门根键,而是 Windows 把所有“当前已加载的用户身份配置”统一组织起来的核心入口;HKCU 只是从这里切出当前上下文那一份给你看。
这篇最值得记住的 7 个结论是:
- HKU 包含系统上每一个已加载用户 profile 和用户类注册数据库的子键。
- HKU.DEFAULT 链接到 system profile,Winlogon 会使用它。
- 新用户首次登录时,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_ROOT
- Usrclass.dat
- HKCU\Software\Classes
- 服务账户 profile
- ProfileList 与临时配置文件问题
会更顺,因为你已经把“用户配置总仓库”这层看明白了。
下一篇预告
《Windows Internals》10.1.7 HKEY_CLASSES_ROOT:为什么它看起来像文件关联根目录,其实本质是用户级与系统级 Classes 的合并视图?
这一篇会和:
- 文件关联
- COM 注册
HKCU\Software\ClassesHKLM\Software\ClassesUsrclass.dat
全部串起来,实战价值很高。
返回顶部
