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

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

HKEY_LOCAL_MACHINESOFTWARETest

to

HKEY_LOCAL_MACHINESOFTWAREWow6432NodeTest

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

4 ответов


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

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

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

можно использовать Перечисление RegistryView on объект registrykey.Метод OpenBaseKey для явного открытия 32-разрядного представления и доступа HKLM\программное обеспечение\ напрямую.


Я не знаю, как решить его с помощью a .reg-файл. Но только в файле BAT, как следует:

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

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

источник: Wow6432Node и как развернуть параметры реестра в 64-битных системах через Sccm


вот рабочий код, который я разработал для чтения и записи только 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");