С# Access 64-разрядный реестр

Мне было интересно, можно ли получить доступ к следующему разделу реестра на С# на 64-битном компьютере.

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

При доступе на 32-битный компьютер он работает нормально, но на 64 он перенаправляет его на собственный 64-битный путь HKLM\SOFTWARE\Wow6432Node, который имеет разные ключи. Я просмотрел различные статьи об этом, но не могу найти определенный ответ о том, как получить доступ к 32-битовому ключу на 64-битном ПК в С#. Спасибо.

Ответ 1

Скомпилируйте приложение в x64, и все должно быть хорошо. В Visual Studio 2010 вы сделаете это, изменив настройку в Project Properties > Build

enter image description here

Для пользователей VS Express:

В VС# Express это свойство отсутствует, но вы все равно можете создать x86, если вы знаете, где искать.

Он выглядит как длинный список шагов, но как только вы знаете, где эти вещи все намного проще. Любой, кто имеет только VС# Express, будет вероятно, считают это полезным. Как только вы узнаете о Configuration Manager, это будет намного более интуитивно понятным в следующий раз.

  • В VС# Express откройте Инструменты → Параметры.
  • В левом нижнем углу диалогового окна "Параметры" установите флажок, говорит: "Показать все настройки".
  • В дереве с левой стороны выберите "Проекты и Решения".
  • В параметрах справа установите флажок "Показать расширенные конфигурации конфигурации."
  • Нажмите "ОК".
  • Перейти к сборке → Configuration Manager...
  • В столбце Платформа рядом с вашим проектом щелкните поле со списком и выберите ".
  • В настройке" Новая платформа "выберите" x64".
  • Нажмите "ОК".
  • Нажмите "Закрыть".
  • Теперь у вас есть конфигурация x64! Проще простого!: -)

Ответ 2

Если вы нацеливаете .NET Framework версии 4.0 или выше, вы можете сделать это, передав значение RegistryView.Registry32 при открытии необходимого раздела реестра.

Если вы нацеливаете предыдущую версию .Net Framework, вам нужно напрямую использовать P/Invoke для вызова RegOpenKeyEx, позволяя вам передать KEY_WOW64_32KEY.

Здесь есть руководство, которое более подробно описано ниже:

Ответ 3

Проект + Свойства, вкладка "Сборка", "Цель платформы" = "Любой процессор". Для доступа к 64-разрядному реестру из 32-разрядного приложения требуется .NET 4 и новый метод RegistryKey.OpenBaseKey() с параметром RegistryView.Registry64.

Это позволяет читать только ключ, для записи значений ключей требуется повышение UAC. Вы можете писать в HKCU без повышения и не подвергаться перенастройке реестра.

Ответ 4

У вас есть обратное, Wow6432Node - для 32-битных приложений. Поэтому, если ваше приложение si 32-bit (x86), то вы автоматически перенаправляетесь на этот "node".

Вы можете использовать метод FromHandle в .NET 4, чтобы указать, какой вид использовать, но он не очень очевиден и может .

Этот ответ разрешает этот вопрос, используя API Win32, который также можно использовать на С#.

Ответ 5

Предположим, что он перенаправлен. Вам нужно обнаружить это перенаправление и вместо этого прочитать WoW6432Node. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run - это 64-разрядный реестр, доступ к которому возможен только для 64-разрядных приложений.

Очевидно, что вы shoudl пишете код для поддержки обоих.