使用C#获取操作系统版本号的四种方法

 更新时间:2025年11月27日 09:19:58   作者:降薪码农  
这篇文章主要介绍了在C#中检测Windows10和Windows11的方法,包括Environment.OSVersion、Registry、WMI和IsWindows11OrGreater()(WinAPI),每种方法都有各自的优缺点,需要的朋友可以参考下

在 C# 中,可以通过 Environment.OSVersionWMI (Windows Management Instrumentation) 获取 Windows 10 或 Windows 11 的版本信息。但由于 Windows 11 修改了版本号格式(仍是 10.0,单独使用 OSVersion 可能无法区分 Win10 和 Win11,需要额外的方法来判断。

4 种方法检测 Windows 10/11

方法优点缺点
Environment.OSVersion简单快速Win10/Win11 都返回 10.0
Registry直接读取内部版本号(22000+)需要访问注册表
WMI (Win32_OS)官方推荐方式查询较慢
IsWindows11OrGreater() (WinAPI)微软官方方法(推荐)仅支持 .NET 5+

1、Environment.OSVersion(基础判断,无法区分 Win10/Win11)

var os = Environment.OSVersion;
Console.WriteLine($"平台: {os.Platform}");         // Win32NT
Console.WriteLine($"主版本: {os.Version.Major}");  // 10(Win10/Win11 均为 10)
Console.WriteLine($"次版本: {os.Version.Minor}");  // 0(Win10/Win11 均为 0)
Console.WriteLine($"Build: {os.Version.Build}");    // 19044(Win10) / 22000(Win11)

局限性

  • Windows 11 仍返回 10.0(兼容性问题)
  • 只能靠 Build 版本区分:
  • Windows 10: < 22000
  • Windows 11: ≥ 22000(首个正式版是 22000

2、读取注册表(Get Build Number)

Win11 的内部版本号 ≥ 22000

using Microsoft.Win32;

int GetWinBuildNumber()
{
    using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion"))
    {
        return int.Parse(key.GetValue("CurrentBuildNumber").ToString());
    }
}

var build = GetWinBuildNumber();
if (build >= 22000)
    Console.WriteLine("Windows 11");
else
    Console.WriteLine("Windows 10");

3、WMI(通过Win32_OperatingSystem查询)

using System.Management;

string GetOSName()
{
    var searcher = new ManagementObjectSearcher("SELECT Caption, BuildNumber FROM Win32_OperatingSystem");
    foreach (ManagementObject os in searcher.Get())
    {
        string caption = os["Caption"].ToString();
        int build = int.Parse(os["BuildNumber"].ToString());
        
        if (build >= 22000)
            return "Windows 11";
        else
            return "Windows 10";
    }
    return "Unknown";
}

Console.WriteLine(GetOSName());

注意:

  1. 需要 System.Management NuGet 包:
Install-Package System.Management
  1. WMI 查询较慢,但可以获取更多 OS 信息(如系统名称、位数)。

4、使用 WinAPIIsWindows11OrGreater()(推荐 .NET 5+)

如果你使用的是 .NET 5 / 6 / 7,可以直接调用 Windows API:

using System.Runtime.InteropServices;

public static class WinAPI
{
 [DllImport("kernel32.dll")]
 private static extern ulong VerifyVersionInfoW(
 ref OSVERSIONINFOEX lpVersionInfo,
 uint dwTypeMask,
 ulong dwlConditionMask
 );

 [DllImport("kernel32.dll")]
 private static extern ulong VerSetConditionMask(
 ulong dwlConditionMask,
 uint dwTypeBit,
 uint dwConditionMask
 );

 [StructLayout(LayoutKind.Sequential)]
 private struct OSVERSIONINFOEX
 {
 public uint dwOSVersionInfoSize;
 public uint dwMajorVersion;
 public uint dwMinorVersion;
 public uint dwBuildNumber;
 public uint dwPlatformId;
 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
 public string szCSDVersion;
 public ushort wServicePackMajor;
 public ushort wServicePackMinor;
 public ushort wSuiteMask;
 public byte wProductType;
 public byte wReserved;
 }

 public static bool IsWindows11OrGreater()
 {
 const uint VER_MAJORVERSION = 0x0000002;
 const uint VER_MINORVERSION = 0x0000001;
 const uint VER_BUILDNUMBER = 0x0000004;
 const uint VER_GREATER_EQUAL = 0x3;

 ulong conditionMask = 0;
 conditionMask = VerSetConditionMask(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
 conditionMask = VerSetConditionMask(conditionMask, VER_MINORverbsion, VER_GREATER_EQUAL);
 conditionMask = VerSetConditionMask(conditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);

 OSVERSIONINFOEX versionInfo = new OSVERSIONINFOEX();
 versionInfo.dwOSVersionInfoSize = (uint)Marshal.SizeOf(versionInfo);
 versionInfo.dwMajorVersion = 10;
 versionInfo.dwMinorVersion = 0;
 versionInfo.dwBuildNumber = 22000; // Windows 11 ≥ 22000

 return VerifyVersionInfoW(ref versionInfo, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER, conditionMask) != 0;
 }
}

// 调用
bool isWin11 = WinAPI.IsWindows11OrGreater();
Console.WriteLine(isWin11 ? "Windows 11" : "Windows 10");

优点

  • 微软官方推荐方法
  • 精确判断 Win11
    适用 .NET 5 / 6 / 7

最终推荐方案

场景推荐方法
简单判断(仅需 Build)Registry / OSVersion.Build
精确判断(兼容 Win11)IsWindows11OrGreater()(WinAPI)
多 OS 信息(名称、版本)WMI (Win32_OS)

最优解

如果你的应用 仅针对 Windows 10/11推荐直接用注册表或 Build 判断

int build = GetWinBuildNumber(); // 方法2
Console.WriteLine(build >= 22000 ? "Windows 11" : "Windows 10");

更简单,无需复杂 API 调用!

额外(检测 Win10/11 版本号映射)

Windows 版本Build 号
Windows 10 180917763
Windows 10 190918363
Windows 10 200419041
Windows 10 21H219044
Windows 11 21H222000
Windows 11 22H222621

所有 Win11 Build ≥ 22000

以上就是使用C#获取操作系统版本号的四种方法的详细内容,更多关于C#获取系统版本号的资料请关注脚本之家其它相关文章!

相关文章

  • 深入理解C#表达式树的使用

    深入理解C#表达式树的使用

    表达式树是C#编程语言中一个强大的特性,本文将深入探讨表达式树的基本概念、创建方法、节点类型、遍历技巧以及在C#中的应用示例,感兴趣的可以了解一下
    2024-03-03
  • 基于C#制作一个休息提醒闹钟的详细步骤

    基于C#制作一个休息提醒闹钟的详细步骤

    小闹钟大家都应该很熟悉,它包括时间、事件,当达到某某时间时,事件发生了,并且还有一个提示信息,下面这篇文章主要给大家介绍了关于如何基于C#制作一个休息提醒闹钟的详细步骤,需要的朋友可以参考下
    2023-02-02
  • C#的TimeSpan案例详解

    C#的TimeSpan案例详解

    这篇文章主要介绍了C#的TimeSpan案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 如何用C#实现压缩文件

    如何用C#实现压缩文件

    话说当今压缩市场三足鼎立,能叫上名号的有zip、rar、7z。其中zip是压缩界的鼻祖,在各大平台上的流行度最广,rar是商业软件,压缩率和效率都是很高的。7z是开源的,属于后起之秀。这篇文章介绍了如何使用ICSharpCode组件,在windows平台下zip的压缩与解压的方法
    2021-06-06
  • Unity打包代码到DLL的实现

    Unity打包代码到DLL的实现

    本文主要介绍了Unity打包代码到DLL的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • C#泛型集合Dictionary<K,V>的使用方法

    C#泛型集合Dictionary<K,V>的使用方法

    这篇文章主要介绍了C#泛型集合Dictionary<K,V>的使用方法,本文讲解了Dictionary的多种操作方法,需要的朋友可以参考下
    2014-10-10
  • C#代码实现重新排列Excel中的列

    C#代码实现重新排列Excel中的列

    适当调整 Excel 中列的顺序可以提高数据的可读性,本文将介绍如何在 C# 和 VB.NET 中以编程方式重新排列 Excel 中的列,感兴趣的小伙伴可以了解下
    2026-05-05
  • C#判断一个字符串是否包含另一个字符串的方法

    C#判断一个字符串是否包含另一个字符串的方法

    这篇文章主要介绍了C#判断一个字符串是否包含另一个字符串的方法,涉及C#中IndexOf方法的使用技巧,非常简单实用,需要的朋友可以参考下
    2015-04-04
  • Unity实现物体运动时画出轨迹

    Unity实现物体运动时画出轨迹

    这篇文章主要为大家详细介绍了Unity实现物体运动时画出轨迹,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C#操作SQLite数据库方法小结

    C#操作SQLite数据库方法小结

    这篇文章介绍了C#操作SQLite数据库的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论