2016-12-30 10 views
2

Я хочу, чтобы прочитать все значения из реестра, которые находятся вCant getValueNames() из HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Run

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

Я пытаюсь сделать это с следующий код:

RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false); 
     string[] values = key.GetValueNames(); 

Но мои значения Строка всегда пуста. Интересная часть о том, что, если я изменить код для

RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion", false); 
     string[] values = key.GetValueNames(); 

я получаю правильное количество ValueNames в CurrentVersion. Почему это не работает в \ Run? Если я перехожу из LocalMachine в CurrentUser, путь \ Run тоже работает.

RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false); 
     string[] values = key.GetValueNames(); 

Может кто-нибудь сказать мне, почему мой первый CodeExample не работает? Благодаря!

+0

Невозможно воспроизвести это. Ваш первый пример отлично подходит для меня. Вы тестировали его в автономной тестовой программе? Может быть, это странные обстоятельства в вашем реальном коде ... –

+0

Просто сделал это. Та же проблема снова. Но спасибо за ответ. – Luca

ответ

0

Вы не указали информацию о том, является ли ваше приложение C# 32-разрядным (x86) или 64-разрядным (x64). Если приложение 32-разрядное, запущенное в 64-битной Windows, вызовы реестра для HKLM\Software перенаправлены на HKLM\Software\Wow6432Node. Microsoft называет это Registry Redirector. Только определенные ключи перенаправляются, детали указаны в связанной статье.

Если ваше приложение является 64-разрядным, эти вызовы реестра не перенаправляются.

Вы можете проверить это, вручную добавив одну запись REG_SZ, например, «TestWOW», до HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run. Ваш 32-разрядный код должен прочитать это значение (даже если вы действительно попросили другой раздел реестра!).

Если вы можете, перекомпилируйте приложение как 64-разрядное. Теперь тот же код вернет ожидаемые значения от HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run.

К сожалению, я не знаю механизма, который заставит Windows НЕ перенаправлять вызовы реестра на узел Wow64 для 32-разрядных приложений, работающих на 64-разрядной ОС.