Як перевірити, чи існує значення реєстру за допомогою C #?


76

Як перевірити, чи існує значення реєстру за допомогою коду C #? Це мій код, я хочу перевірити, чи існує "Пуск".

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

Відповіді:


63

Для ключа реєстру ви можете перевірити, чи є він нульовим після його отримання. Буде, якщо його не буде.

Для значення реєстру ви можете отримати імена значень для поточного ключа та перевірити, чи містить цей масив необхідне ім’я значення.

Приклад:

public static bool checkMachineType()
{    
    RegistryKey winLogonKey = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\services\pcmcia", true);
    return (winLogonKey.GetValueNames().Contains("Start"));
}

17
Приклад останнього, оскільки саме це задає питання?
cja

6
Я не можу повірити, що це прийнята відповідь
oO

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

28
@hsanders, навіть якщо на питання вже було дано відповідь, завжди можна додати корисну інформацію. Переповнення стеку отримує багато трафіку від Google;)
DonkeyMaster

5
root.GetValue (valueName)! = null видає виняток, якщо valueName не існує.
Фарух

має змінитися, щоб повернути root? .GetValue (valueName)! = null;
JMIII

Який виняток генерує GetValue, якщо valueName не існує?
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
}

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
         }

2
це рішення полягає в тому, щоб перевірити, чи існує ключ чи ні. для значення ми повинні перевірити список значень у цьому ключі
Jammy

0
public bool ValueExists(RegistryKey Key, string Value)
{
   try
   {
       return Key.GetValue(Value) != null;
   }
   catch
   {
       return false;
   }
}

Ця проста функція поверне значення true, лише якщо знайдено значення, але воно не має значення null, інакше поверне значення false, якщо значення існує, але воно є нулем або значення не існує в ключі.


ВИКОРИСТАННЯ для вашого запитання:

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

0

Звичайно, "Фагнер Антунес Дорнеллес" правильний у своїй відповіді. Але мені здається, що варто додатково перевірити саму гілку реєстру або бути впевненим у тій частині, яка саме там є.

Наприклад ("брудний хак"), мені потрібно встановити довіру до інфраструктури RMS, інакше, коли я відкриваю документи Word або Excel, мені буде запропоновано "Служби управління правами Active Directory". Ось як я можу додати віддалену довіру до своїх серверів в корпоративній інфраструктурі.

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

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

використання:

        // 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

Тип повернення з GetValueніколи не буде типу, RegistryKeyто чому ви його кастуєте?
NetMage
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.