2010-02-11 14 views
5

Possiedo un'applicazione WinForms che deve comportarsi in modi specifici (in particolare shell su un determinato programma di installazione) in base al sistema operativo su cui è in esecuzione.Qual è il modo migliore per un'applicazione WinForms per determinare esattamente su quale sistema operativo Windows è in esecuzione?

Sto utilizzando la classe System.OperatingSystem e combino i numeri PlatFormID, Major, Minor e Build che ti danno la maggior parte del modo lì.

Sfortunatamente, le proprietà di un oggetto OperatinSystem, non consentono di distinguere con precisione tra alcune piattaforme. Per esempio. Vista e Windows Server 2008 o Vista 32 bit e Vista 64 bit. Allo stesso modo, XP 64 bit sembra avere le stesse informazioni di versione di Server 2003.

Quindi è possibile determinare esattamente quale sistema operativo Windows si sta eseguendo, da un'app WinForms (utilizzando C#)?

+1

XP 64 è Server 2003 per tutti gli scopi pratici. Quindi hai solo bisogno di un modo per dire 64 bit da 32 bit - giusto? –

+1

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

risposta

4

Il modo più semplice per distinguere tra 32 bit e 64 bit è attraverso la variabile ambientale PROCESSOR_ARCHITECTURE.

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

se si esegue questo codice su Windows a 32 bit, value sarà o "x 86" o vuoto. Su Windows a 64 bit suppongo che sarà impostato su qualsiasi cosa tranne "x86". Un po 'disordinato ma finora funziona su tutte le versioni di Windows in cui è possibile eseguire il programma .NET.

È inoltre possibile utilizzare WMI più moderno per interrogare praticamente tutte le informazioni sul sistema operativo che si possono immaginare, ma funziona solo su Windows 2000 o successivi. Se puoi vivere con quello, check this blog post for some examples.

+1

Grazie per il collegamento al mio blog! +1 :-D –

2

Questo è stato qualcosa che ho fatto circa un anno fa per un'applicazione legacy presso la mia azienda ... Non so che è il metodo più attuale, ma sicuramente ha funzionato.

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

Grazie. Anch'io ho usato queste informazioni ma ci sono alcuni conflitti quando cerco di distinguere tra i mi piace di Vista32 e Vista64 ecc. –

1

Se davvero bisogno di tutti i dettagli, credo che si può ancora utilizzare il buon vecchio GetVersionEx di API Win32.

In effetti questo non è .NET (in senso stretto), ma utilizzabile in un'applicazione .NET. Vedi here.

3

È possibile utilizzare WMI per recuperare informazioni per la classe di gestione Win32_OperatingSystem.

codice generato 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

Ecco un modo più semplice:

string os = Environment.OSVersion.VersionString; 

... Per il mio sistema operativo, i rendimenti sopra il seguente:

Microsoft Windows NT 6.1. 7600,0

Spero che questo aiuti.

+0

Grazie. Ho suonato con questa impostazione ma non distingue tra 32 e 64 bit. La mia soluzione finirà per utilizzare un po 'di tutte queste risposte, quindi, grazie a tutti. –

+0

Prego, e spero che tu trovi una soluzione. –

Problemi correlati