Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

237
Vistas
¿Cómo puedo encontrar el nombre del producto de Windows en Windows 11?

Windows 11, lanzado ayer, se informa a sí mismo como Windows 10.0 en casi todas partes: RtlGetVersion dice 10.0, y si le pregunta a VerifyVersionInfo si tiene 11.0 o superior, dice que no.

Parece que no hay un nuevo GUID para insertar en app.manifest para decir "hey, soy compatible con Windows 11" como lo hubo para Windows 7, 8, 8.1 y 10.

Actualmente confío en HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName para decirme cuál es la versión actual de Windows, pero en mi máquina que actualicé, todavía dice "Windows 10 Enterprise", no "Windows 11 Empresa".

Parece que solo hay un lugar en el registro que contiene el texto "Windows 11" y esa es la sección BCD (configuración de arranque), que también se puede cambiar de nombre, así que no quiero tocar eso.

Hasta ahora solo he identificado un puñado de métodos para saber si estoy ejecutando Windows 11:

  1. Invoque WMI para consultar Win32_OperatingSystem y verifique la propiedad Nombre, que simplemente dice "Windows 11". Esto está incompleto (no incluye el SKU como "Enterprise") y WMI es relativamente lento y un poco frágil, por lo que no es una solución aceptable para mi caso de uso.

  2. Verifique el número de compilación para ver si está por encima de 21996 (compilaciones beta) o 22000 (primer lanzamiento público). Como se mencionó anteriormente, esto no incluirá el SKU, y requeriría algunos trucos manuales para construir la cadena completa.

  3. Ejecute sysinfo y analice la salida. Esto es bastante lento y posiblemente frágil (no lo he comprobado, pero la salida puede estar localizada en diferentes idiomas).

  4. winver sabe, pero es una aplicación GUI, por lo que no puedo consultarla exactamente mediante programación.

¿Alguien tiene alguna otra idea sobre cómo sacar la cadena "Windows 11 Enterprise" (o "Windows 11 Pro", etc., según sea el caso) de mi sistema operativo de manera eficiente y completa? ¿De dónde lo obtienen WMI, sysinfo y winver?

Necesito hacer esto desde una biblioteca .NET, pero las llamadas a funciones nativas/P/Invokes son soluciones aceptables.

over 4 years ago · Santiago Trujillo
4 Respuestas
Responde la pregunta

0

tldr: el uso de EditionID y CurrentBuild de CurrentVersion en el registro parece ser una forma confiable de determinar Win10 vs Win11 y la "edición" del software. EditionID es "Profesional" en Windows 10 Pro y Windows 11 Pro, y CurrentBuild >= ~22000 le dice si es 10 u 11.

La colección de valores de registro en HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion revela lo que parece una falta de planificación por parte de Microsoft. Existe ReleaseId , que es un número que cambió con cada versión de Windows 10 (por ejemplo, 1903 , 1909 , 2004 ,...) hasta su último cambio para Windows 10 20H2, donde cambió a 2009 . Al mismo tiempo, se agregó DisplayVersion y se configuró en 20H2 .

Luego se lanzó Windows 10 21H1, y ReleaseId inexplicablemente permaneció en 2009 .

El hecho de que las versiones actuales de Windows 10 y Windows 11 puedan tener la misma DisplayVersion (por ejemplo, 21H2 cuando Windows 10 21H2 se lance pronto) y ProductName (por ejemplo, Windows 10 Pro ) es realmente desconcertante. (Gracias @yaakov por darse cuenta de mi error al decir que era 21H1).

over 4 years ago · Santiago Trujillo Denunciar

0

Dejo esto aquí para que pueda encontrarlo más tarde:

Parece que Windows mismo (por ejemplo, winver) obtiene esta información de la marca de Windows, específicamente de la tabla de recursos en %WinDir%\Branding\Basebrd\en-US\basebrd.dll.mui .

Para acceder a este, se pueden usar las API privadas en %WinDir%\System32\winbrand.dll . Específicamente, la función BrandingFormatString que acepta una cadena ancha (LPW[C]STR) y devuelve una cadena ancha.

por ejemplo BrandingFormatString("%WINDOWS_LONG%") devuelve "Windows 11 Pro" en la PC de mi casa.

No conozco la semántica del ciclo de vida de la cadena resultante, es decir, si/cuándo/cómo debe liberarse.

