C# 获取Windows系统版本注意事项

首先通过微软官方文档:https://learn.microsoft.com/zh-cn/windows/win32/sysinfo/operating-system-version了解各个操作系统对应的版本号

下面介绍3种获取版本号的方式及弊端

  1. Environment.OSVersion.Version

    复制代码
             OperatingSystem os = Environment.OSVersion;
    
             // 判断操作系统版本
             if (os.Version.Major == 10 && os.Version.Build < 22000)
             {
                 textBlock.Text = "当前操作系统是 Windows 10";
             }
             else if (os.Version.Major == 10 && os.Version.Build >= 22000)
             {
                 textBlock.Text = "当前操作系统是 Windows 11";
             }
             else
             {
                 textBlock.Text = $"当前操作系统既不是  Windows 10也不是 Windows 11";
             }

该方式适合.NET Framework,并且必须添加应用程序清单文件,并且需要把程序应用程序清单文件里面的supportedOS项取消注释(默认是注释的)

  1. System.Runtime.InteropServices.RuntimeInformation.OSDescription

    复制代码
             var osDescription = System.Runtime.InteropServices.RuntimeInformation.OSDescription;
             var osDescs = osDescription.Split(' ');
             foreach (var osDesc in osDescs)
             {
                 if (!osDesc.Contains(".")) continue;
                 var versions = osDesc.Split('.');
                 if (versions.Length < 2) continue;
                 if (int.Parse(versions[0]) == 10 && int.Parse(versions[2]) < 22000)
                 {
                     textBlock.Text = "当前操作系统是 Windows 10";
                 }
                 else if (int.Parse(versions[0]) == 10 && int.Parse(versions[2]) >= 22000)
                 {
                     textBlock.Text = "当前操作系统是 Windows 11";
                 }
                 else
                 {
                     textBlock.Text = $"当前操作系统既不是  Windows 10也不是 Windows 11";
                 }
             }

该方式适合.NET Core以上(.net framework 4.7以上)

  1. 从注册表中获取版本信息

    复制代码
             using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion"))
             {
                 string productName = key.GetValue("ProductName") as string;
                 int majorVersion = (int)key.GetValue("CurrentMajorVersionNumber");
                 var buildNumber = int.Parse(key.GetValue("CurrentBuildNumber").ToString());
    
                 if (!string.IsNullOrEmpty(productName) && productName.ToLower().Contains("windows"))
                 {
                     if (majorVersion > 10 || majorVersion == 10 && buildNumber >= 22000)
                     {
                         textBlock.Text = "当前操作系统是 Windows 11";
                     }
                     else if (majorVersion == 10 && buildNumber < 22000)
                     {
                         textBlock.Text = "当前操作系统是 Windows 10";
                     }
                     else
                     {
                         textBlock.Text = $"当前操作系统既不是  Windows 10也不是 Windows 11";
                     }
                 }
             }

该方式暂时没发现问题,但是需要使用版本号推断是Win11

4. 从WMI获取系统版本(推荐)

复制代码
            foreach (var o in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get())
            {
                var obj = (ManagementObject)o;

                // Microsoft Windows 11 企业版
                var caption = obj.GetPropertyValue("Caption");

                // 10.0.22000
                var version = obj.GetPropertyValue("Version");
                break;
            }

该方式可以准确获取Windows版本描述和版本号

相关推荐
小徐不徐说1 天前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang1 天前
Notes: Python pybind11 import C++ module
开发语言·c++·python
Wang's Blog1 天前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象3271 天前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
Dxy12393102161 天前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷1 天前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
云和数据.ChenGuang1 天前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain
nice_lcj5201 天前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
樱花树下的数学喵1 天前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++
jimy11 天前
C++ 报错的 qualifiers 的意思
开发语言·c++