【问题标题】:Get OS Version / Friendly Name in C#在 C# 中获取操作系统版本/友好名称
【发布时间】:2011-09-13 23:32:00
【问题描述】:

我目前正在开发一个 C# 项目。我想收集用户统计数据以更好地开发软件。我正在使用 C# 的 Environment.OS 功能,但它仅将操作系统名称显示为 Microsoft Windows NT

我希望能够检索操作系统的实际已知名称,比如它是否是Windows XP, Windows Vista or Windows 7等等。

这可能吗?

【问题讨论】:

标签: c# windows operating-system caption


【解决方案1】:
System.OperatingSystem osInfo = System.Environment.OSVersion;

【讨论】:

  • 它为 Win 10 PC 提供“Microsoft Windows NT 6.2.9200.0”。
  • @SaddamBinSyed,将app.manifest XML 文件添加到您的应用程序,并取消注释assembly\compatibility\application XML 节点下Windows 10 的<supportedOS> 行。然后你会得到实际的版本字符串,例如Microsoft Windows NT 10.0.19043.0
【解决方案2】:

System.Management添加引用和使用语句,然后:

public static string GetOSFriendlyName()
{
    string result = string.Empty;
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem");
    foreach (ManagementObject os in searcher.Get())
    {
        result = os["Caption"].ToString();
        break;
    }
    return result;
}

【讨论】:

  • 我的软件的一些用户在运行我的软件时会在ManagementObjectSearcher.Get() 中获得UnauthorizedAccessException。知道为什么会这样吗?
  • @WaltD 用它打开一个问题,并在该问题中包含指向该答案的链接。
  • 根据MSDNif (WMI) is installed on the computer(如果!)中的措辞,可能某些计算机没有安装WMI。对于那些计算机,这种方法可能会失败。
  • @ANeves 我做了,here,但没有人回答。
【解决方案3】:

添加对 Microsoft.VisualBasic 的 .NET 引用。然后调用:

new Microsoft.VisualBasic.Devices.ComputerInfo().OSFullName

来自MSDN

如果计算机上安装了 Windows Management Instrumentation (WMI),则此属性返回有关操作系统名称的详细信息。否则,此属性返回与 My.Computer.Info.OSPlatform 属性相同的字符串,它提供的详细信息比 WMI 所能提供的要少。信息比 WMI 所能提供的要少。

【讨论】:

  • 是一个错误的解决方案,在我的情况下它只返回字符串“Microsoft”。是一个错误的解决方案,这与:My.Computer.Info.OSFullName.
  • @ElektroStudios:请参阅 MSDN:“如果计算机上安装了 Windows Management Instrumentation (WMI),则此属性返回有关操作系统名称的详细信息。否则,此属性返回与 My. Computer.Info.OSPlatform 属性,它提供的详细信息比 WMI 所能提供的要少。"
  • 如何知道计算机上是否安装了(WMI)?
【解决方案4】:
String subKey = @"SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion";
RegistryKey key = Registry.LocalMachine;
RegistryKey skey = key.OpenSubKey(subKey);
Console.WriteLine("OS Name: {0}", skey.GetValue("ProductName"));

希望对你有用

【讨论】:

  • 注册表项对于 64 位和 32 位会略有不同,因为例如 Windows 7 32 位注册表中不存在 Wow6432Node。
【解决方案5】:

您确实应该尽量避免 WMI 用于本地使用。它非常方便,但在性能方面您要付出高昂的代价。想想懒惰税!

Kashish 关于注册表的回答不适用于所有系统。下面的代码应该也包括服务包:

    public string HKLM_GetString(string path, string key)
    {
        try
        {
            RegistryKey rk = Registry.LocalMachine.OpenSubKey(path);
            if (rk == null) return "";
            return (string)rk.GetValue(key);
        }
        catch { return ""; }
    }

    public string FriendlyName()
    {
        string ProductName = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName");
        string CSDVersion = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CSDVersion");
        if (ProductName != "")
        {
            return (ProductName.StartsWith("Microsoft") ? "" : "Microsoft ") + ProductName +
                        (CSDVersion != "" ? " " + CSDVersion : "");
        }
        return "";
    }

【讨论】:

    【解决方案6】:
    public int OStype()
        {
            int os = 0;
            IEnumerable<string> list64 = Directory.GetDirectories(Environment.GetEnvironmentVariable("SystemRoot")).Where(s => s.Equals(@"C:\Windows\SysWOW64"));
            IEnumerable<string> list32 = Directory.GetDirectories(Environment.GetEnvironmentVariable("SystemRoot")).Where(s => s.Equals(@"C:\Windows\System32"));
            if (list32.Count() > 0)
            {
                os = 32;
                if (list64.Count() > 0)
                    os = 64;
            }
            return os;
        }
    

    【讨论】:

      【解决方案7】:
      string text = (string)Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion").GetValue("ProductName");
      

      此代码将获得完整的操作系统名称,如“Windows 8.1 Pro”

      【讨论】:

        最近更新 更多