11

我尝试将注册表子项及其对应的值写入注册表,如下所示:

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();

现在的问题是,当我手动(通过 regedit)查看该位置时,我看不到SOFTWARE\Apple\Banana.HKLM

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

  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 是没有意义的 :(

4

2 回答 2

6

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

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

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

Note that when you access a key under HKLM you should also include the permissions you want, even if you are running as administrator (because the key is not automatically opened with admin rights, you have to request it):

key = key.OpenSubKey(keyname, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);
于 2012-06-07T23:44:33.187 回答
5
  1. 这是注册表虚拟化 (msdn)

    注册表虚拟化是一种应用程序兼容性技术,可以将具有全球影响的注册表写入操作重定向到每个用户的位置。这种重定向对于从注册表读取或写入注册表的应用程序是透明的。从 Windows Vista 开始支持它。

    虚拟化概述

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

  2. 是的,这正是它应该的样子。

  3. 如果您想写入影响全局的位置,则可以使用虚拟化,或者如果您不想要它,请使用更多本地化的位置。无论哪种方式,它对读者都是不可见的,所以不用担心。

于 2012-06-07T23:44:29.050 回答