web-dev-qa-db-fra.com

Registry.LocalMachine.OpenSubKey () renvoie la valeur null

J'obtiens un retour nul de cette tentative d'accès au registre Windows:

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

keyPath est SOFTWARE\\TestKey

La clé est dans le registre, alors pourquoi ne la trouve-t-elle pas dans la ruche Local Machine?

29
PositiveGuy

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

CODE NON LIST: 

Response.Clear();  
Response.Write(Environment.UserDomainName + "\\" + Environment.UserName);  
Response.End();
2
Christopher Kelly

Cela peut arriver si vous êtes sur une machine 64 bits. Créez d'abord une classe d'assistance (requiert .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);
    }
}

Usage:

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

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

Console.WriteLine(connectionString);
Console.ReadLine();
58
Raghav

Juste besoin de le changer de 

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

à 

using (RegistryKey registry = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default).OpenSubKey(keyPath))

(Utilisez RegistryKey au lieu de Registry, ajoutez RegistryView et placez Hive-Local Machine en tant que paramètre de méthode.)

0
vapcguy