为什么我不能在64位机器上正确读取HKCU中的32位注册表值?

时间:2011-11-21 18:15:59

标签: c# python windows-7 registry

我对Windows 7注册表问题感到难过,虽然各种问题和答案让我在那里找到了一些方法,但我见过的那些问题解决了我的特定问题。我不知道其他Windows版本是否会影响这个问题,但我们都有win7x64机器。

我们的工作中有各种各样的工具,一些C ++,一些C#,一些python(2.6)等。我们还运行32位和64位工具。过去,我们很高兴地将注册表信息存储在HKLM中。我们一直致力于将内容转移到HKCU。关于是否要这样做,对UAC等有影响,我们已经进行了很多讨论。我们真的想尝试采取这一举措。那说:

我们无法从HKCU/software/CompanyABC/App读取/编写注册表项。我们在python中编写了一个app编写器,使用_winreg将注册表键写入上述位置。无论我们是指定KEY_WRITE | KEY_WOW64_32KEY还是仅指定KEY_WRITE,都会将值写入HKCU/Software/WOW6432Node/companyABC/app。细

然后我有一个C#应用程序试图读取这些值。使用Microsoft.Win32.Registry,我打开子项('HKCU / Software / CompanyABC / app'),我看不到我的值。事实证明我发现了以下行为:

  • HKLM读取/编写注册表项时,这些东西都可以正常工作。 python应用程序将写入HKLM/Softare/Wow6432Node/CompanyABC/app,C#代码将从该位置读取。考虑到我们如何构建C#应用程序以及通过python
  • 编写注册表值,这一切都是正确的
  • 从HKCU读取/写入注册表值,我得到不同的行为。 _winreg函数会写入HKCU/Sofrware/Wow6432Node/CompanyABC/app,但C#应用会从HKCU/Software/CompanyABC/app读取。 C#应用程序是作为x86应用程序构建的(不是任何CPU而不是x64)所以我假设应用程序可以正确地重定向到wow6432Node,但它似乎没有。
经过一些调查后,似乎HKCU/Software不同。 This文章似乎表明此区域是“共享”而未重定向。如果是这种情况,那么我无法理解为什么我们的python应用程序(再次使用_winreg)正在写入使用Wow6432Node的HKCU中的某个位置 - 它似乎应该在没有重定向的情况下编写它。我想它可能是_winreg中的错误。

我真的想避免在我们的工具中明确地使用WOW6432Node,但这就是我今天所处的位置。任何人都可以向我解释如何将注册表访问从32位和64位进程正确地工作到HKCU,而不必使用硬编码路径进入32位配置单元?

1 个答案:

答案 0 :(得分:4)

我从问题的评论中了解到这个问题已经消失,对于遇到此问题的其他人,您可以使用Microsoft.Win32.OpenBaseKey来指定是否在打开注册表的64位或32位时即使您的进程是以32位进程运行,也可以在64位计算机上运行。

如果您总是想要访问注册表的NON-WOW6432Node部分中的密钥,那么您可以安全地将OpenBaseKey的View参数设置为RegistryView。Registry64。这将在64位和32位操作系统上正常工作。