我似乎找不到任何明确的依据,因为有些资料说:
HKLM\SOFTWARE\Classes
如果和中都存在一个条目HKCU\SOFTWARE\Classes
,则 中的条目的值HKCU\SOFTWARE\Classes
优先。
但是,我无法判断这条规则是否适用于系统策略;具体来说,我关心的是DisableLockWorkstation
:
HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System
如果两者存在且相互冲突,那么哪一个应该优先,并且是否存在一般规则?
答案1
引自维基百科 Windows 注册表:
HKEY_LOCAL_MACHINE(本地计算机特定配置数据)和 HKEY_CURRENT_USER(用户特定配置数据)节点具有相似的结构;用户应用程序通常首先在“HKEY_CURRENT_USER\Software\Vendor's name\Application's name\Version\Setting name”中查找其设置,如果未找到该设置,则在 HKEY_LOCAL_MACHINE 键下的同一位置查找。
但是,对于管理员强制执行的策略设置,情况可能相反,在这种情况下,HKLM 可能优先于 HKCU。Windows 徽标计划对存储不同类型用户数据的位置有具体要求,并且必须遵循最小特权的概念,以便使用应用程序时不需要管理员级别的访问权限。
不幸的是,我认为这个问题没有明确的答案,所以一切都取决于所讨论的程序。
看起来用户应用程序会优先使用 HKCU,而对于非用户特定的策略,Windows 会优先使用 HKLM。然而,规则并不是一成不变的,可能存在大量例外情况。
Windows 徽标计划的维基百科链接已过期,但我设法找到了 针对 Windows XP 应用程序规范设计 (存档文章),涉及上述“Windows 徽标计划”,其中包含以下规则,这些规则总体上支持上述内容:
使用注册表
应用程序还可以使用注册表来存储读/写应用程序数据和配置文件。
- HKCU 注册表配置单元适合存储少量数据(约 64K)以及针对每个用户的策略设置。
- 避免在运行时写入 HKLM,因为受限用户默认对整个 HKLM 树具有只读访问权限。此外,HKLM 不支持漫游。
- 较大的基于文件的数据应放置在应用程序数据文件夹中。例如,Internet Explorer 的临时 Internet 缓存存储在用户配置文件中,而不是注册表中。
- 在安装时,应用程序在 HKCU 和 HKLM 上存储的总空间不得超过 128K。请注意,HKEY_CLASSES_ROOT 不包含在内。
这是我能找到的最早的关于使用注册表的指南文档。我不知道这些指南的执行情况如何,也不知道现在的执行情况如何。
答案2
这里没有铁律。优先级完全取决于程序员的决定,因此不同系统之间会有所不同,有时甚至同一开发人员的不同程序之间也会有所不同。
根据经验,应用程序更喜欢 HKCU,因为它更具体。如果用户有具体设置,那么它可能比一般设置更适合他,这是合乎逻辑的。但是,例如。\Run 条目首先从 HKLM 读取,并且许多策略优先考虑 HKLM 设置而不是 HKCU。
考虑到这DisableLockWorkstation
是一项政策,我认为在这种情况下 HKLM 将优先。但除了在实际系统上进行测试外,没有其他方法可以判断。