web-dev-qa-db-fra.com

Registry.GetValue renvoie toujours la valeur null

J'ai la clé suivante dans mon registre:

under: HKEY_LOCAL_MACHINE\SOFTWARE\RSA J'ai un objet de valeur call - WebExControlManagerPath et sa valeur est c:\

J'essaie de faire ceci: 

var r = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\RSA", "WebExControlManagerPth",null);

if(r!=null)
    ProcessAsUser.Launch(ToString());

Mais la valeur r est toujours nulle.

enter image description here

Des idées?

15
MoShe

Vous n'accédez pas à la ruche HKEY_LOCAL_MACHINE de la même manière que vous le faites en C # comme vous le feriez pour les scripts par lots. Vous appelez Registry.LocalMachine, en tant que tel:

        RegistryKey myKey = Registry.LocalMachine.OpenSubKey( @"Software\RSA", false);
        String value = (String)myKey.GetValue("WebExControlManagerPth");

        if (!String.IsNullOrEmpty(value))
        {
            ProcessAsUser.Launch(ToString());
        }

Mise à jour:

S'il renvoie null, définissez votre architecture de construction sur Any CPU. Le système d'exploitation peut virtualiser les registres 32 bits et 64 bits différemment. Voir: http://msdn.Microsoft.com/en-us/library/windows/desktop/aa965884%28v=vs.85%29.aspx , Lecture du registre 64 bits à partir d'une application 32 bits , et http://msdn.Microsoft.com/en-us/library/windows/desktop/ms724072%28v=vs.85%29.aspx .

19
Jason

Le déclaration de Jason a raison, le système d'exploitation est le problème, le code ci-dessous vous aidera à le résoudre.

RegistryKey localKey;
if(Environment.Is64BitOperatingSystem)
    localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
else
    localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);

string value = localKey.OpenSubKey("RSA").GetValue("WebExControlManagerPth").ToString();
39
Palani Kumar

si vous utilisez un système d’exploitation 64 bits, lorsque vous essayez d’obtenir HKEY_LOCAL_MACHINE\SOFTWARE\RSA, il recherche en fait HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\RSA , c’est pourquoi vous obtenez la valeur null.

3
Ahinoam Mazuz

J'avais extra "\" au début de mon chemin, assurez-vous que c'est bien réglé.

1
Zeus

examinez les autorisations de sécurité sur la clé de registre avec regedt32.exe. vérifiez si vous utilisez l'administrateur et que le contrôle de compte d'utilisateur est désactivé. Selon la documentation opensubkey, vous devez l’ouvrir avant d’accéder aux clés. http://msdn.Microsoft.com/en-us/library/z9f66s0a.aspx

1
Ricky G

Aucune des solutions ici ne fonctionnait pour moi, je devenais toujours null renvoyé de mon registre lu. J'ai finalement trouvé une solution qui a fonctionné pour moi, basée sur une fusion des réponses ci-dessus. Merci à tous de m'avoir orienté dans la bonne direction. 

J'apprécie le fait que je sois en retard à la fête, mais je pensais que cela pourrait aider les autres si les solutions ci-dessus ne fonctionnaient pas pour eux.

Cette fonction fait partie d'une classe:

/// <summary>
/// Gets the specified setting name.
/// </summary>
/// <param name="settingName">Name of the setting.</param>
/// <returns>Returns Setting if the read was successful otherwise, "undefined".</returns>
public static string get(string settingName)
{
    RegistryKey key;

    if (Environment.Is64BitOperatingSystem)
        key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\MyCompany\MyProductName", false);
    else
        key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MyCompany\MyProductName", false);

    try
    {
        String value = (String)key.GetValue(settingName);

        return value;
    }
    catch
    {
        // Null is not returned as in this case, it is a valid value.

        return "undefined";
    }
    finally
    {
        key.Close();
    }
}
0
Ken Haynes