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.