C#:无法在Windows注册表中看到更改

时间:2017-07-17 20:27:59

标签: c# regedit

没有错误,没有例外,没有任何错误。一切似乎都没问题,除了注册表保持不变。

   class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Edit();
            }
            catch (Exception)
            {
                Restore(); // not included in the sample for simplicity
            }
        }

        public static void  Edit()
        {
            Microsoft.Win32.RegistryKey Login;
            Login = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(ConfigurationManager.AppSettings["Login"].ToString());
            Login.SetValue("ServerName", ConfigurationManager.AppSettings["ServerName"].ToString());
            Login.SetValue("ImageServerName", ConfigurationManager.AppSettings["ImageServerName"].ToString());
            Login.Close();

            Microsoft.Win32.RegistryKey Login2;
            Login2 = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(ConfigurationManager.AppSettings["Wow6432NodeLogin"].ToString());
            Login2.SetValue("ServerName", ConfigurationManager.AppSettings["Wow6432NodeServerName"].ToString());
            Login2.SetValue("ImageServerName", ConfigurationManager.AppSettings["Wow6432NodeImageServerName"].ToString());
            Login2.Close();
        }
}

我认为某处出现了错误。但是没有例外。捕获块永远不会被击中。

我以管理员身份运行它。我甚至没有管理员权限运行它,但是当它应该显示"访问被拒绝时仍然没有错误"或者其他的东西。我重新启动笔记本电脑以查看应用的更改,但仍然没有成功。

我使用此代码读取最近添加的值,我可以看到键。但不知何故,这些变化并未得到应用。

        Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(ConfigurationManager.AppSettings["Login"].ToString());
        Object o = key.GetValue("ServerName");
        Console.WriteLine(o.ToString());

我正在使用.Net 4.5.2,为任何CPU构建,SO:Windows 7.

我是否需要提交更改或其他内容?

1 个答案:

答案 0 :(得分:2)

正如@PieterWitvoet在评论中所建议的那样,您可能希望使用OpenBaseKey()。这是为了避免WoW64注册表重定向,如下所述:https://msdn.microsoft.com/en-us/library/windows/desktop/aa384182.aspx

请注意该页末尾的小字:

  

要检查使用regedit运行此示例的效果,请检查以下键的值。请注意,应用程序应避免在硬编码的注册表路径中使用Wow6432Node。

所以,这里有一个你可以做的事情的例子:

static void Edit()
{
    using (var root = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
    using (RegistryKey key = root.CreateSubKey("SOFTWARE\\Homebrew-Testing"))
    {
        key.SetValue("ServerName", "ServerName-Value");
        key.SetValue("ImageServerName", "ImageServerName-Value");
    }
}

请注意您如何放弃代码的第二部分,专门处理Wow6432Node,这在上面链接的文章中是推荐的。

RegistryView的文档指出,如果在32位操作系统上请求64位视图,则返回的键将位于32位视图中。

我希望这会有所帮助。祝你好运。