C# 查找注册表项值并返回注册表项值路径

C# 查找注册表项值并返回注册表项值路径,c#,networking,registry,C#,Networking,Registry,我有一个代码,搜索注册表键值在特定的键路径。 在注册表项SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318} 在注册表项的末尾查找所有带有0000、0001、0002、0003的项,依此类推{4D36E972-E325-11CE-BFC1-08002BE10318}。在每个键(例如0007)中都有一个名为NetCfgInstanceId的子键,该子键保存网络接口卡ID值,如{C80949A4-C

我有一个代码,搜索注册表键值在特定的键路径。 在注册表项
SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}
在注册表项的末尾查找所有带有
0000、0001、0002、0003
的项,依此类推<代码>{4D36E972-E325-11CE-BFC1-08002BE10318}。在每个键(例如
0007
)中都有一个名为
NetCfgInstanceId
的子键,该子键保存网络接口卡ID值,如
{C80949A4-CEDA-4F29-BFE2-059856D7F745}
。若找到值,则方法返回键路径! 问题是错误
无法将中的类型“char”转换为“string”

foreach (string key_value in key.GetValue("NetCfgInstanceId").ToString())
完整代码是

public string key_path(RegistryKey root, string root_path, string search_key)
{
    string path = string.Empty;
    foreach (string keyname in root.GetSubKeyNames())
    {
        try
        {
            using (RegistryKey key = root.OpenSubKey(keyname, true))
            {

                foreach (string key_value in key.GetValue("NetCfgInstanceId").ToString()) 
                {
                    if (key_value == search_key)
                    {
                        string reg_path = (string)key.GetValue("NetCfgInstanceId");
                        path = reg_path;
                    }
                    else
                    {
                        path = "Can't find key !";
                    }
                }
            }
        }
        catch (System.Security.SecurityException)
        {
            //Do nothing !!!
        }
    }
    return path;
}

private void kryptonButton4_Click(object sender, EventArgs e)
{
    var answer = key_path(Registry.LocalMachine, @"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}", "{C80949A4-CEDA-4F29-BFE2-059856D7F745}");
    MessageBox.Show(answer);
}       

如何解决这个问题

Foreach采用可枚举值。您正在使用字符串作为该值,因此编译器希望foreach中有一个字符变量。换句话说,对GetValue(…).ToString()的调用不会返回字符串数组,而是返回一个字符串。foreach(stringval中的varx),var是一个字符

考虑一下这样的事情

var kind = key.GetValueKind("NetCfgInstanceId");
if (kind == RegistryValueKind.MultiString)
{
    foreach (var key_value in (string[])key.GetValue("NetCfgInstanceId"))
    {
        if (key_value == search_key)
        {
            string reg_path = (string)key.GetValue("NetCfgInstanceId");
            path = reg_path;
        }
        else
        {
            path = "Can't find key !";
        }
    }
}
这是假设您期望reg密钥中有一个多字符串。如果可以是单个字符串,则可以使用以下内容

if (kind == RegistryValueKind.ExpandString
   || kind == RegistryValueKind.String)
{
    var key_value = (string)key.GetValue("NetCfgInstanceId");
    if (key_value == search_key)
    {
        path = key_value;
    }
    else
    {
        path = "Can't find key !";
    }
}

你能用这个写完整的代码吗?有些事我不明白(我得到错误var key_value=key.GetValue(“NetCfgInstanceId”);///key找不到解决方案..!千万不要在意!我在字符串中添加了一个强制转换。另外,清理了第二个代码示例。