4

我将在 c# 中检查我的 Windows 操作系统名称(Windows 8 Pro),但它给出了一个错误,这是怎么回事?

    RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion", true);
    string currentKey;
    currentKey = reg.GetValue("ProductName", true).ToString();

    textBox1.Text = currentKey;
4

5 回答 5

5

您可以为此使用 Environment.OSVersion。

编辑: 获取操作系统名称在这里得到解答:Stackoverflow OS Friendly name

于 2013-10-23T20:03:39.777 回答
3

我将引用 MSDN:

Registry.GetValue()-方法

在指定的注册表项中检索与指定名称关联的值。如果在指定的键中找不到名称,则返回您提供的默认值,如果指定的键不存在,则返回空引用(在 Visual Basic 中为 Nothing)。

这意味着您尝试获取的值不可用。

编辑可能的解决方案:

来源:如何获得“友好”的操作系统版本名称?

private string GetOSName()
{
    var name = (from x in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<ManagementObject>()
                select x.GetPropertyValue("Caption")).First();
    return name != null ? name.ToString() : "Unknown";
}

要检查操作系统是 32 位还是 64 位,请使用以下代码:

private string GetOSBitness()
{
    if (Environment.Is64BitOperatingSystem == true)
        return " x64";
    else
        return " x86";
}

上面的代码将返回(至少在我的系统上):

微软 Windows 7 专业版 x64

于 2013-10-23T20:05:57.677 回答
2

您可以通过查询 Windows Management Instrumentation 界面获取操作系统的商业名称,包括服务包信息:

    public static string GetOSNameAndVersion()
    {
        string str = Environment.OSVersion.ToString();
        try
        {
            var obj2 = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
                        .Get()
                        .Cast<System.Management.ManagementObject>()
                        .First<System.Management.ManagementObject>();
            str = ((string)obj2["Caption"]).Trim();
            string spMaj = obj2["ServicePackMajorVersion"].ToString();
            string spMin = obj2["ServicePackMinorVersion"].ToString();
            string osVer = obj2["Version"].ToString();
            if (((spMaj != "") && (spMaj != "0")) || ((spMin != "") && (spMin != "0")))
            {
                str = str + " SP " + spMaj;
                if ((spMin != "") && (spMin != "0"))
                {
                    str = str + "." + spMin;
                }
            }
            if (Environment.Is64BitOperatingSystem)
            {
                str = str + " x64";
            }
            else
            {
                str = str + " x86";
            }
            str = str + " (" + osVer + ")";
        }
        catch
        {
            // TODO: Implement your own exception handling here

            // the way it is, the method will fall back on to the Environment.OSVersion
            //   if the query fails
        }
        if (str.StartsWith("Microsoft"))
        {
            str = str.Substring("Microsoft".Length + 1);
        }
        return str;
    }
于 2013-10-23T20:08:58.563 回答
2

入侵注册表可能是错误的解决方案。

但为什么会失败?由于您使用 Registry.LocalMachine,因此 HKLM 是错误的。删除 HKLM。这是一个明显的错误。

最重要的是要注意注册表重定向。也许您的进程是 32 位的,但您要查找的值在注册表的 64 位视图中。使用 RegistryView 枚举来访问 64 位视图。

于 2013-10-23T20:05:47.800 回答
1

您的程序受我假设的影响,NullReferenceException因为程序找不到注册表子项,因为您提供的路径不正确。

您不需要在配置单元路径中指定配置单元,因为您的相对路径已经是本地配置单元。从路径中排除蜂巢,如下所示:

Registry.LocalMachine.OpenSubKey(
    @"SOFTWARE\Microsoft\Windows NT\CurrentVersion", true);

根据您的程序的访问权限和操作系统配置,您的程序可能仍会由于您的程序没有足够的访问权限而引发异常。

于 2013-10-23T20:06:20.163 回答