2010-02-11 6 views
5

Tengo una aplicación WinForms que necesita comportarse de maneras específicas (específicamente shell para un determinado instalador) en función del sistema operativo en el que se está ejecutando.¿Cuál es la mejor manera para que una aplicación WinForms determine exactamente en qué sistema operativo Windows se está ejecutando?

Estoy usando la clase System.OperatingSystem, y combinando los números PlatFormID, Major, Minor y Build que te llevan la mayor parte del camino hasta allí.

Desafortunadamente, las características de un objeto OperatinSystem no le permiten distinguir con precisión entre algunas plataformas. P.ej. Vista y Windows Server 2008, o Vista 32 bit y Vista 64 bit. Del mismo modo, XP 64 bit Professional parece tener la misma información de versión que Server 2003.

¿Es posible determinar exactamente qué sistema operativo Windows está ejecutando, desde una aplicación WinForms (usando C#)?

+1

XP 64 es Server 2003 para todos los propósitos prácticos. Entonces solo necesitas una manera de decir 64 bits de 32 bits, ¿no? –

+1

Mira esto ... http: //stackoverflow.com/questions/57124/how-to-detect-true-windows-version – t0mm13b

Respuesta

4

La forma más fácil de distinguir entre 32 bits y 64 bits es a través de la variable de entorno PROCESSOR_ARCHITECTURE.

string value = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"); 

si ejecuta este código en Windows de 32 bits, ya sea value habrá "x 86" o vacío. En Windows de 64 bits, supongo que se configurará para todo menos "x86". Es un poco complicado, pero hasta ahora funciona en todas las versiones de Windows donde puede ejecutar el programa .NET.

También puede utilizar WMI más moderno para consultar prácticamente toda la información sobre el sistema operativo que pueda imaginar, pero esto solo funcionará en Windows 2000 o posterior. Si puedes vivir con eso, check this blog post for some examples.

+1

¡Gracias por vincular a mi blog! +1 :-D –

2

Esto fue algo que hice hace aproximadamente un año para una aplicación heredada en mi empresa ... No sé si es el método más actual, pero ciertamente funcionó.

If Environment.OSVersion.Platform = PlatformID.Win32NT Then 
     If major <= 4 Then 
      ret = "Windows NT 4.0" 
      _usingNT4 = True 
     ElseIf major > 6 Then 
      ret = "Windows Vista" 
     ElseIf major = 5 And minor = 0 Then 
      ret = "Windows 2000" 
     Else 
      ret = "Windows XP" 
     End If 
    Else 
     If major > 4 Or (major = 4 And minor >= 90) Then 
      ret = "Windows ME" 
     ElseIf (major = 4 And minor >= 10 And minor < 90) Then 
      ret = "Windows 98" 
     Else 
      ret = "Windows 95" 
     End If 
    End If 
+1

Gracias. Yo también he usado esa información, pero hay algunos conflictos cuando trato de distinguir entre los gustos de Vista32 y Vista64, etc. –

1

Si realmente necesita todos los detalles, creo que todavía puede usar el bien de edad GetVersionEx de API Win32.

De hecho, esto no es .NET (estrictamente hablando), pero se puede usar en una aplicación .NET. Ver here.

3

Puede usar WMI para recuperar información para la clase de gestión Win32_OperatingSystem.

Código generado con WMI Code Creator:

using System; 
using System.Management; 
using System.Windows.Forms; 

namespace WMISample 
{ 
    public class MyWMIQuery 
    { 
     public static void Main() 
     { 
      try 
      { 
       ManagementObjectSearcher searcher = 
        new ManagementObjectSearcher("root\\CIMV2", 
        "SELECT * FROM Win32_OperatingSystem"); 

       foreach (ManagementObject queryObj in searcher.Get()) 
       { 
        Console.WriteLine("-----------------------------------"); 
        Console.WriteLine("Win32_OperatingSystem instance"); 
        Console.WriteLine("-----------------------------------"); 
        Console.WriteLine("BuildNumber: {0}", queryObj["BuildNumber"]); 
        Console.WriteLine("Caption: {0}", queryObj["Caption"]); 
        Console.WriteLine("OSArchitecture: {0}", queryObj["OSArchitecture"]); 
        Console.WriteLine("OSLanguage: {0}", queryObj["OSLanguage"]); 
        Console.WriteLine("Version: {0}", queryObj["Version"]); 
       } 
      } 
      catch (ManagementException e) 
      { 
       MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); 
      } 
     } 
    } 
} 
1

Aquí está una manera más simple:

string os = Environment.OSVersion.VersionString; 

... Para mi sistema operativo, los rendimientos por encima de lo siguiente:

Microsoft Windows NT 6.1. 7600.0

Espero que esto ayude.

+0

Gracias. He jugado con esta configuración pero no distingue entre 32 y 64 bits. Mi solución terminará usando un poco de todas estas respuestas, así que gracias a todos. –

+0

De nada, y espero que encuentre una solución. –

Cuestiones relacionadas