在C#中获取操作系统版本/友好名称

我目前正在研究一个C#项目。 我想收集用户统计信息,以更好地开发软件。 我正在使用C#的Environment.OSfunction,但它只显示操作系统的名称像微软Windows NT的东西

我想要能够检索到的是操作系统实际已知名称,Windows XP, Windows Vista or Windows 7等。

这可能吗?

System.Management添加一个引用和使用语句,然后:

 public static string GetOSFriendlyName() { string result = string.Empty; ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem"); foreach (ManagementObject os in searcher.Get()) { result = os["Caption"].ToString(); break; } return result; } 

你应该尽量避免使用WMI。 这是非常方便,但你在表现上付出沉重的代价。 想懒惰税!

Kashish关于注册表的回答不适用于所有系统。 下面的代码应该也包括Service Pack:

  public string HKLM_GetString(string path, string key) { try { RegistryKey rk = Registry.LocalMachine.OpenSubKey(path); if (rk == null) return ""; return (string)rk.GetValue(key); } catch { return ""; } } public string FriendlyName() { string ProductName = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName"); string CSDVersion = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CSDVersion"); if (ProductName != "") { return (ProductName.StartsWith("Microsoft") ? "" : "Microsoft ") + ProductName + (CSDVersion != "" ? " " + CSDVersion : ""); } return ""; } 

将.NET引用添加到Microsoft.VisualBasic。 然后打电话:

 new Microsoft.VisualBasic.Devices.ComputerInfo().OSFullName 

来自MSDN :

如果计算机上安装了Windows Management Instrumentation(WMI),此属性将返回有关操作系统名称的详细信息。 否则,此属性将返回与My.Computer.Info.OSPlatform属性相同的字符串,它提供的信息比WMI可提供的信息要少。

 System.OperatingSystem osInfo = System.Environment.OSVersion; 
 String subKey = @"SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion"; RegistryKey key = Registry.LocalMachine; RegistryKey skey = key.OpenSubKey(subKey); Console.WriteLine("OS Name: {0}", skey.GetValue("ProductName")); 

我希望你觉得这个有用

 public int OStype() { int os = 0; IEnumerable<string> list64 = Directory.GetDirectories(Environment.GetEnvironmentVariable("SystemRoot")).Where(s => s.Equals(@"C:\Windows\SysWOW64")); IEnumerable<string> list32 = Directory.GetDirectories(Environment.GetEnvironmentVariable("SystemRoot")).Where(s => s.Equals(@"C:\Windows\System32")); if (list32.Count() > 0) { os = 32; if (list64.Count() > 0) os = 64; } return os; }