Я работаю над 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
Существует ли путь вокруг этой проблемы?
Это по замыслу, 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-разрядном процессе.