C# 获取 Windows 操作系统版本和名称

1. 概述

从 Windows 10 开始,微软已经弃用了 GetVersionEx 方式获取 Windows 系统版本 [官方解释]。这就导致网上一大批C#获取 Windows 版本的代码把 Windows 10 识别为 Windows 8。比如我的电脑 Windows 10 就被识别成 6.2.9200,进而判断出是 Windows 8。

按照微软官方论坛提示,可以通过 WMI(Windows Management Instruction) 获取正确系统的版本号。下面把传统获取方式、WMI获取方式和直接获取操作系统名称的三个方法列出来。

2. 展示

2.1 传统获取方式(弃用)

传统获取 Windows 系统版本的方法:先获取 Windows 系统的版本号,再通过版本号比对出操作系统名称。

publicstaticstringget_OSVersion(){//Get Operating system information.OperatingSystem os = Environment.OSVersion;//Get version information about the os.Version vs = os.Version;//Variable to hold our return valuestringoperatingSystem ="";if(os.Platform == PlatformID.Win32Windows)    {//This is a pre-NT version of Windowsswitch(vs.Minor)        {case0:                operatingSystem ="95";break;case10:if(vs.Revision.ToString() =="2222A")                    operatingSystem ="98SE";elseoperatingSystem ="98";break;case90:                operatingSystem ="Me";break;default:break;        }    }elseif(os.Platform == PlatformID.Win32NT)    {switch(vs.Major)        {case3:                operatingSystem ="NT 3.51";break;case4:                operatingSystem ="NT 4.0";break;case5:if(vs.Minor ==0)                    operatingSystem ="2000";elseoperatingSystem ="XP";break;case6:if(vs.Minor ==0)                    operatingSystem ="Vista";elseif(vs.Minor ==1)                    operatingSystem ="7";elseif(vs.Minor ==2)                    operatingSystem ="8";elseoperatingSystem ="8.1";break;case10:                operatingSystem ="10";break;default:break;        }    }//Make sure we actually got something in our OS check//We don't want to just return " Service Pack 2" or " 32-bit"//That information is useless without the OS version.if(operatingSystem !="")    {//Got something.  Let's prepend "Windows" and get more info.operatingSystem ="Windows "+ operatingSystem;//See if there's a service pack installed.if(os.ServicePack !="")        {//Append it to the OS name.  i.e. "Windows XP Service Pack 3"operatingSystem +=" "+ os.ServicePack;        }//Append the OS architecture.  i.e. "Windows XP Service Pack 3 32-bit"//operatingSystem += " " + getOSArchitecture().ToString() + "-bit";}//Return the information we've gathered.returnoperatingSystem;}

3.2 通过 WMI 获取操作系统版本

publicstaticstringget_OSVersion(){try{        ManagementObject mo = GetMngObj("Win32_OperatingSystem");if(null== mo)returnstring.Empty;returnmo["Version"]asstring;    }catch(Exception e)    {returnstring.Empty;    }}

如下图所示,获取 Windows 10 操作系统版本号正确。

3.3 直接获取操作系统名称

根据下面的 Windows 操作系统名称和版本好的对应关系表,可以发现很多不同系列的操作系统拥有相同的主版本号和子版本号,因此通过比对版本号的方式来判断操作系统名称是很不靠谱。

+------------------------------------------------------------------------------------+|                          |PlatformID|  Major version  |Minor version|

+------------------------------------------------------------------------------------+

|Windows95|  Win32Windows  |4|          0        || Windows 98              |Win32Windows|        4        |10|

|Windows Me|  Win32Windows  |4|        90        || Windows NT 4.0          |Win32NT|        4        |0|

|Windows2000|  Win32NT        |5|          0        || Windows XP              |Win32NT|        5        |1|

|Windows XP64-Bit Edition|  Win32NT        |5|          1        || Windows 2003            |Win32NT|        5        |2|

|Windows Server2003|  Win32NT        |5|          2        || Windows Server 2003 R2  |Win32NT|        5        |2|

|Windows2003|  Win32NT        |5|          2        || Windows Vista            |Win32NT|        6        |0|

|Windows2008|  Win32NT        |6|          0        || Windows Server 2008      |Win32NT|        6        |0|

|Windows7|  Win32NT        |6|          1        || Windows 2008 R2          |Win32NT|        6        |1|

|Windows Server2008R2|  Win32NT        |6|          1        || Windows 8                |Win32NT|        6        |2|

|Windows Server2012|  Win32NT        |6|          2        || Windows 8.1              |Win32NT|        6        |3|

|Windows Server2012R2|  Win32NT        |6|          3        |+------------------------------------------------------------------------------------+| Windows Server 2016 Technical Preview|Win32NT| 10            |0|

|Windows10|  Win32NT        |10|          0        |+------------------------------------------------------------------------------------+

本文提供了一种简单获取操作系统名称的方式:

newComputerInfo().OSFullName

需要引用库:using Microsoft.VisualBasic.Devices;

实际测试了 Windows 10 、Windows 2012 R2 和 Windows 2008 R2,如下图所示:

以上,其他版本的操作系统如果获取有问题,还请留言告知,谢谢!

看我主页简介免费C++学习资源,视频教程、职业规划、面试详解、学习路线、开发工具

每晚8点直播讲解C++编程技术。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容