2009-08-12 6 views
27

je reçois un retour nul de cette tentative d'accès au Registre Windows:Registry.LocalMachine.OpenSubKey() retourne null

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

est KeyPath SOFTWARE\\TestKey

La clé est dans le registre, alors pourquoi est il ne le trouve pas sous la ruche Machine locale?

+1

Êtes-vous bien échapper KeyPath? Est-ce "SOFTWARE \\ TestKey", et non "SOFTWARE \ TestKey"? – Michael

+0

oui, je l'ai posté faux. Il est en fait configuré pour utiliser \\ – PositiveGuy

+1

Donc, cela a bien fonctionné sur le PC de mon patron. Aucune raison de ne pas le faire ici. J'ai donné l'accès au compte asp.net car je cours le serveur web VS et retourne toujours null. – PositiveGuy

Répondre

2

Dans votre commentaire à Dana vous avez dit que vous avez donné l'accès au compte ASP.NET. Cependant, avez-vous vérifié que c'est le compte sous lequel le site fonctionne? L'usurpation d'identité et l'accès anonyme peuvent être facilement ignorés.

CODE NON TESTÉ:

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

Comment savoir dans quel compte le site s'exécute sans avoir à écrire du code à exposer? – PositiveGuy

+0

bien ce qui précède est généralement comment je dépanne les problèmes de compte bien que j'ajoute une vérification en ce qu'il vient de mon adresse IP afin que non seulement tout le monde peut le voir. –

57

Il peut arriver si vous êtes sur une machine 64 bits. Créer une classe d'aide première (nécessite .NET 4.0 ou version ultérieure):

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); 
    } 
} 

Utilisation:

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

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

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

Il convient de noter que cette réponse nécessite .NET 4.0 ou supérieur. – ganders

+1

+1 Cela m'a beaucoup aidé, merci. –

+1

Merci! Vous venez de sauver ma journée! – raven

Questions connexes