2009-09-11 46 views

回答

6

您可以從系統中獲取操作系統信息。 Environment.OSVersion Here

2

因爲我只需要關心非服務器版本的,我做的:

enum OS { _2000, XP, Vista, _7, _8 } 

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 OS.XP; //could also be Server 2003, Server 2003 R2 
      } 
      break; 
     case 6: 
      switch (version.Minor) 
      { 
       case 0: 
        return OS.Vista; //could also be Server 2008 
       case 1: 
        return OS._7; //could also be Server 2008 R2 
       case 2: 
        return OS._8; //could also be Server 20012, Server 2012 R2 
      } 
      break; 
    } 

    throw new Exception("Strange OS"); 
} 

如果你真的需要考慮服務器版本爲好,那麼你的選擇是:

  1. WMI,你將不得不進行一些手動解析。不知道用戶權限是否會傷害非管理員用戶。

  2. GetVersionEx如在this answer中所述。

  3. HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ 
    
  4. IsOS功能檢查ProductName,如在this answer說明。我更喜歡這個..

我提供了一個更完整的答案here

0

使用註冊表是任何應用程序都可以使用的。在C#中,我爲此做了一個實用類。請注意,微軟已經改變了Windows 10+的密鑰(該類旨在處理這個問題)。這個班級應該給你你需要的信息,我認爲:

namespace Inspection 
{ 
    /// <summary> 
    /// Static class that adds convenient methods for getting information on the running computers basic hardware and os setup. 
    /// </summary> 
    public static class ComputerInfo 
    { 
     /// <summary> 
     ///  Returns the Windows major version number for this computer. 
     /// </summary> 
     public static uint WinMajorVersion 
     { 
      get 
      { 
       dynamic major; 
       // The 'CurrentMajorVersionNumber' string value in the CurrentVersion key is new for Windows 10, 
       // and will most likely (hopefully) be there for some time before MS decides to change this - again... 
       if (TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentMajorVersionNumber", out major)) 
       { 
        return (uint) major; 
       } 

       // When the 'CurrentMajorVersionNumber' value is not present we fallback to reading the previous key used for this: 'CurrentVersion' 
       dynamic version; 
       if (!TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentVersion", out version)) 
        return 0; 

       var versionParts = ((string) version).Split('.'); 
       if (versionParts.Length != 2) return 0; 
       uint majorAsUInt; 
       return uint.TryParse(versionParts[0], out majorAsUInt) ? majorAsUInt : 0; 
      } 
     } 

     /// <summary> 
     ///  Returns the Windows minor version number for this computer. 
     /// </summary> 
     public static uint WinMinorVersion 
     { 
      get 
      { 
       dynamic minor; 
       // The 'CurrentMinorVersionNumber' string value in the CurrentVersion key is new for Windows 10, 
       // and will most likely (hopefully) be there for some time before MS decides to change this - again... 
       if (TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentMinorVersionNumber", 
        out minor)) 
       { 
        return (uint) minor; 
       } 

       // When the 'CurrentMinorVersionNumber' value is not present we fallback to reading the previous key used for this: 'CurrentVersion' 
       dynamic version; 
       if (!TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentVersion", out version)) 
        return 0; 

       var versionParts = ((string) version).Split('.'); 
       if (versionParts.Length != 2) return 0; 
       uint minorAsUInt; 
       return uint.TryParse(versionParts[1], out minorAsUInt) ? minorAsUInt : 0; 
      } 
     } 

     /// <summary> 
     ///  Returns whether or not the current computer is a server or not. 
     /// </summary> 
     public static uint IsServer 
     { 
      get 
      { 
       dynamic installationType; 
       if (TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "InstallationType", 
        out installationType)) 
       { 
        return (uint) (installationType.Equals("Client") ? 0 : 1); 
       } 

       return 0; 
      } 
     } 

     private static bool TryGeRegistryKey(string path, string key, out dynamic value) 
     { 
      value = null; 
      try 
      { 
       var rk = Registry.LocalMachine.OpenSubKey(path); 
       if (rk == null) return false; 
       value = rk.GetValue(key); 
       return value != null; 
      } 
      catch 
      { 
       return false; 
      } 
     } 
    } 
}