10

我有一些场景,我想具体了解操作系统的主要/次要版本和内部版本号等。

从 Windows 8.1 开始GetVersionGetVersionEx已被弃用,说明:

[ GetVersion / GetVersionEx可能会更改或无法用于 Windows 8.1 之后的版本。相反,使用 Version Helper 函数]

没有版本帮助程序 API可以帮助我获取操作系统版本号,而是帮助我验证或了解我的版本是否相同或高于某个提到的版本。可以做什么?

4

3 回答 3

6

API GetVersionEx()继续在 Windows 8.1+ 中工作,但 Microsoft 已更改其功能。来自 MSDN(重点是我的):

随着 Windows 8.1 的发布,GetVersionEx API 的行为发生了变化,它将为操作系统版本返回的值。GetVersionEx 函数返回的值现在取决于应用程序的显示方式

未针对 Windows 8.1 显示的应用程序将返回 Windows 8 操作系统版本值 (6.2)。一旦针对给定的操作系统版本显示应用程序,GetVersionEx 将始终返回应用程序在未来版本中显示的版本。要为 Windows 8.1 显示您的应用程序,请参阅为 Windows 8.1 定位您的应用程序。

您需要做的是向您的应用程序 (.exe/.dll) 二进制文件(通过清单 XML 信息)添加正确的 GUID。换句话说,如果您明确声明您的应用程序支持 8.1,GetVersionEx() 将在 Windows 8.1 上运行时返回正确的信息。如果你不这样做,GetVersionEx() 会骗你。

有关GUID 的列表,请参阅针对 Windows 8.1 的应用程序。这里 和这里也有介绍。

懒人的 GUID 列表

  • 远景/服务器 2008:{e2011457-1546-43c5-a5fe-008deee3d3f0}
  • Windows 7 / 服务器 2008 R2:{35138b9a-5d96-4fbd-8e2d-a2440225f93a}
  • 视窗 8 / 服务器 2012:{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}
  • Windows 8.1 / 服务器 2012 R2:{1f676c76-80e1-4239-95bb-83d0f6d0da78}
  • 视窗 10 / 服务器 2016:{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}

至于 Windows Server 2019,我不确定是否发布了新的 GUID。如果您知道更多,请发表评论!

于 2014-12-02T17:37:33.213 回答
0

有一个名为GetProductInfo的新函数,它返回版本信息。

如果您想测试特定版本,您甚至应该使用VerifyVersionInfo

很容易创建一个结构来检查特定的操作系统版本是否正在运行。VerifyVersionInfo 采用版本结构,您可以轻松检查 VER_GREATER_EQUAL 和 VER_LESS_EQUAL

另请注意,如果您在清单的兼容性部分定义了正确的受支持操作系统条目,则 GetVersionEx 不在 Windows 8.1 系统上。但它可能存在于未来的操作系统版本中!

有关GUID 的列表,请参阅针对 Windows 8.1 的应用程序。这里也有介绍。

应用程序清单的 GUID 列表

  • 远景:{e2011457-1546-43c5-a5fe-008deee3d3f0}
  • Windows 7的:{35138b9a-5d96-4fbd-8e2d-a2440225f93a}
  • 视窗 8:{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}
  • 视窗 8.1:{1f676c76-80e1-4239-95bb-83d0f6d0da78}
  • 视窗 10:{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}
于 2014-12-02T12:27:48.973 回答
-10

查看codeproject.com 上的这篇文章,它适用于 Windows 8:

1) 下载.DLL并将其添加到您的项目中。

2)使用此代码获取操作系统信息

StringBuilder sb = new StringBuilder(String.Empty);
sb.AppendLine("Operation System Information");
sb.AppendLine("----------------------------");
sb.AppendLine(String.Format("Name = {0}", OSVersionInfo.Name));
sb.AppendLine(String.Format("Edition = {0}", OSVersionInfo.Edition));
if (OSVersionInfo.ServicePack!=string.Empty)
sb.AppendLine(String.Format("Service Pack = {0}", OSVersionInfo.ServicePack));
else
sb.AppendLine("Service Pack = None");
sb.AppendLine(String.Format("Version = {0}", OSVersionInfo.VersionString));
sb.AppendLine(String.Format("ProcessorBits = {0}", OSVersionInfo.ProcessorBits));
sb.AppendLine(String.Format("OSBits = {0}", OSVersionInfo.OSBits));
sb.AppendLine(String.Format("ProgramBits = {0}", OSVersionInfo.ProgramBits));

textBox1.Text = sb.ToString();
于 2014-12-02T13:45:36.347 回答