Saber la versión de Windows en C# y VB

Obtener datos sobre el nombre del producto, la versión, el número de compilación y la arquitectura de 32 o 64 bits del sistema operativo mediante clases de .NET o el registro de Windows, en C# y VB

En ocasiones puede ser necesario que un programa o librería acceda a datos de la versión de Windows instalada en el sistema. Este ejercicio presenta 2 formas de hacerlo, utilizando clases de .NET Framework o leyendo esa información directamente desde el registro de Windows. Se presenta el ejercicio en C# pero al final está el enlace de descarga a la aplicación completa con el añadido de la versión en Visual Basic .NET.

Clases de .NET Framework (Computer y Environment)

La clase Environment del espacio de nombres System proporciona información acerca del entorno y la plataforma actuales. La propiedad OSVersion obtiene un objeto que contiene el identificador de la plataforma actual y el número de versión.

LabelInfo1.Text = "System.Environment.OSVersion:\n\n" + System.Environment.OSVersion.ToString();

La clase Computer del espacio de nombres Microsoft.VisualBasic.Devices proporciona propiedades para manipular componentes del equipo. Es la manera de utilizar en C# objetos similares a My que no existe como tal en este lenguaje y sí en Visual Basic .NET. En VB el espacio de nombres My proporciona a la aplicación acceso a 7 objetos:

  • My.Computer: nombre del ordenador, memoria, sistema operativo, red, etc.
  • My.Application: ruta a la aplicación, ensamblados, variables de entorno, etc.
  • My.User: información sobre el usuario actual de Windows
  • My.Forms: proporciona referencia a todos los formularios del proyecto
  • My.WebServices: clases y servicios web utilizados
  • My.Settings: lee o guarda configuraciones de la aplicación
  • My.Resources: lee recursos utilizados por la aplicación.

Para utilizar Computer en C# hay que añadir una referencia en el proyecto a Microsoft.VisualBasic e importar Microsoft.VisualBasic.Devices para generar objetos Computer y obtener información como se hace en VB desde My.Computer.

Computer pc = new Computer();
LabelInfo2.Text = "Computer.Info.OSFullName:\n\n" + pc.Info.OSFullName.ToString();

Registro de Windows

En el espacio de nombres Microsoft.Win32.Registry existen objetos que permiten leer, modificar, crear y guardar pares del tipo clave / valor en el registro. La clase RegistryKey representa un nodo de clave y permite manipular claves y subclaves. Hay 2 rutas en las que consultar la información sobre el sistema operativo aunque las 2 cuelgan de la rama LocalMachine.

La información sobre la versión, edición, números de versión y compilación del sistema operativo está en las claves ProductName / EditionID / CurrentBuild / CurrentVersion / etc. en la ruta

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion]

La información sobre la arquitectura de 32 o 64 bits se obtiene mejor desde la clave PROCESSOR_ARCHITECTURE que puede ser AMD64 o x86 en la ruta

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]

Se crean cadenas para contener las 2 rutas del registro, se crean objetos RegistryKey para las claves y subclaves y se crean las cadenas que van a contener los valores de las claves. Como PROCESSOR_ARCHITECTURE puede tener el valor «AMD64» o «x86», un bucle condicional permite elegir y rellenar con «32 bits» o «64 bits» la etiqueta correspondiente.

private void Form1_Load(object sender, EventArgs e)
{
	// USANDO COMPUTER Y ENVIRONMENT
	LabelInfo1.Text = "System.Environment.OSVersion:\n\n" + System.Environment.OSVersion.ToString();
	Computer pc = new Computer();
	LabelInfo2.Text = "Computer.Info.OSFullName:\n\n" + pc.Info.OSFullName.ToString();
	//
	// USANDO REGISTRO DE WINDOWS
	string Clave1 = @"SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion";
	string Clave2 = @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment";
	//
	Microsoft.Win32.RegistryKey principal = Microsoft.Win32.Registry.LocalMachine; //rama LocalMachine
	Microsoft.Win32.RegistryKey subclave1 = principal.OpenSubKey(Clave1); //clave SOFTWARE ... CurrentVersion
	Microsoft.Win32.RegistryKey subclave2 = principal.OpenSubKey(Clave2); //clave SYSTEM ...  Environment
	//
	string nombre = subclave1.GetValue("ProductName").ToString();
	string compilacion = subclave1.GetValue("CurrentBuild").ToString();
	string release = subclave1.GetValue("ReleaseId").ToString();
	string arquitectura = subclave2.GetValue("PROCESSOR_ARCHITECTURE").ToString();
	if (arquitectura.Equals("AMD64"))
		arquitectura = "64 bits";
	else
		arquitectura = "32 bits";
	//
	LabelInfo3.Text = "ProductName:\n" + nombre + "\n\nCurrentBuild:\n" + compilacion + "\n\nReleaseId:\n" + release + "\n\nProcessor_Architecture:\n" + arquitectura;
}

Puedes descargar un archivo ZIP con las aplicaciones C# y VB.