2010-02-11 26 views
5

我有一個WinForms應用程序需要以特定的方式(特別是對某個安裝程序的shell)進行操作,該操作系統基於它所運行的操作系統。WinForms應用程序確定它正在運行哪個Windows操作系統的最佳方式是什麼?

我使用System.OperatingSystem類,並結合了PlatFormID,Major,Minor和Build數字,這些數字可以使您獲得最大的方式。

不幸的是,OperatinSystem對象的固有屬性不允許您在某些平臺之間進行精確區分。例如。 Vista和Windows Server 2008,或Vista 32位和Vista 64位。同樣,XP 64位專業版似乎與Server 2003具有相同的版本信息。

那麼,是否可以從WinForms應用程序(使用c#)確切確定您正在運行哪個Windows操作系統?

+1

XP 64是Server 2003的所有實際用途。所以你只需要一種方式來告訴64位從32位 - 對嗎? –

+1

檢查這.... out:http://stackoverflow.com/questions/57124/how-to-detect-true-windows-version – t0mm13b

回答

4

區分32位和64位的最簡單方法是通過環境變量PROCESSOR_ARCHITECTURE

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

如果您運行在32位Windows的代碼,value將不是「86」或空。在64位Windows上,我認爲它將設置爲「x86」以外的任何設置。有點麻煩,但到目前爲止它適用於所有版本的Windows,您可以執行.NET程序。

您也可以使用更現代的WMI來查詢幾乎所有關於您可以想象的操作系統的信息,但這隻適用於Windows 2000或更新版本。如果你能忍受,check this blog post for some examples

+1

感謝您鏈接到我的博客! +1 :-D –

2

這是我一年前爲我公司的遺留應用程序做的事情......我不知道這是最新的方法,但它確實有效。

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

謝謝。我也使用過這個信息,但是在試圖區分Vista32和Vista64之類的東西時存在一些衝突。 –

1

如果你真的需要所有的細節,我想你仍然可以使用好老GetVersionEx的Win32 API的。實際上,這不是.NET(嚴格來說),但可用於.NET應用程序。見here

3

您可以使用WMI檢索Win32_OperatingSystem管理類的信息。與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

這裏有一個簡單的方法:

string os = Environment.OSVersion.VersionString; 

...對於我的操作系統,上面的返回如下:

的Microsoft Windows NT 6.1。 7600.0

希望這會有所幫助。

+0

謝謝。我已經玩過這個設置,但是它沒有區分32位和64位。儘管如此,我的解決方案最終會使用所有這些答案中的一部分,所以感謝所有人。 –

+0

不客氣,我希望你找到解決方案。 – 2010-02-17 08:08:08

相關問題