El siguiente código sirve como prueba de concepto funcional (C# 9.0):

 using System; using System.Runtime.InteropServices; [DllImport("winbrand.dll", CharSet = CharSet.Unicode)] [DefaultDllImportSearchPaths(DllImportSearchPath.System32)] static extern string BrandingFormatString(string format); Console.WriteLine(BrandingFormatString("Hello World from %WINDOWS_LONG%!"));
over 4 years ago · Santiago Trujillo Denunciar

0

Creé una herramienta de soporte remoto para administradores de escritorio (ver http://www.appslife-rdt.appspot.com ) En VB.Dot.Net usé una llamada al espacio WMI Win32_OperatingSystem y obtuve el valor "Nombre". Luego, esto debe dividirse para obtener el primer objeto que es lo que necesita. es decir

 Dim query2 As New SelectQuery("SELECT * FROM Win32_OperatingSystem") Dim searcher2 As New ManagementObjectSearcher(objManagementScope2, query2, QueryOptions) For Each mo As ManagementObject In searcher2.[Get]() OSname = mo("Name") Next Dim array1 As Array = Nothing array1 = Split(OSname, "|") OSname = array1(0).ToString

OSname luego le brinda el "Windows 11 Pro" o "Windows XP Professional" que necesita.

También obtengo OSVersion con la información de actualización de parche más reciente del registro de la siguiente manera si es necesario...

ESTO ES PARA LAS VERSIONES DEL CLIENTE 10/11 :-

.SetPropertyValue("sSubKeyName", "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Update\TargetingInfo\Installed\Client.OS.rs2.amd64") .SetPropertyValue("sValueName", "Versión")

ESTO ES PARA VERSIONES DE SERVIDOR 2019 :-

.SetPropertyValue("sSubKeyName", "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Update\TargetingInfo\Installed\Server.OS.amd64") .SetPropertyValue("sValueName", "Versión")

Espero que esto sea de ayuda.

over 4 years ago · Santiago Trujillo Denunciar

0

El siguiente código ha sido probado en Windows XP, 7, 10, 11. Funciona en sistemas operativos de 32 y 64 bits. Funciona dentro de aplicaciones de 32 y 64 bits.

Se generarán las siguientes cadenas:

  • "Microsoft Windows XP, compilación 2600, 32 bits"
  • "Windows 7 Ultimate, compilación 7601, 64 bits"
  • "Windows 10 Enterprise LTSC 2019, versión 1809, compilación 17763, 64 bits"
  • "Windows 10 Pro, versión 1909, compilación 18362, 64 bits"
  • "Windows 11 Professional, versión 21H2, compilación 22000, 64 bits"

Coloque el código en un constructor estático para que se ejecute solo una vez y escriba la versión en una variable estática.

 static String ms_OperatingSystem; static Constructor() { try { String s_KernelPath = Path.Combine(Environment.SystemDirectory,"Kernel32.dll"); FileVersionInfo k_Kernel = FileVersionInfo.GetVersionInfo(s_KernelPath); // on 32 bit Windows this will read the 32 bit hive instead using (RegistryKey i_HKLM = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) { using (RegistryKey i_RegVer = i_HKLM.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion", false)) { // Kernel32.dll on Windows 11 has Product Version 10.0.22000.120 if (k_Kernel.ProductMajorPart == 10 && k_Kernel.ProductBuildPart >= 22000) { ms_OperatingSystem = "Windows 11"; Object o_Edition = i_RegVer.GetValue("EditionID"); // "Professional" if (o_Edition is String) ms_OperatingSystem += " " + o_Edition; } else { // "Microsoft Windows XP" // "Windows 7 Ultimate" // "Windows 10 Pro" (same string on Windows 11. Microsoft SUCKS!) ms_OperatingSystem = (String)i_RegVer.GetValue("ProductName"); } // See: https://en.wikipedia.org/wiki/Windows_10_version_history // Windows 10 older releases --> "2009" (invalid if DisplayVersion exists) Object o_ReleaseID = i_RegVer.GetValue("ReleaseId"); // Windows 10 latest release --> "21H1" // Windows 11 first release --> "21H2" Object o_DispVer = i_RegVer.GetValue("DisplayVersion"); // Use ReleaseID ONLY if DisplayVersion does not exist in registry! if (o_DispVer is String) ms_OperatingSystem += ", Version " + o_DispVer; else if (o_ReleaseID is String) ms_OperatingSystem += ", Version " + o_ReleaseID; ms_OperatingSystem += ", Build " + k_Kernel.ProductBuildPart; if (Environment.Is64BitOperatingSystem) ms_OperatingSystem += ", 64 bit"; else ms_OperatingSystem += ", 32 bit"; } } } catch (Exception Ex) { ms_OperatingSystem = Ex.Message; } }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda