为什么注册表写在不同的位置比预期?(Why is registry written in diffe

2019-06-25 07:26发布

我试着写一个注册表子项及其相应的值注册表如下:

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

现在的问题是,我当我手动查找的位置(通过注册表编辑器),我不能看到该文件夹SOFTWARE\Apple\BananaHKLM

但是当我再次运行上面的代码和调试,我可以看到,无论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没有意义:(

Answer 1:

是的,这是正确的行为,它正在发生,因为你没有足够的权限来直接写入到HKLM蜂巢。 这就是所谓的虚拟化和文件系统同样会发生,它已经在自Vista中的OS行为。

您应该继续为你和还从你正在写相同的HKLM键读取尝试,Windows将透明地重定向为您服务。

普里特已经慷慨地提供一个MSDN链接,你应该仔细阅读。

请注意,当您在HKLM下访问键,你还应该包括你想要的权限,即使你以管理员身份运行(因为关键是不能自动拥有管理员权限打开,你有权要求它):

key = key.OpenSubKey(keyname, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);


Answer 2:

  1. 这是注册表虚拟化(MSDN)

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

    虚拟化概述

    在Windows Vista之前,应用程序通常是由系统管理员运行。 其结果是,应用程序可以自由访问系统文件和注册表项。 如果这些应用程序是由一个标准用户运行,他们会失败由于没有足够的访问权限。 Windows Vista和更高版本的Windows自动重定向这些操作提高这些应用程序兼容性。 例如,注册表操作,以全局存储(HKEY_LOCAL_MACHINE \ SOFTWARE)将被重定向到每个用户的位置被称为虚拟商店(HKEY_USERS \ _Classes \ VirtualStore \计算机\软件)用户的配置文件中。

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

  3. 无论是与虚拟化,如果你想要写在全球范围内影响的位置,或者使用更本地化的位置,如果你不想让它活。 无论哪种方式,它是无形的读者,所以不用担心。



文章来源: Why is registry written in different location than expected?