Подтвердить что ты не робот

Избегайте перенаправления реестра Wow6432Node

Я пытаюсь вставить некоторые простые ключи реестра с помощью Microsoft.Win32.RegistryKey в С#, но путь автоматически изменяется:

HKEY_LOCAL_MACHINE\SOFTWARE\Test

к

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Test

Я попробовал Google, но я получаю только некоторые неопределенные и запутанные результаты. Кто-нибудь раньше занимался этим вопросом? Некоторый пример кода был бы намного appereciated.

4b9b3361

Ответ 1

Вы можете использовать RegistryKey.OpenBaseKey для решения этой проблемы:

var baseReg = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var reg = baseReg.CreateSubKey("Software\\Test");

Ответ 2

Я не знаю, как его решить, используя REG файл. Но только в BAT файле, как следует:

Вы должны добавить /reg:64 в конце командной строки. например:

REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background" /v "OEMBackground" /t REG_DWORD /d 0x00000001 /f /reg:64

Источник: Wow6432Node и как развернуть настройки реестра для 64-битных систем через Sccm

Ответ 3

В WOW64 определенные ключи реестра перенаправляются (ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ). Когда 32-разрядное или 64-разрядное приложение вызывает вызов реестра для перенаправленного ключа, редиректор реестра перехватывает вызов и сопоставляет его с соответствующим физическим местоположением реестра. Для получения дополнительной информации см. Редиректор реестра.

Вы можете использовать RegistryView Enumeration в RegistryKey.OpenBaseKey Method открыто открыть 32-битное представление и напрямую обратиться к HKLM\Software \.

Ответ 4

Вот рабочий код, который я разработал как для чтения, так и для записи ТОЛЬКО 32-разрядного реестра. Он работает как в 32-битных, так и в 64-разрядных приложениях. "Чтение" вызывает обновление реестра, если значение не задано, но очень очевидно, как его удалить. Он требует .Net 4.0 и использует методы OpenBaseKey/OpenSubKey.

В настоящее время я использую его, чтобы 64-битная фоновая служба и приложение с 32-разрядным лотком были легко доступны для доступа к тем же разделам реестра.

using Microsoft.Win32;

namespace SimpleSettings
{
public class Settings
{
    private static string RegistrySubKey = @"SOFTWARE\BlahCompany\BlahApp";

    public static void write(string setting, string value)
    {
        using (RegistryKey registryView = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32))
        using (RegistryKey registryCreate = registryView.CreateSubKey(RegistrySubKey))
        using (RegistryKey registryKey = registryView.OpenSubKey(RegistrySubKey, true))
        {
            registryKey.SetValue(setting, value, RegistryValueKind.String);
        }        
    }
    public static string read(string setting, string def)
    {
        string output = string.Empty;
        using (RegistryKey registryView = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32))
        using (RegistryKey registryCreate = registryView.CreateSubKey(RegistrySubKey))
        using (RegistryKey registryKey = registryView.OpenSubKey(RegistrySubKey, false))
        {
            // Read the registry, but if it is blank, update the registry and return the default.
            output = (string)registryKey.GetValue(setting, string.Empty);
            if (string.IsNullOrWhiteSpace(output))
            {
                output = def;
                write(setting, def);
            }
        }
        return output;
    }
}
}

Использование: Поместите это в свой собственный файл класса (.cs) и назовите его как таковой:

using SimpleSettings;
string mysetting = Settings.read("SETTINGNAME","DEFAULTVALUE");