2009-05-13 10 views
16

¿Cuál es la mejor manera de determinar el sistema operativo de Microsoft que aloja su aplicación ASP.NET utilizando el espacio de nombres System.Environment.OSVersionDeterminar OS mediante Environment.OSVersion

Necesito un ejemplo para Windows XP, Windows Server 2003 y Windows Vista

Aquí es lo que estoy tratando de lograr usando pseudocódigo

switch(/* Condition for determining OS */) 
{ 
    case "WindowsXP": 
     //Do Windows XP stuff 
     break; 
    case "Windows Server 2003": 
     //Do Windows Server 2003 stuff 
     break; 
    case "Windows Vista": 
     //Do Windows Vista stuff 
     break; 
} 

Respuesta

16

El siguiente debe funcionar. Pero, ¿por qué te importa? ¿Es sólo para fines informativos en el registro o está buscando capacidades reales presentes en la plataforma objetivo?

if (Environment.OSVersion.Version.Major == 5) 
{ 
    if (Environment.OSVersion.Version.Minor == 1) 
    { 
      // XP 
    } 
    else if (Environment.OSVersion.Version.Minor == 2) 
    { 
      // Server 2003. XP 64-bit will also fall in here. 
    } 
} 
else if (Environment.OSVersion.Version.Major >= 6) 
{ 
     // Vista on up 
} 
+0

Necesito generar la cadena de agente de usuario de IE correcta según el sistema operativo que aloja mi servicio de Windows –

+0

¿No es suficiente la versión con números mayores/menores? de esta manera: Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0) – Michael

+4

¿Hay alguna manera de diferenciar entre XP64 y Server 2003? – Patrick

2
if(Environment.OSVersion.Version.Major > 5) { /* vista and above */ } 
+0

tengo que hacer cosas diferentes para cada versión del sistema operativo. Estaba pensando en un cambio o en una declaración if/else –

+0

¡Respuesta incorrecta! Debe ser: if (Environment.OSVersion.Version.Major> 6) {/ * vista y superior * /} – Gerrit

10

No es una lista completa, pero tengo esto desde http://support.microsoft.com/kb/304283:

 
+--------------------------------------------------------------+ 
|   |Windows|Windows|Windows|Windows NT|Windows|Windows| 
|   | 95 | 98 | Me | 4.0 | 2000 | XP | 
+--------------------------------------------------------------+ 
|PlatformID | 1  | 1  | 1  | 2  | 2  | 2  | 
+--------------------------------------------------------------+ 
|Major  |  |  |  |   |  |  | 
| version | 4  | 4  | 4  | 4  | 5  | 5  | 
+--------------------------------------------------------------+ 
|Minor  |  |  |  |   |  |  | 
| version | 0  | 10 | 90 | 0  | 0  | 1  | 
+--------------------------------------------------------------+ 

Editar: Nota, la información devuelta por System.Environment.OSVersion puede no ser fiable si la aplicación se está ejecutando en modo de compatibilidad.

Edit2: Yo recomendaría que acaba de hacer que un valor configurable en su aplicación - de esa manera su código no necesita recompilación cuando un nuevo sistema operativo viene a cabo, por ejemplo, Windows 7.

+0

Estoy de acuerdo con la segunda sugerencia (Editar nota 2). –

+0

Intentando resolver esto para Windows 10 ... –

+0

Para obtener la lista actualizada, esta página es útil [Versión del sistema operativo] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832%28v= vs.85% 29.aspx). – Joseph

3

Si usted no tiene que ser específico acerca de R2 ediciones de servidor, una alternativa más sencilla es:

enum OS { _2000, XP, Server2003, Vista, Server2008, _7, Server2012, _8 } 

const int OS_ANYSERVER = 29; 

[DllImport("shlwapi.dll", SetLastError = true, EntryPoint = "#437")] 
static extern bool IsOS(int os); 

static bool isWindowsServer = IsOS(OS_ANYSERVER); 

public static OS GetOS() 
{ 
    var version = Environment.OSVersion.Version; 
    switch (version.Major) 
    { 
     case 5: 
      switch (version.Minor) 
      { 
       case 0: 
        return OS._2000; 
       case 1: 
        return OS.XP; 
       case 2: 
        return isWindowsServer ? OS.Server2003 : OS.XP; 
      } 
      break; 
     case 6: 
      switch (version.Minor) 
      { 
       case 0: 
        return isWindowsServer ? OS.Server2008 : OS.Vista; 
       case 1: 
        return isWindowsServer ? OS.Server2008 : OS._7; 
       case 2: 
        return isWindowsServer ? OS.Server2012 : OS._8; 
      } 
      break; 
    } 

    throw new Exception("Strange OS"); 
} 

Copiado del here.

Para ser más específicos son sus opciones,

  1. WMI, tendrá que algunos análisis manual. No estoy seguro de si el privilegio del usuario perjudicará a los usuarios que no sean administradores.

  2. GetVersionEx como se describe en this answer.

  3. Comprobación de ProductName en

    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ 
    
Cuestiones relacionadas