【问题标题】:How to get Windows Version - as in "Windows 10, version 1607"?如何获取 Windows 版本 - 如“Windows 10,版本 1607”?
【发布时间】:2017-02-08 06:21:25
【问题描述】:

似乎提到 Windows 的“版本”一词用于不同的事物。例如,Windows 10“周年更新”被 Microsoft 标记为“版本 1607”(例如here)。但是,如果我尝试使用以下代码获取“版本”(在安装了周年更新的 PC 上),则不会返回任何类似于“1607”的内容。

// Get Version details
Version ver = os.Version;
Console.WriteLine("Major version: " + ver.Major);
Console.WriteLine("Major Revision: " + ver.MajorRevision);
Console.WriteLine("Minor version: " + ver.Minor);
Console.WriteLine("Minor Revision: " + ver.MinorRevision);
Console.WriteLine("Build: " + ver.Build);

我明白了:

Major version: 6
Major Revision: 0
Minor version: 2
Minor Revision: 0
Build: 9200

如何获得“版本 1607”中的 Windows 10“版本”?

谢谢!

【问题讨论】:

  • 如果您希望 Environment.OSVersion 反映正确的 Windows Build 版本,请在此处查看有关创建应用清单文件的答案stackoverflow.com/questions/40672109/…。如果用户获得内部更新,可能比年份和月份样式版本号更有用

标签: c# windows


【解决方案1】:

根据MSDN official link,每个 Windows 版本都有一个特定的版本号。在 dot net 中,这可以使用 Environment.OSVersion 对象读取。

Console.WriteLine("OSVersion: {0}", Environment.OSVersion);
//output: OSVersion: Microsoft Windows NT 6.2.9200.0

您要查找的内容称为 ReleaseID,而不是 Windows 版本。 这可以从注册表项中读取:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseId

using Microsoft.Win32;

string releaseId = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ReleaseId", "").ToString();
Console.WriteLine(releaseId);

【讨论】:

  • 太棒了!经验证可以在我的电脑上使用“Windows 10 版本 1511”和另一台电脑上的“版本 1607”——这是预期的。
  • @Stavm — 很棒的信息。顺便说一句,Microsoft 确实ReleaseId(例如“1803”)称为版本,有关详细信息,请参阅Windows 10 release information
  • 另外,Windows 10 的原始 (RTM) 版本没有有这个键(就像 Windows 7 或其他 Windows 版本一样)
  • 在 Win7 上,字符串 releaseId 返回空。
  • 这不再有效。微软打破了 21h1 的 releaseid。您必须使用 diplayversion 代替 21h1,这在未来也可能会中断,并且不适用于较旧的 ose。
【解决方案2】:

除了 Scott 的回答之外,您还可以获得产品名称(例如 Windows 10 Pro)(*我不相信,因为 Scott 是提到注册表路径的人 + 我在下面重用他的代码) :

using Microsoft.Win32;

string ProductName = 
Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName", "").ToString();
Console.WriteLine(ProductName);

【讨论】:

  • 处理 32 / 64 位; 64 位操作系统中的 32 位应用程序可以检索错误值。检查此线程stackLink
【解决方案3】:
 private static ManagementObject GetMngObj(string className)
    {
        var wmi = new ManagementClass(className);

        foreach (var o in wmi.GetInstances())
        {
            var mo = (ManagementObject)o;
            if (mo != null) return mo;
        }

        return null;
    }

    public static string GetOsVer()
    {
        try
        {
            ManagementObject mo = GetMngObj("Win32_OperatingSystem");

            if (null == mo)
                return string.Empty;

            return mo["Version"] as string;
        }
        catch (Exception e)
        {
            return string.Empty;
        }
    }

如何使用:

Console.WriteLine(GetOsVer());

结果:1​​0.0.0.1299

【讨论】:

    【解决方案4】:
    string Version = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion", "ProductName", null);
    

    提供类似“Windows 10 Enterprise”的名称。

    【讨论】:

    • 这已在几个月前作为答案发布here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2011-12-29
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多