我有一些场景,我想具体了解操作系统的主要/次要版本和内部版本号等。
从 Windows 8.1 开始GetVersion
并GetVersionEx
已被弃用,说明:
[ GetVersion / GetVersionEx可能会更改或无法用于 Windows 8.1 之后的版本。相反,使用 Version Helper 函数]
没有版本帮助程序 API可以帮助我获取操作系统版本号,而是帮助我验证或了解我的版本是否相同或高于某个提到的版本。可以做什么?
我有一些场景,我想具体了解操作系统的主要/次要版本和内部版本号等。
从 Windows 8.1 开始GetVersion
并GetVersionEx
已被弃用,说明:
[ GetVersion / GetVersionEx可能会更改或无法用于 Windows 8.1 之后的版本。相反,使用 Version Helper 函数]
没有版本帮助程序 API可以帮助我获取操作系统版本号,而是帮助我验证或了解我的版本是否相同或高于某个提到的版本。可以做什么?
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 列表
{e2011457-1546-43c5-a5fe-008deee3d3f0}
{35138b9a-5d96-4fbd-8e2d-a2440225f93a}
{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}
{1f676c76-80e1-4239-95bb-83d0f6d0da78}
{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}
至于 Windows Server 2019,我不确定是否发布了新的 GUID。如果您知道更多,请发表评论!
有一个名为GetProductInfo的新函数,它返回版本信息。
如果您想测试特定版本,您甚至应该使用VerifyVersionInfo
很容易创建一个结构来检查特定的操作系统版本是否正在运行。VerifyVersionInfo 采用版本结构,您可以轻松检查 VER_GREATER_EQUAL 和 VER_LESS_EQUAL
另请注意,如果您在清单的兼容性部分定义了正确的受支持操作系统条目,则 GetVersionEx 不在 Windows 8.1 系统上。但它可能存在于未来的操作系统版本中!
有关GUID 的列表,请参阅针对 Windows 8.1 的应用程序。这里也有介绍。
应用程序清单的 GUID 列表
{e2011457-1546-43c5-a5fe-008deee3d3f0}
{35138b9a-5d96-4fbd-8e2d-a2440225f93a}
{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}
{1f676c76-80e1-4239-95bb-83d0f6d0da78}
{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}
查看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();