2009-08-12 2 views
27

я получаю нуль назад от этой попытки получить доступ к реестру Windows:Registry.LocalMachine.OpenSubKey() возвращает нуль

using (RegistryKey registry = Registry.LocalMachine.OpenSubKey(keyPath)) 

является ключевым ресурсом SOFTWARE\\TestKey

Ключа в реестре, так почему он не находит его под кустом локального компьютера?

+1

Вы правильно вытекающее ключевого пути? Это «ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \\ TestKey», а не «ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ TestKey»? – Michael

+0

Да, я отправил это неправильно. На самом деле это настройка для использования \\ – PositiveGuy

+1

Так что это отлично работает на компьютере моего босса. Нет причин, почему этого не должно быть здесь. Я дал доступ учетной записи asp.net к нему, так как я запускаю веб-сервер VS и по-прежнему возвращает null. – PositiveGuy

ответ

2

В своем комментарии к Дане вы сказали, что получили доступ к учетной записи ASP.NET. Однако вы подтвердили, что это учетная запись, на которой работает сайт? Олицетворение и анонимный пользователь доступа могут быть легко упущены.

UNTESTED КОД:

Response.Clear(); 
Response.Write(Environment.UserDomainName + "\\" + Environment.UserName); 
Response.End(); 
+0

Как я могу выяснить, на какой учетной записи работает сайт, без необходимости писать код для раскрытия? – PositiveGuy

+0

хорошо, как правило, как я устраняю проблемы с учетной записью, хотя я добавляю чек в том, что он поступает с моего IP-адреса, чтобы не все могли его видеть. –

57

Это может произойти, если вы на 64-битной машине. Создать вспомогательный класс первый (требует .NET 4.0 или более поздней версии):

public class RegistryHelpers 
{ 

    public static RegistryKey GetRegistryKey() 
    { 
     return GetRegistryKey(null); 
    } 

    public static RegistryKey GetRegistryKey(string keyPath) 
    { 
     RegistryKey localMachineRegistry 
      = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, 
             Environment.Is64BitOperatingSystem 
              ? RegistryView.Registry64 
              : RegistryView.Registry32); 

     return string.IsNullOrEmpty(keyPath) 
      ? localMachineRegistry 
      : localMachineRegistry.OpenSubKey(keyPath); 
    } 

    public static object GetRegistryValue(string keyPath, string keyName) 
    { 
     RegistryKey registry = GetRegistryKey(keyPath); 
     return registry.GetValue(keyName); 
    } 
} 

Использование:

string keyPath = @"SOFTWARE\MyApp\Settings"; 
string keyName = "MyAppConnectionStringKey"; 

object connectionString = RegistryHelpers.GetRegistryValue(keyPath, keyName); 

Console.WriteLine(connectionString); 
Console.ReadLine(); 
+9

Следует отметить, что для этого ответа требуется .NET 4.0 или выше. – ganders

+1

+1 Это мне очень помогло, спасибо. –

+1

Спасибо! Ты просто спас мой день! – raven