为什么注册表写入的位置与预期不同

本文关键字:位置 注册表 为什么 | 更新日期: 2023-09-27 18:36:42

我试图像这样将注册表子项及其相应的值写入注册表:

const string subKey = @"SOFTWARE'Apple'Banana'";
const string regKey = "pip";
var rk = Registry.LocalMachine.OpenSubKey(subKey);
if (rk == null)
    rk = Registry.LocalMachine.CreateSubKey(subKey);
var rv = rk.GetValue(regKey);
if (rv == null)
    rk.SetValue(regKey, "XXX");
return rv.ToString();

现在的问题是,当我手动(通过注册表编辑器)查看该位置时,我看不到HKLM中的文件夹SOFTWARE'Apple'Banana

但是当我再次运行上面的代码并进行调试时,我可以看到 Registry.LocalMachine.OpenSubKey(subKey)rk.GetValue(regKey) 都产生了之前保存的值。然而,我没有通过注册表编辑器看到给定位置的值。因此,在搜索注册表时,我可以在以下位置看到上述键和值:

  1. HKEY_CURRENT_USER'Software'Classes'VirtualStore'MACHINE'SOFTWARE'Apple'Banana

  2. HKEY_USERS'S-1-5-21-44266131-1313801407-2392705078-1000'Software'Classes'VirtualStore'MACHINE'SOFTWARE'Apple'Banana

在两者下,值与我保存的值完全相同。所以我意识到这是我的应用程序从哪里读取值,尽管在我的代码中我从HKLM'SOFTWARE'Apple'Banana'调用它。

  1. 为什么会这样?是否与访问权限问题有关?

  2. 这是预期行为吗?从某种意义上说,这个值对我来说非常重要,所以我只知道是否存在与自动重定位相关的风险!

  3. 是否有一种正确的方法写入注册表,以便它保留在其确切位置..

我的帐户是管理员一,我使用的是 32 位 Windows 7。

编辑:据我所知,注册表项存储在当前用户位置而不是HKLM。当我从其他帐户查询 reg 值时,我没有得到该值。简而言之,首先将其保存到HKLM没有意义:(

为什么注册表写入的位置与预期不同

是的,这是正确的行为,发生这种情况是因为您没有足够的权限直接写入 HKLM 配置单元。它被称为虚拟化,也发生在文件系统上,自 Vista 以来,它一直是操作系统中的一种行为。

您应该继续按原样,并尝试从您正在写入的同一 HKLM 密钥中读取,Windows 将透明地为您重定向。

Preet提供了一个MSDN链接,您应该仔细阅读。

请注意,当您在 HKLM 下访问密钥时,即使您以管理员身份运行,您也应该包含所需的权限(因为密钥不会以管理员权限自动打开,因此您必须请求它):

key = key.OpenSubKey(keyname, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);
  1. 这是注册表虚拟化 (msdn)

    注册表虚拟化是一种应用程序兼容性技术 使具有全局影响的注册表写入操作 已重定向到每用户位置。此重定向对 从注册表读取或写入注册表的应用程序。它被支持 从Windows Vista开始。

    虚拟化概述

    在Windows Vista之前,应用程序是 通常由管理员运行。因此,应用程序可以 自由访问系统文件和注册表项。如果这些应用程序 由标准用户运行,它们会因不足而失败 访问权限。Windows Vista 和更高版本的 Windows 改进 这些应用程序的应用程序兼容性自动 重定向这些操作。例如,注册表操作到 全局存储 (HKEY_LOCAL_MACHINE''软件) 被重定向到 用户配置文件中称为虚拟商店的每用户位置 (HKEY_USERS''_Classes''VirtualStore''Machine''Software)。

  2. 的,它完全是应该的。

  3. 如果要
  4. 写入影响全局的位置,请使用虚拟化,或者如果不需要,请使用更本地化的位置。无论哪种方式,读者都看不见,所以不用担心。