2009-05-13 8 views
16

Qual è il migliore per determinare il sistema operativo di Microsoft che ospita l'applicazione ASP.NET utilizzando il System.Environment.OSVersion namespaceDeterminare OS utilizzando Environment.OSVersion

ho bisogno di un esempio per Windows XP, Windows Server 2003 e Windows Vista

Qui è quello che sto cercando di realizzare con pseudocodice

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; 
} 

risposta

16

Il seguente dovrebbe funzionare. Ma perché ti importa? È solo a scopo informativo nella registrazione o stai cercando funzionalità reali presenti sulla piattaforma di destinazione?

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

Devo generare la stringa corretta per l'agente utente IE in base al sistema operativo che ospita il mio servizio Windows –

+0

Non è sufficiente la versione maggiore/minore? come questo: Mozilla/4.0 (compatibile; MSIE 7.0b; Windows NT 6.0) – Michael

+4

è possibile distinguere tra XP64 e Server 2003? – Patrick

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

ho bisogno di fare cose diverse per ogni versione del sistema operativo. Stavo pensando un interruttore o se/else dichiarazione –

+0

risposta sbagliata! Deve essere: if (Environment.OSVersion.Version.Major> 6) {/ * vista e sopra * /} – Gerrit

10

Non è un elenco completo, ma ricevuto questo da 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  | 
+--------------------------------------------------------------+ 

Edit: Nota, le informazioni restituite da System.Environment.OSVersion può essere inaffidabili se l'applicazione è in esecuzione in modalità di compatibilità.

Edit2: Suggerirei basta fare un valore configurabile nella vostra applicazione - in questo modo il codice non ha bisogno di ricompilazione quando un nuovo sistema operativo viene fuori, per esempio, Windows 7.

+0

Sono d'accordo con il secondo suggerimento (modifica 2 note). –

+0

Cercando di capirlo per Windows 10 ... –

+0

Per l'elenco aggiornato questa pagina è utile [Versione sistema operativo] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832%28v= vs.85% 29.aspx). – Joseph

3

Se non dovete essere precisi su R2 di edizioni server, un'alternativa più semplice è:

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"); 
} 

copiato da here.

Per essere più precisi sono le opzioni,

  1. WMI, si dovrà un po 'di analisi manuale. Non sono sicuro che il privilegio degli utenti possa danneggiare gli utenti non amministratori.

  2. GetVersionEx come descritto in this answer.

  3. Controllo per ProductName a

    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ 
    
Problemi correlati