64位注册表项未由32位应用程序更新

meh*_*kit 2 c#

注册表项未在C#中提到的路径更新

string path = @"Software\Microsoft\Windows NT\CurrentVersion\Windows\"; 
RegistryKey myKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(path, true);
myKey.SetValue("USERProcessHandleQuota", 50000, RegistryValueKind.DWord); 
myKey.Close();
Run Code Online (Sandbox Code Playgroud)

而不是在下面的路径更新给定的路径值: -

@"Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\";
Run Code Online (Sandbox Code Playgroud)

我的机器是64位,我运行的应用程序是32位.

请建议如何更新,即在上述路径地址的值Software\Microsoft,而不是Software\wow6432node.

AAA*_*ddd 5

你可以这两种方式做到这一点

  • RegistryView.Registry64以及OpenBaseKey.Net 4及以上版本
  • RegOpenKeyExApi 在早期版本中调用Advapi32.dllKEY_WOW64_64KEY标志

RegistryView枚举:在64位版本的Windows上,部分注册表分别存储在32位和64位应用程序中.32位应用程序有32位视图,64位应用程序有64位视图.

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

使用Registry64的代码

using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
{
   using (var subKey = baseKey.OpenSubKey("blah", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl))
   {
      if (subKey != null)
      {
         var value =  subKey.GetValue("Somekey");
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

PInvoke使用RegOpenKeyExKEY_WOW64_64KEY可以在这里找到

PInvoke RegOpenKeyEx(advapi32)

注意:这两个应该允许您的32位应用程序访问完整的注册表,而不仅仅是Wow6432Node注册表重定向器.

资源

RegistryKey.OpenBaseKey方法(RegistryHive,RegistryView)

RegistryKey.OpenSubKey方法(String,RegistryKeyPermissionCheck,RegistryRights)

RegistryView枚举

注册表密钥安全和访问权限

注册表中的32位和64位应用程序数据