Wie überprüfe ich mit C #, ob ein Registrierungswert vorhanden ist?

76

Wie kann ich anhand des C # -Codes überprüfen, ob ein Registrierungswert vorhanden ist? Dies ist mein Code. Ich möchte überprüfen, ob 'Start' vorhanden ist.

public static bool checkMachineType()
{
    RegistryKey winLogonKey = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\services\pcmcia", true);
    string currentKey= winLogonKey.GetValue("Start").ToString();

    if (currentKey == "0")
        return (false);
    return (true);
}
sari k
quelle

Antworten:

63

Für den Registrierungsschlüssel können Sie nach dem Abrufen überprüfen, ob er null ist. Es wird sein, wenn es nicht existiert.

Für den Registrierungswert können Sie Namen von Werten für den aktuellen Schlüssel abrufen und prüfen, ob dieses Array den erforderlichen Wertnamen enthält.

Beispiel:

public static bool checkMachineType()
{    
    RegistryKey winLogonKey = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\services\pcmcia", true);
    return (winLogonKey.GetValueNames().Contains("Start"));
}
26071986
quelle
17
Beispiel für Letzteres, denn das ist es, was die Frage stellt?
Cja
6
Ich kann nicht glauben, dass dies die akzeptierte Antwort ist oO
lewis4u
42
public static bool RegistryValueExists(string hive_HKLM_or_HKCU, string registryRoot, string valueName)
{
    RegistryKey root;
    switch (hive_HKLM_or_HKCU.ToUpper())
    {
        case "HKLM":
            root = Registry.LocalMachine.OpenSubKey(registryRoot, false);
            break;
        case "HKCU":
            root = Registry.CurrentUser.OpenSubKey(registryRoot, false);
            break;
        default:
            throw new System.InvalidOperationException("parameter registryRoot must be either \"HKLM\" or \"HKCU\"");
    }

    return root.GetValue(valueName) != null;
}
Mike Bruno
quelle
28
@hsanders Auch wenn die Frage bereits beantwortet wurde, ist es immer willkommen, nützliche Informationen hinzuzufügen. Stapelüberlauf erhält viel Verkehr von Google;)
DonkeyMaster
5
root.GetValue (valueName)! = null löst eine Ausnahme aus, wenn valueName nicht vorhanden ist.
Farukh
sollte sich ändern, um root zurückzugeben? .GetValue (valueName)! = null;
JMIII
Welche Ausnahme wird von GetValue ausgelöst, wenn valueName nicht vorhanden ist?
BradleyGamiMarques
27
string keyName=@"HKEY_LOCAL_MACHINE\System\CurrentControlSet\services\pcmcia";
string valueName="Start";
if (Registry.GetValue(keyName, valueName, null) == null)
{
     //code if key Not Exist
}
else
{
     //code if key Exist
}
Javed Akram
quelle
2
  RegistryKey rkSubKey = Registry.CurrentUser.OpenSubKey(" Your Registry Key Location", false);
        if (rkSubKey == null)
        {
           // It doesn't exist
        }
        else
        {
           // It exists and do something if you want to
         }
C_sharp
quelle
2
Diese Lösung besteht darin, zu überprüfen, ob der Schlüssel vorhanden ist oder nicht. Für den Wert müssen wir nach der Liste der Werte in diesem Schlüssel
suchen
0
public bool ValueExists(RegistryKey Key, string Value)
{
   try
   {
       return Key.GetValue(Value) != null;
   }
   catch
   {
       return false;
   }
}

Diese einfache Funktion gibt nur dann true zurück, wenn ein Wert gefunden wird, der jedoch nicht null ist. Andernfalls wird false zurückgegeben, wenn der Wert vorhanden ist, er jedoch null ist oder der Wert nicht im Schlüssel vorhanden ist.


NUTZUNG für Ihre Frage:

if (ValueExists(winLogonKey, "Start")
{
    // The values exists
}
else
{
    // The values does not exists
}
Marco Concas
quelle
0

Natürlich ist "Fagner Antunes Dornelles" in seiner Antwort richtig. Aber es scheint mir, dass es sich lohnt, zusätzlich den Registrierungszweig selbst zu überprüfen oder sich des Teils zu vergewissern, der genau dort ist.

Zum Beispiel ("Dirty Hack") muss ich Vertrauen in die RMS-Infrastruktur herstellen. Andernfalls werde ich beim Öffnen von Word- oder Excel-Dokumenten zur Eingabe von "Active Directory Rights Management Services" aufgefordert. So kann ich meinen Servern in der Unternehmensinfrastruktur Remote-Vertrauen hinzufügen.

foreach (var strServer in listServer)
{
    try
    {
        RegistryKey regCurrentUser = Registry.CurrentUser.OpenSubKey($"Software\\Classes\\Local Settings\\Software\\Microsoft\\MSIPC\\{strServer}", false);
        if (regCurrentUser == null)
            throw new ApplicationException("Not found registry SubKey ...");
        if (regCurrentUser.GetValueNames().Contains("UserConsent") == false)
            throw new ApplicationException("Not found value in SubKey ...");
    }
    catch (ApplicationException appEx)
    {
        Console.WriteLine(appEx);
        try
        {
            RegistryKey regCurrentUser = Registry.CurrentUser.OpenSubKey($"Software\\Classes\\Local Settings\\Software\\Microsoft\\MSIPC", true);
            RegistryKey newKey = regCurrentUser.CreateSubKey(strServer, true);
            newKey.SetValue("UserConsent", 1, RegistryValueKind.DWord);
        }
        catch(Exception ex)
        {
            Console.WriteLine($"{ex} Pipec kakoito ...");
        }
    }
}
KUL
quelle
-4
        internal static Func<string, string, bool> regKey = delegate (string KeyLocation, string Value)
        {
            // get registry key with Microsoft.Win32.Registrys
            RegistryKey rk = (RegistryKey)Registry.GetValue(KeyLocation, Value, null); // KeyLocation and Value variables from method, null object because no default value is present. Must be casted to RegistryKey because method returns object.
            if ((rk) == null) // if the RegistryKey is null which means it does not exist
            {
                // the key does not exist
                return false; // return false because it does not exist
            }
            // the registry key does exist
            return true; // return true because it does exist
        };

Verwendung:

        // usage:
        /* Create Key - while (loading)
        {
            RegistryKey k;
            k = Registry.CurrentUser.CreateSubKey("stuff");
            k.SetValue("value", "value");
            Thread.Sleep(int.MaxValue);
        }; // no need to k.close because exiting control */


        if (regKey(@"HKEY_CURRENT_USER\stuff  ...  ", "value"))
        {
             // key exists
             return;
        }
        // key does not exist
Coomphs
quelle
Der Rückgabetyp von GetValuewird niemals vom Typ RegistryKeysein. Warum wirfst du ihn also?
NetMage