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 操作系统版本号正确。
![](https://img.haomeiwen.com/i17556386/fe727eb6e07aa01e.png!web)
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,如下图所示:
![](https://img.haomeiwen.com/i17556386/4224eb99bc748839.png!web)
![](https://img.haomeiwen.com/i17556386/902116c56cccbaca.png!web)
![](https://img.haomeiwen.com/i17556386/dc1a248ef9b749d6.png!web)
以上,其他版本的操作系统如果获取有问题,还请留言告知,谢谢!
看我主页简介免费C++学习资源,视频教程、职业规划、面试详解、学习路线、开发工具
每晚8点直播讲解C++编程技术。
网友评论