C# считывает неправильные данные реестра на 64-разрядной ОС

Я работаю над 64-разрядным Windows и моими выполнениями applicaiton с поднятыми полномочиями. У меня есть проблема со следующей очень простой частью кода:

myKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
    if (myKey != null)
    {
    string[] HKLMvaluenames = myKey.GetValueNames();
    }

Но по некоторым причинам массив HKLMvaluenames заполняется со значениями от следующего ключа:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run

Существует ли путь вокруг этой проблемы?

11
задан baal80 16 May 2010 в 12:50
поделиться

1 ответ

Это по замыслу, 32-битные программы имеют другой вид реестра, чем 64-битные программы. Они перенаправляются в ключ HKLM\Software\Wow6432Node при попытке прочитать значение из куста HKLM\Software. Если вы строите программу C# с помощью Project + Properties, вкладки Build, Platform Target = Any CPU, то она будет работать как 64-разрядная программа и не будет перенаправлена.

32-разрядные программы могут отменить перенаправление, но это нелегко сделать с помощью класса .NET RegistryKey. Требуется P/Вызов RegOpenKeyEx с параметром KEY_WOW64_64KEY.Дополнительные сведения см. в этой статье Windows SDK.


EDIT: теперь это также доступно для .NET с помощью метода RegistryKey.OpenBaseKey() для .NET 4. Передайте RegistryView.Registry64, чтобы просмотреть реестр так, как это было бы в 64-разрядном процессе.

17
ответ дан 3 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: