En .NET Framework, para obtener la versión del sistema operativo, puede usar Environment.OSVersion con los valores Major y Minor que le indican la versión de Windows (es decir, 6.1 = Windows 7, 10.0 = Windows 10). Aunque Windows 11 se ha lanzado (canales de desarrollo y beta) durante más de un mes, la documentación no se ha actualizado para mencionar cómo detectar Windows 11.
Para la API de Windows, GetVersion ha quedado obsoleto para siempre e incluso las API auxiliares de la versión solo suben a IsWindows10OrGreater . ¿Existe una verificación simple para averiguar la versión principal de Windows, en particular, Windows 11? Alguien tenía una pregunta similar pero para Delphi (Cómo detectar Windows 11 usando Delphi 10.3.3 ) y la respuesta aceptada fue todos los hacks. ¿Por qué diablos es tan difícil para Microsoft proporcionar una API simple para devolver la versión actual del sistema? GetVersion nunca debería haber quedado obsoleto.
Lo más probable es que esto no sea perfecto, pero es una solución que he estado usando durante un tiempo:
Environment.OSVersion.Version.Build >= 22000;Windows 11 comienza en el número de compilación 22000 y Windows 10 termina aproximadamente en el número de compilación 21390, por lo que esto solo detectará las compilaciones de Windows 11 que yo sepa.
Sin embargo, compruebe si es un sistema Windows en primer lugar, otro sistema operativo podría tener un número de compilación más alto.
Puede usar RtlGetVersion() GetVersion/Ex() supportedOS ntdll.dll
RtlGetVersion() dio los mismos resultados para Windows 10 y 11 que para mí. Lo llamé desde el código C# como se describe aquí https://stackoverflow.com/a/49641055 . Probé la propiedad Caption de la clase Win32_OperatingSystem de WMI.
using (var objOS = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")) { foreach (ManagementObject objMgmt in objOS.Get()) { Console.WriteLine("{0}: {1}", objMgmt.Properties["Caption"].Name, objMgmt.Properties["Caption"].Value); } }Para Windows 10 obtuve "Microsoft Windows 10 Enterprise" y para Windows 11 "Microsoft Windows 11 Pro". Probablemente podría usar la propiedad Nombre, pero contiene demasiada información, como la carpeta de Windows y la unidad del sistema, o algo así.
Usa este código:
public static bool IsWindows11() { var reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion"); var currentBuildStr = (string)reg.GetValue("CurrentBuild"); var currentBuild = int.Parse(currentBuildStr); return currentBuild >= 22000; }Esto se basa en mis hallazgos en HKLM\Software\Microsoft\Windows NT\CurrentVersion: ¿Cuál es la diferencia entre CurrentBuild y CurrentBuildNumber?
Y tenga en cuenta que este código puede generar excepciones en caso de que la clave de registro no exista o en caso de que el valor no sea un número. Esto no debería ocurrir en un sistema normal. Pero si quiere estar seguro, puede deformarlo en un bloque de intento y captura.