2016-08-23 157 views
0

我正在尝试做一些注册表编辑。下面的代码是我的问题的一个MCVE:C#编辑注册表不起作用

 RegistryKey key; 
     key = Registry.LocalMachine.OpenSubKey("DRIVERS", true); 
     key = key.CreateSubKey("Names"); 
     key.SetValue("Name", "nick", RegistryValueKind.String); 
     key.Close(); 

该代码工作正常。下面(改变DRIVERSSOFTWARE)不:

 RegistryKey key; 
     key = Registry.LocalMachine.OpenSubKey("SOFTWARE", true); 
     key = key.CreateSubKey("Names"); 
     key.SetValue("Name", "nick", RegistryValueKind.String); 
     key.Close(); 

对我来说,代码的两个块之间的差别是微不足道的。这个问题的原因是什么,我该如何解决这个问题?我已经以管理员身份运行代码。

我的最终目标是修改“SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon”文件夹中的值。

我知道这是可能的从Powershell - 它应该可能从C#以及。

+1

尝试写入您实际要写入的密钥。我怀疑是否有可能污染HKLM的根源。 – Blorgbeard

+0

@Blorgbeard我试过了。这是行不通的。我用我想要写入的密钥进行编辑。它是SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon。 – nhouser9

+1

你肯定会混淆两个不同的问题。写入该密钥*实际*要写入[需要UAC提升](http://stackoverflow.com/questions/2818179/how-do-i-force-my-net-application-to-run-as-管理员)*和*运行程序[作为64位进程](http://stackoverflow.com/a/2843835/17034)。 –

回答

1

您可以从32位进程写入64位注册表,但需要按照以下方式明确请求64位注册表(在Q中的代码中进行了修改)。

var hklm = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); 
RegistryKey key = hklm.OpenSubKey("SOFTWARE", true); 
key = key.CreateSubKey("Names"); 
key.SetValue("Name", "nick", RegistryValueKind.String); 
key.Close();