如何读取注册表项的值c#

Posted

技术标签:

【中文标题】如何读取注册表项的值c#【英文标题】:How to read value of a registry key c# 【发布时间】:2013-08-16 11:29:25 【问题描述】:

在我的应用程序启动时,我试图查看用户是否安装了特定版本的软件,特别是 mysql 连接器,全部使用 c#。在注册表中,MySQL 包含一个版本条目。所以我想要完成的是这个。

我的应用程序启动。在启动代码的某个地方,我需要按顺序执行以下操作。检查用户是否安装了 MySQL 连接器,它位于...

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MySQL AB\MySQL Connector/Net

如果用户安装了连接器,我想检查他们的版本,存储为 Name = "Version" 和 Data = x.x.x(下图)

现在如果用户安装了特定版本,那么我将执行其他代码,这是我可以借鉴的地方。

最好的方法是什么?

编辑: 以下是我目前拥有的代码,我在第 19 行遇到错误(已注释)。我的错误是“error CS1001: Identifier Expected”我无法弄清楚这意味着什么。有什么帮助吗?

using System;
using Microsoft.Win32;
using System.Data;

public class regTest

    public static void Main()
    
        try
        
            RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\MySQL AB\\MySQL Connector\\Net");
            if (key != null)
            
                Object o = key.GetValue("Version");
                if (o != null)
                
                    Version version = new Version(o as String);  //"as" because it's REG_SZ...otherwise ToString() might be safe(r)
                    Version broken = new Version("6.7.4");
                    if (version.Equals.(broken)) //This is where the error is occuring
                    
                        DataSet dataSet = ConfigurationManager.GetSection("system.data") as ystem.Data.DataSet;

                        DataView vi = dataSet.Tables[0].DefaultView;
                        vi.Sort = "Name";
                        if (vi.Find("MySql") == -1)
                        
                            dataSet.Tables[0].Rows.Add("MySql"
                                , "MySql.Data.MySqlClient"
                                , "MySql.Data.MySqlClient"
                                ,
                                typeof(MySql.Data.MySqlClient.MySqlClientFactory).AssemblyQualifiedName);
                        

                    

                
            
        

        catch (Exception ex)  //just for demonstration...it's always best to handle specific exceptions
        
             //react appropriately
        
    

【问题讨论】:

msdn.microsoft.com/en-us/library/… 【参考方案1】:

@DonBoitnott 的代码很好,但需要管理员权限。我用这个(只需要阅读权限)

 try
 
      using (var key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\MySQL AB\\MySQL Connector\\Net", false)) // False is important!
      
           var s = key?.GetValue("Version") as string;
           if (!string.IsNullOrWhiteSpace(s))
           
                var version = new Version(s);
           
      
 
 catch (Exception ex)  //just for demonstration...it's always best to handle specific exceptions
 
      //react appropriately
 

【讨论】:

【参考方案2】:

变化:

using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\MySQL AB\\MySQL Connector\\Net"))

收件人:

 using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\Wow6432Node\MySQL AB\MySQL Connector\Net"))

【讨论】:

为什么粘贴同样的东西没有任何改进? 最好删除这个,因为它对 OP 问题没有贡献【参考方案3】:

您需要先将using Microsoft.Win32; 添加到您的代码页。

然后你就可以开始使用Registry类了:

try

    using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\MySQL AB\\MySQL Connector\\Net"))
    
        if (key != null)
        
            Object o = key.GetValue("Version");
            if (o != null)
            
                Version version = new Version(o as String);  //"as" because it's REG_SZ...otherwise ToString() might be safe(r)
                //do what you like with version
            
        
    

catch (Exception ex)  //just for demonstration...it's always best to handle specific exceptions

    //react appropriately

注意:除非您具有管理员权限,否则您不太可能在LOCAL_MACHINE 中做很多事情。有时,即使读取值也可能是没有管理员权限的可疑操作。

【讨论】:

我已更新我的代码以反映您提供给我的内容,但我遇到了如上所示的问题,有什么帮助吗? 取出多余的'.' 应该在 using 块中使用“RegistryKey”。他们实现了 IDisposable。 @HaymoKutschbach 没错。 当我尝试这个时,我得到 RegistryKey 找不到(我正在使用 Microsoft.Win32 但仍然找不到类型...)

以上是关于如何读取注册表项的值c#的主要内容,如果未能解决你的问题,请参考以下文章

如何从批处理脚本中获取注册表项的值?

创建和读取 MultipleStringValue 注册表项

批处理如何设置注册表项的权限

C# 通用注册表操作方法

请问如何使用批处理命令改变注册表项的权限?

OpenSubKey() 注册表项的“绝对路径”?