C# 无法查询CSDVersion的值

C# 无法查询CSDVersion的值,c#,C#,我遵循这个C#示例,能够查询一些注册表值,但不是所有注册表值: 我可以可靠地获取注册表项,如CurrentVersion、ProductName等。但当我尝试获取CSD版本时,它失败了 我在.NET2.0和.NET4.0中编译过,但结果相同。我已尝试查询本地计算机和远程计算机。两者都可以返回其他注册表值,但不能返回此特定值 两者都是x64机器(Windows7Ultimate和Windows2008R2),因此无论哪种方式都不应该在访问注册表方面有任何问题 我发现一件奇怪的事情是EnumVal

我遵循这个C#示例,能够查询一些注册表值,但不是所有注册表值:

我可以可靠地获取注册表项,如CurrentVersion、ProductName等。但当我尝试获取CSD版本时,它失败了

我在.NET2.0和.NET4.0中编译过,但结果相同。我已尝试查询本地计算机和远程计算机。两者都可以返回其他注册表值,但不能返回此特定值

两者都是x64机器(Windows7Ultimate和Windows2008R2),因此无论哪种方式都不应该在访问注册表方面有任何问题

我发现一件奇怪的事情是EnumValues函数只返回17个值,而在这个特定的注册表项中有21个值。在缺失的四个版本中,CSDVersion是其中之一

我很好奇,是否有人知道为什么这四个值不会回来,但其余的都会回来? 缺少值:

  • CSD版本-Reg_sz
  • DigitalProductID-Reg_二进制文件
  • DigitalProductId4-Reg_二进制
  • ProductID-Reg_sz
非常奇怪的是,我有另一个用.NET2.0编写的项目,它有一个类库来做这种事情。为库运行NUnit测试时,此查询工作正常,并返回所有21个值。但当通过另一个项目运行此库时,它不起作用

我已经在调用库的项目中详细介绍了代码,执行此操作时,它只返回17个条目。所以我无法解释到底发生了什么

有人知道下一步该去哪里吗?下面是我正在使用的确切代码,它根本不适用于上述特定情况

using System;
using System.Management;
using System.Management.Instrumentation;

namespace GetCSDVersion
{
    public enum RegHive : uint
    {
        HKEY_CLASSES_ROOT = 0x80000000,
        HKEY_CURRENT_USER = 0x80000001,
        HKEY_LOCAL_MACHINE = 0x80000002,
        HKEY_USERS = 0x80000003,
        HKEY_CURRENT_CONFIG = 0x80000005
    }

    public enum RegType
    {
        REG_SZ = 1,
        REG_EXPAND_SZ,
        REG_BINARY,
        REG_DWORD,
        REG_MULTI_SZ = 7
    }

    class Program
    {
        static void Main(string[] args)
        {
            const string strComputer = "localhost";

            ConnectionOptions options = new ConnectionOptions();
            options.Impersonation = ImpersonationLevel.Impersonate;
            options.EnablePrivileges = true;
            //options.Username = "";
            //options.Password = "";

            ManagementScope myScope = new ManagementScope("\\\\" + strComputer + "\\root\\default", options);
            ManagementPath mypath = new ManagementPath("StdRegProv");
            ManagementClass mc = new ManagementClass(myScope, mypath, null);

            object oValue = GetValue(mc, RegHive.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "CSDVersion");
            Console.WriteLine(oValue.ToString());
        }

        public static object GetValue(ManagementClass mc, RegHive hDefKey, string sSubKeyName, string sValueName)
        {
            RegType rType = GetValueType(mc, hDefKey, sSubKeyName, sValueName);

            ManagementBaseObject inParams = mc.GetMethodParameters("GetStringValue");
            inParams["hDefKey"] = hDefKey;
            inParams["sSubKeyName"] = sSubKeyName;
            inParams["sValueName"] = sValueName;

            object oValue = null;

            switch (rType)
            {
                case RegType.REG_SZ:
                    ManagementBaseObject outParams = mc.InvokeMethod("GetStringValue", inParams, null);

                    if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                    {
                        oValue = outParams["sValue"];
                    }
                    else
                    {
                        // GetStringValue call failed
                    }
                    break;

                case RegType.REG_EXPAND_SZ:
                    outParams = mc.InvokeMethod("GetExpandedStringValue", inParams, null);

                    if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                    {
                        oValue = outParams["sValue"];
                    }
                    else
                    {
                        // GetExpandedStringValue call failed
                    }
                    break;

                case RegType.REG_MULTI_SZ:
                    outParams = mc.InvokeMethod("GetMultiStringValue", inParams, null);

                    if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                    {
                        oValue = outParams["sValue"];
                    }
                    else
                    {
                        // GetMultiStringValue call failed
                    }
                    break;

                case RegType.REG_DWORD:
                    outParams = mc.InvokeMethod("GetDWORDValue", inParams, null);

                    if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                    {
                        oValue = outParams["uValue"];
                    }
                    else
                    {
                        // GetDWORDValue call failed
                    }
                    break;

                case RegType.REG_BINARY:
                    outParams = mc.InvokeMethod("GetBinaryValue", inParams, null);

                    if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                    {
                        oValue = outParams["uValue"] as byte[];
                    }
                    else
                    {
                        // GetBinaryValue call failed
                    }
                    break;
            }

