¿Cómo obtener el nombre de versión del SO “amigable”?

Estoy buscando una manera elegante de obtener la versión del sistema operativo como: “Windows XP Professional Service Pack 1” o “Windows Server 2008 Standard Edition”, etc.

¿Hay una manera elegante de hacer eso?

También estoy interesado en la architecture del procesador (como x86 o x64).

Puede usar WMI para obtener el nombre del producto (“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"; 

Deberías tratar de evitar WMI para uso local. Es muy conveniente, pero pagas caro por ello en términos de rendimiento. Esto es rápido y simple:

  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 qué no usar Environment.OSVersion ? También le dirá qué operación es esto: Windows, Mac OS X, Unix, etc. Para saber si está ejecutando en 64 bits o 32 bits, use IntPtr.Size ; esto devolverá 4 bytes para 32 bits y 8 bytes para 64 bits.

Tratar:

 new ComputerInfo().OSVersion; 

Salida:

Microsoft Windows 10 Enterprise

Nota: Agregue referencia a Microsoft.VisualBasic.Devices;

Muestra de salida:

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

Clase de muestra:

 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 fuente para la clase OSInfo: http://www.csharp411.com/determine-windows-version-and-edition-with-c/ Sin embargo, hay un error en el código, deberá reemplazar la instrucción “case 6” (es justo antes de #endregion NAME) con esto:

 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; 

Y si quieres dar un paso más y ver si tu progtwig se ejecuta en 64 o 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); } 

Una cosa de la que hay que tener cuidado es que esta información suele estar localizada y tendrá un informe diferente según el idioma del sistema operativo.

Puede obtener mucha información de WMI Busque la clase Win32_OperatingSystem

Tenga en cuenta que la pregunta de la architecture del procesador es compleja:

¿Quieres decir (los números más altos requieren números más bajos para ser verdad):

  1. La CPU es capaz de manejar 64 bits (en el sentido de que es compatible con AMD / intel x64 o Itanium)
  2. El sistema operativo es de 64 bits
    • GPR y punteros son 64 bits, es decir, XP 64, Vista 64, una versión de servidor de 64 bits o un sistema operativo de 64 bits para mono
  3. El proceso que se está ejecutando actualmente es un proceso de 64 bits (no se ejecuta en Wow64, por ejemplo)

si estás contento de que los 3 sean verdaderos, entonces

 IntPtr.Size == 8 

Indica que los tres son verdaderos

Sé que no es una respuesta directa a la pregunta y también es un poco tarde, pero para aquellos que solo están buscando una manera de determinar si el sistema operativo es un SO cliente o un servidor, hay una forma de usar lo siguiente: necesita incluir la referencia de gestión del sistema)

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

mientras que la variable ProdType es un entero que se inicializó antes. Contendrá un valor entre 1 y 3, mientras que 1 representa la estación de trabajo, 2 para el controlador de dominio y 3 para un servidor.

Esto fue tomado de Acceso a las propiedades de Win32_OperatingSystem y cambiado un poco …

Poco tarde, pero así es como lo hice. Podría ayudar a alguien en el futuro.

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

Puede usar los dispositivos de Visual Basic para obtener información de la versión.

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

Salida:

6.1.7601.65536

Microsoft Windows 10 Enterprise

WinNT

Nota: Deberá agregar una referencia a Microsoft.VisualBasic;