如何使用 C# 检查注册表值是不是存在?

Posted

技术标签:

【中文标题】如何使用 C# 检查注册表值是不是存在?【英文标题】:How to check if a registry value exists using C#?如何使用 C# 检查注册表值是否存在? 【发布时间】:2011-05-15 15:18:32 【问题描述】:

如何通过 C# 代码检查注册表值是否存在? 这是我的代码,我想检查'Start'是否存在。

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

【问题讨论】:

【参考方案1】:

当然,“Fagner Antunes Dornelles”的答案是正确的。但在我看来,另外检查注册表分支本身是值得的,或者确定确切存在的部分。

例如(“dirty hack”),我需要建立对 RMS 基础结构的信任,否则当我打开 Word 或 Excel 文档时,将提示我输入“Active Directory Rights Management Services”。以下是我如何在企业基础架构中为我的服务器添加远程信任。

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

【讨论】:

【参考方案2】:
public bool ValueExists(RegistryKey Key, string Value)

   try
   
       return Key.GetValue(Value) != null;
   
   catch
   
       return false;
   

这个简单的函数只有在找到一个值但它不为空时才返回真,否则如果值存在但它为空或键中不存在该值,则返回假。


你的问题的用法:

if (ValueExists(winLogonKey, "Start")

    // The values exists

else

    // The values does not exists

【讨论】:

【参考方案3】:

对于Registry Key,获取后可以检查是否为null。如果它不存在,它将是。

对于注册表值,您可以获得当前键的值名称,并检查此数组是否包含所需的值名称。

例子:

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

【讨论】:

后者的示例,因为这就是问题所在? 我不敢相信这是公认的答案o.O【参考方案4】:
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;

【讨论】:

@hsanders 即使​​问题已经得到解答,也欢迎添加有用的信息。堆栈溢出从 Google 获得大量流量;) root.GetValue(valueName) != null 如果 valueName 不存在则抛出异常。 应该改成return root?.GetValue(valueName) != null; 如果 valueName 不存在,GetValue 会抛出哪个异常?【参考方案5】:
        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 类型,所以你为什么要转换它?【参考方案6】:
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

【讨论】:

【参考方案7】:
  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
         

【讨论】:

这个解决方案是检查key是否存在。对于值,我们必须检查该键中的值列表

以上是关于如何使用 C# 检查注册表值是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 或 Javascript 检查文件是不是存在?

C# - 如何检查 C# 中是不是存在命名空间、类或方法?

C# - 如何检查用户的输入是不是存在于组合框中(使用的数据绑定项)

使用 C# 检查 List 中是不是存在值

在 c# 中,如何测试/获取/设置可能存在或不存在的注册表项?

如何根据 PL/SQL 变量值检查输入参数值是不是存在作为列表?