            return oValue;
        }

        public static RegType GetValueType(ManagementClass mc, RegHive hDefKey, string sSubKeyName, string sValueName)
        {
            ManagementBaseObject inParams = mc.GetMethodParameters("EnumValues");
            inParams["hDefKey"] = hDefKey;
            inParams["sSubKeyName"] = sSubKeyName;

            ManagementBaseObject outParams = mc.InvokeMethod("EnumValues", inParams, null);

            if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
            {
                string[] sNames = outParams["sNames"] as String[];
                int[] iTypes = outParams["Types"] as int[];

                for (int i = 0; i < sNames.Length; i++)
                {
                    if (sNames[i] == sValueName)
                    {
                        return (RegType)iTypes[i];
                    }
                }
                // value not found
            }
            else
            {
                // EnumValues call failed
            }
            // Things have fallen apart and EnumValues didn't get us what we wanted so assume it's a string
            return RegType.REG_SZ;
        }
    }
}
使用系统;
使用制度管理;
使用系统、管理、仪器;
命名空间GetCSDVersion
{
公共枚举注册表:uint
{
HKEY_类_根=0x8000000,
HKEY_当前_用户=0x8000001,
HKEY_本地_机器=0x8000002,
HKEY_用户=0x8000003,
HKEY_当前_配置=0x8000005
}
公共枚举RegType
{
REG_SZ=1,
REG_扩充_SZ,
REG_二进制文件,
雷格·德沃德,
REG_MULTI_SZ=7
}
班级计划
{
静态void Main(字符串[]参数)
{
常量字符串strComputer=“localhost”;
ConnectionOptions选项=新的ConnectionOptions();
options.Impersonation=ImpersonationLevel.Impersonate;
options.EnablePrivileges=true;
//选项。用户名=”;
//选项。密码=”;
ManagementScope myScope=new ManagementScope(“\\\\”+strComputer+“\\root\\default”,选项);
ManagementPath mypath=新的管理路径(“StdRegProv”);
ManagementClass mc=新的ManagementClass(myScope,mypath,null);
object oValue=GetValue(mc,RegHive.HKEY_LOCAL_MACHINE,“软件\\Microsoft\\Windows NT\\CurrentVersion”,“CSDVersion”);
Console.WriteLine(oValue.ToString());
}
公共静态对象GetValue(ManagementClass mc、RegHive hDefKey、字符串sSubKeyName、字符串sValueName)
{
RegType rType=GetValueType(mc、hDefKey、sSubKeyName、sValueName);
ManagementBaseObject inParams=mc.GetMethodParameters(“GetStringValue”);
inParams[“hDefKey”]=hDefKey;
inParams[“sSubKeyName”]=sSubKeyName;
inParams[“sValueName”]=sValueName;
对象oValue=null;
开关(rType)
{
case RegType.REG_SZ:
ManagementBaseObject outParams=mc.InvokeMethod(“GetStringValue”,inParams,null);
if(Convert.ToUInt32(输出参数[“ReturnValue”])==0)
{
oValue=输出参数[“sValue”];
}
其他的
{
//GetStringValue调用失败
}
打破
case RegType.REG_EXPAND_SZ:
outParams=mc.InvokeMethod(“GetExpandedStringValue”,inParams,null);
if(Convert.ToUInt32(输出参数[“ReturnValue”])==0)
{
oValue=输出参数[“sValue”];
}
其他的
{
//GetExpandedStringValue调用失败
}
打破
case RegType.REG_MULTI_SZ:
outParams=mc.InvokeMethod(“GetMultiStringValue”,inParams,null);
if(Convert.ToUInt32(输出参数[“ReturnValue”])==0)
{
oValue=输出参数[“sValue”];
}
其他的
{
//GetMultiStringValue调用失败
}
打破
case RegType.REG_DWORD:
outParams=mc.InvokeMethod(“GetDWORDValue”,inParams,null);
if(Convert.ToUInt32(输出参数[“ReturnValue”])==0)
{
oValue=输出参数[“U值”];
}
其他的
{
//GetDWORDValue调用失败
}
打破
case RegType.REG_二进制:
outParams=mc.InvokeMethod(“GetBinaryValue”,inParams,null);
if(Convert.ToUInt32(输出参数[“ReturnValue”])==0)
{
oValue=输出参数[“uValue”]作为字节[];
}
其他的
{
//GetBinaryValue调用失败
}
打破
}
返回椭圆形;
}
公共静态RegType GetValueType(管理类mc、RegHive hDefKey、字符串sSubKeyName