Почему я не могу должным образом прочитать 32-битные значения реестра в HKCU на 64-битной машине?

Я в тупике из-за проблемы с реестром Windows 7, и, хотя различные вопросы и ответы помогают мне в этом, ничто из того, что я видел, не решает мою конкретную проблему. Я не знаю, влияют ли на эту проблему другие версии Windows, но у всех нас есть машины с Win7x64.

У нас в работе есть широкий спектр инструментов: немного C ++, немного C #, немного python (2.6) и т. Д. Мы также используем сочетание 32- и 64-разрядных инструментов. В прошлом мы успешно хранили информацию реестра в HKLM . Мы работаем над перемещением материалов в HKCU . У нас было много дискуссий о том, нужно ли это делать, влияет ли на UAC и т. Д. Мы действительно хотим попробовать и сделать этот шаг. Тем не менее:

У нас возникли проблемы с чтением / записью ключей реестра из HKCU / software / CompanyABC / App . У нас есть установочное приложение , записывающее на Python, которое записывает ключи реестра в указанное выше место, используя _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 (не Any CPU и не x64), поэтому я предположил, что приложение будет правильно перенаправлено на wow6432Node , но, похоже, это не так.

после некоторого расследования выяснилось, что HKCU / Software отличается. Эта статья, кажется, указывает, что эта область является «общей» и не перенаправляется. Если это так, то я не могу понять, почему наше приложение python (опять же с использованием _winreg) записывает в место в HKCU, которое использует Wow6432Node - похоже, оно должно писать его без этого перенаправления в место. Я предполагаю, что это может быть ошибка в _winreg .

Я действительно хочу избежать явной привязки к WOW6432Node в наших инструментах, но именно здесь я нахожусь сегодня. Может ли кто-нибудь объяснить мне, как сделать так, чтобы доступ к реестру из 32- и 64-битных процессов в HKCU работал правильно, не прибегая к жестко запрограммированным путям в 32-битном улье?

9
задан hollopost 27 October 2018 в 18:43
поделиться