无法访问\ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run

时间:2018-04-03 12:53:12

标签: c#

我使用System.Win32编写注册表代码:

RegistryKey startup = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);
startup.SetValue("hi", "Test");

但是当我打开注册表编辑器时,我不会在\SOFTWARE\Microsoft\Windows\CurrentVersion\Run中写,而是在Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run中写入密钥

1 个答案:

答案 0 :(得分:1)

无论你写的是什么密钥。问题是你要么

  • 尝试从32位应用程序写入64位密钥

  • 尝试从64位应用程序写入32位密钥

你可以做2种方式

    .LI及以上版本中的
  • RegistryView.Registry64 / RegistryView.Registry32OpenBaseKey
  • RegOpenKeyEx在早期版本中使用Advapi32.dll / KEY_WOW64_64KEY标记KEY_WOW64_32KEY进行Api调用
  

RegistryView枚举:在64位版本的Windows上,存储了部分注册表   分别用于32位和64位应用程序。有一个32位的视图   对于32位应用程序和64位应用程序的64位视图。

     

您可以在使用OpenBaseKey时指定注册表视图   OpenRemoteBaseKey(RegistryHive,String,RegistryView)方法,以及   RegistryKey对象上的FromHandle属性。

代码使用Registry64

var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
//var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
if (baseKey != null)
{
    var subKey = baseKey.OpenSubKey("myKey", 
                         RegistryKeyPermissionCheck.ReadWriteSubTree, 
                         RegistryRights.FullControl);

    if (subKey != null)
    {
        subKey.SetValue("hi", "Test");
        subKey.Close();
    }

    baseKey.Close();
}
可以在此处找到使用RegOpenKeyExKEY_WOW64_64KEY

PInvoke

PInvoke RegOpenKeyEx (advapi32)

其他资源

RegistryKey.OpenBaseKey Method (RegistryHive, RegistryView)

RegistryKey.OpenSubKey Method (String, RegistryKeyPermissionCheck, RegistryRights)

RegistryView Enumeration

Registry Key Security and Access Rights

32-bit and 64-bit Application Data in the Registry