如何获得“友好”的操作系统版本名称?

我正在寻找一个优雅的方式来获取操作系统版本,如:“Windows XP Professional Service Pack 1”或“Windows Server 2008标准版”等

有没有一个优雅的方式做到这一点?

我也对处理器体系结构感兴趣(如x86或x64)。

您可以使用WMI获取产品名称(“Microsoft®WindowsServer®2008 Enterprise”):

using System.Management; var name = (from x in new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem").Get().Cast<ManagementObject>() select x.GetPropertyValue("Caption")).FirstOrDefault(); return name != null ? name.ToString() : "Unknown"; 

你应该尽量避免使用WMI。 这是非常方便,但你在performance上付出沉重的代价。 这是快速和简单的:

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

为什么不使用Environment.OSVersion ? 它也会告诉你这是什么操作 – Windows,Mac OS X,Unix等等。要确定你是在64位还是在32位运行,使用IntPtr.Size – 这将返回4个字节的32位和8个字节的64位。

示例输出:

 Name = Windows Vista Edition = Home Premium Service Pack = Service Pack 1 Version = 6.0.6001.65536 Bits = 64 

示例类:

 class Program { static void Main( string[] args ) { Console.WriteLine( "Operation System Information" ); Console.WriteLine( "----------------------------" ); Console.WriteLine( "Name = {0}", OSInfo.Name ); Console.WriteLine( "Edition = {0}", OSInfo.Edition ); Console.WriteLine( "Service Pack = {0}", OSInfo.ServicePack ); Console.WriteLine( "Version = {0}", OSInfo.VersionString ); Console.WriteLine( "Bits = {0}", OSInfo.Bits ); Console.ReadLine(); } } 

OSInfo类的源代码: http : //www.csharp411.com/determine-windows-version-and-edition-with-c/但是,在代码中有一个错误,您将需要replace“case 6”语句(它只是在#endregion NAME之前):

 case 6: switch (minorVersion) { case 0: switch (productType) { case 1: name = "Windows Vista"; break; case 3: name = "Windows Server 2008"; break; } break; case 1: switch (productType) { case 1: name = "Windows 7"; break; case 3: name = "Windows Server 2008 R2"; break; } break; } break; 

如果你想更进一步,看看你的程序是在64位还是32位运行:

 public static class Wow { public static bool Is64BitProcess { get { return IntPtr.Size == 8; } } public static bool Is64BitOperatingSystem { get { // Clearly if this is a 64-bit process we must be on a 64-bit OS. if (Is64BitProcess) return true; // Ok, so we are a 32-bit process, but is the OS 64-bit? // If we are running under Wow64 than the OS is 64-bit. bool isWow64; return ModuleContainsFunction("kernel32.dll", "IsWow64Process") && IsWow64Process(GetCurrentProcess(), out isWow64) && isWow64; } } static bool ModuleContainsFunction(string moduleName, string methodName) { IntPtr hModule = GetModuleHandle(moduleName); if (hModule != IntPtr.Zero) return GetProcAddress(hModule, methodName) != IntPtr.Zero; return false; } [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] extern static bool IsWow64Process(IntPtr hProcess, [MarshalAs(UnmanagedType.Bool)] out bool isWow64); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] extern static IntPtr GetCurrentProcess(); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] extern static IntPtr GetModuleHandle(string moduleName); [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)] extern static IntPtr GetProcAddress(IntPtr hModule, string methodName); } 

尝试:

 new ComputerInfo().OSVersion; 

输出:

Microsoft Windows 10企业版

注意:添加对Microsoft.VisualBasic.Devices;引用Microsoft.VisualBasic.Devices;

有一点需要注意的是,这些信息通常是本地化的,并且根据操作系统的语言会有不同的报告。

你可以从WMI中获得大量的信息来寻找Win32_OperatingSystem类

请注意,处理器架构问题是复杂的:

你的意思是(更高的数字要求更低的数字是真实的):

  1. CPU能够处理64位(在支持AMD / Intel x64或Itanium的意义上)
  2. 操作系统是64位
    • GPR和指针是64位,即XP 64,Vista 64,64位服务器版本或单声道64位操作系统
  3. 当前正在执行的进程是一个64位的进程(例如不在Wow64下执行)

如果你感到高兴的话,那么所有的3都是真的

 IntPtr.Size == 8 

表示这三个都是真的

我知道这不是问题的直接答案,也有点晚了,但对于那些只是在寻找一种方式来确定操作系统是客户端操作系统还是服务器的方法,可以使用以下方法:你需要包含System.Management参考)

  using System; using System.Management; ManagementClass osClass = new ManagementClass("Win32_OperatingSystem"); foreach (ManagementObject queryObj in osClass.GetInstances()) { foreach (PropertyData prop in queryObj.Properties) { if (prop.Name == "ProductType") { ProdType = int.Parse(prop.Value.ToString()); } } } 

而variablesProdType是之前初始化的整数。 它将包含1到3之间的值,1代表Workstation,2代表域控制器,3代表服务器。

这是从访问Win32_OperatingSystem的属性,并改变了一点点…

迟到了,但这是我做到的。 未来可能会帮助别人。

 using Microsoft.Win32; RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows NT\\CurrentVersion"); string pathName = (string)registryKey.GetValue("productName"); 

您可以使用Visual Basic设备来获取版本信息。

码:

 using Microsoft.VisualBasic.Devices; var versionID = new ComputerInfo().OSVersion;//6.1.7601.65536 var versionName = new ComputerInfo().OSFullName;//Microsoft Windows 7 Ultimate var verionPlatform = new ComputerInfo().OSPlatform;//WinNT Console.WriteLine(versionID); Console.WriteLine(versionName); Console.WriteLine(verionPlatform); 

输出:

6.1.7601.65536

Microsoft Windows 10企业版

WINNT

注意:您将需要添加对Microsoft.VisualBasic;的引用Microsoft.VisualBasic;