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

本文关键字:版本 获取 操作系统 | 更新日期: 2023-09-27 17:58:57

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

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

这可能吗?

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

System.Management 添加一个引用和 using 语句,然后:

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;
}

您确实应该尝试避免本地使用 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 "";
    }

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

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

从 MSDN:

如果计算机上安装了 Windows 管理规范 (WMI(,则此属性返回有关操作系统名称的详细信息。否则,此属性返回与 My.Computer.Info.OSPlatform 属性相同的字符串,该属性提供的信息比 WMI 可以提供的详细信息少。比 WMI 可以提供的信息少。

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"));

我希望你觉得这有用

System.OperatingSystem osInfo = System.Environment.OSVersion;
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;
    }

虽然这不是检测操作系统名称的完全 C# 方法,但以下代码可满足我的需求-

public static string GetFriendlyOSName()
    {
        System.Diagnostics.Process cmd = new System.Diagnostics.Process();
        cmd.StartInfo.FileName = "cmd.exe";
        cmd.StartInfo.Arguments = "/C systeminfo | findstr /c:'"OS Name'"";
        cmd.StartInfo.RedirectStandardOutput = true;
        cmd.StartInfo.UseShellExecute = false;
        cmd.StartInfo.CreateNoWindow = true;
        cmd.Start();
        cmd.WaitForExit();
        string output = cmd.StandardOutput.ReadToEnd();
        cmd.Close();
        return output.Split(new[] { ':' }, 2)[1].Trim();
    }

注意:

  1. 此代码仅适用于 Windows 操作系统。
  2. 该代码仅在 Windows 10、11 上进行测试。
string text = (string)Registry.LocalMachine.OpenSubKey("SOFTWARE''Microsoft''Windows NT''CurrentVersion").GetValue("ProductName");

此代码将获得完整的操作系统名称,如下所示"Windows 8.1 Pro">