在C#中获取操作系统版本/友好名称

Boa*_*rdy 24 c# windows operating-system caption

我目前正在开发一个C#项目.我想收集用户统计信息以更好地开发软件.我正在使用Environment.OSC#的功能,但它只显示操作系统名称,如Microsoft Windows NT

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

这可能吗?

Geo*_*ett 50

添加引用和使用语句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;
}
Run Code Online (Sandbox Code Playgroud)


dom*_*key 12

您应该尽量避免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 "";
    }
Run Code Online (Sandbox Code Playgroud)

  • 在 Windows 11 上,这将报告,例如“Windows 10 Enterprise” (2认同)

Geo*_*rge 9

向Microsoft.VisualBasic添加.NET引用.然后打电话:

new Microsoft.VisualBasic.Devices.ComputerInfo().OSFullName
Run Code Online (Sandbox Code Playgroud)

来自MSDN:

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