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

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

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

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

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

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

1 Ответ

4 голосов
/ 08 декабря 2011

Я понимаю из комментариев на вопрос, что эта проблема исчезла, для всех, кто сталкивается с этим вопросом, вы можете использовать Microsoft.Win32.OpenBaseKey , чтобы указать, открывать ли 64 или 32 битовая часть реестра при работе на 64-битной машине, даже если ваш процесс работает как 32-битный процесс.

Если вы всегда хотите получить доступ к ключам в разделе NON-WOW6432Node реестра, тогда вы можете безопасно установить для параметра View OpenBaseKey значение RegistryView .Registry64. Это будет правильно работать как на 64, так и на 32-битных ОС.

...