Como obter o nome da versão do SO “amigável”?

Eu estou procurando uma maneira elegante para obter a versão do sistema operacional como: “Windows XP Professional Service Pack 1” ou “Windows Server 2008 Standard Edition” etc.

Existe uma maneira elegante de fazer isso?

Também estou interessado na arquitetura do processador (como x86 ou x64).

Você pode usar o WMI para obter o nome do produto (“Microsoft® Windows Server® 2008 Enterprise”):

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

Você deve realmente tentar evitar o WMI para uso local. É muito conveniente, mas você paga caro por isso em termos de desempenho. Isso é rápido e simples:

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

Por que não usar o Environment.OSVersion ? Ele também irá dizer-lhe o que está operando – Windows, Mac OS X, Unix, etc Para descobrir se você está executando em 64 bits ou 32 bits, use IntPtr.Size – isso irá retornar 4 bytes para 32 bits e 8 bytes para 64 bits.

Experimentar:

 new ComputerInfo().OSVersion; 

Saída:

Microsoft Windows 10 Enterprise

Nota: Adicione uma referência a Microsoft.VisualBasic.Devices;

Exemplo de saída:

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

Classe da amostra:

 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(); } } 

Código-fonte para a class OSInfo: http://www.csharp411.com/determine-windows-version-and-edition-with-c/ No entanto, há um erro no código, você precisará replace a instrução “case 6” (é só antes de #endregion NAME) com isto:

 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; 

E se você quiser dar um passo adiante e ver se o seu programa está rodando em 64 ou 32 bits:

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

Uma coisa a ter cuidado é que esta informação é geralmente localizada e irá relatar de forma diferente, dependendo da linguagem do sistema operacional.

Você pode obter muitas informações do WMI procure pela class Win32_OperatingSystem

Observe que a questão da arquitetura do processador é complexa:

você quer dizer (números mais altos requerem números menores para serem verdade):

  1. A CPU é capaz de lidar com 64 bits (no sentido de que suporta AMD / intel x64 ou Itanium)
  2. O sistema operacional é de 64 bits
    • GPR e pointers são 64bits, ou seja, XP 64, Vista 64, um servidor de 64 bits ou um sistema operacional de 64 bits para mono
  3. O processo atualmente em execução é um processo de 64 bits (não sendo executado sob o Wow64, por exemplo)

Se você está feliz que todos os 3 devem ser verdade, então

 IntPtr.Size == 8 

Indica que todos os três são verdadeiros

Eu sei que não é uma resposta direta para a questão e também é um pouco tarde, mas para aqueles que estão apenas procurando uma maneira de determinar se o sistema operacional é um sistema operacional cliente ou um servidor, há uma maneira de usar o seguinte: ( você precisa include a referência 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()); } } } 

enquanto a variável ProdType é um número inteiro que foi inicializado antes. Ele conterá um valor entre 1 e 3, enquanto 1 significa Workstation, 2 para Controlador de Domínio e 3 para um servidor.

Isto foi tirado de Acessando as propriedades do Win32_OperatingSystem e mudou um pouco …

Pouco tarde, mas é assim que eu fiz isso. Pode ajudar alguém no futuro.

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

Você pode usar dispositivos do Visual Basic para obter informações sobre a versão.

Código:

 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); 

Saída:

6.1.7601.65536

Microsoft Windows 10 Enterprise

WinNT

Nota: Você precisará adicionar uma referência ao Microsoft.VisualBasic;