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

我对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’),我没有看到我的值。 事实certificate我看到以下行为:

  • 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似乎有所不同。 本文似乎表明该区域是“共享”而未重定向。 如果是这种情况,那么我无法理解为什么我们的python应用程序(再次使用_winreg)正在写入使用Wow6432Node HKCU中的某个位置 – 看起来它应该在没有重定向的情况下编写它。 我想它可能是_winreg一个bug。

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

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

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