Exploración de la instrumentación de administración de Windows en C #

En este artículo, presentaré un vistazo de la tecnología WMI y cómo puede trabajar con WMI utilizando el lenguaje de consulta WMI en C #. Luego, discutiré un escenario en el que puede utilizar WMI en el mundo real.

¿Qué es WMI?

WMI es el acrónimo de Windows Management Instrumentation, una tecnología de Microsoft basada en COM que se utiliza para recuperar información relacionada con el sistema. Puede utilizar esta tecnología para recuperar el ID de CPU, MAC ID, etc. de su sistema. Se compone de una colección de tipos que actúan como envoltura de los tipos nativos para recuperar información relacionada con el hardware. WMI facilita una comunicación de bajo nivel con el sistema operativo host. Puede utilizar WMI para trabajar con contadores de rendimiento o recuperar información de hardware de un sistema.

Puede utilizar WMI para recuperar información de metadatos del hardware de su sistema como se muestra a continuación:

  1. Número de serie de HDD
  2. Tamaños de HDD
  3. Espacio libre HDD
  4. Número de serie de la CPU
  5. Velocidad de reloj de la CPU
  6. Tipo de socket de CPU
  7. Dirección MAC del adaptador de red
  8. Puerta de enlace predeterminada del adaptador de red

Ya hemos tenido suficiente información teórica; ahora profundicemos en un código.

Programación de WMI en C #

El siguiente fragmento de código utiliza una consulta WQL para completar una lista con los nombres de los discos lógicos de su sistema. Una consulta típica de WMI se ve así:

Select * FROM Win32_Processor

Como puede ver en el fragmento de código, la clase SelectQuery se usa para formular una consulta WQL.

static List PopulateDisk()

        {

            List disk = new List();

            SelectQuery selectQuery = new SelectQuery("Win32_LogicalDisk");

            ManagementObjectSearcher mnagementObjectSearcher = new ManagementObjectSearcher(selectQuery);

       foreach (ManagementObject managementObject in mnagementObjectSearcher.Get())

            {

           disk.Add(managementObject.ToString());

       }

            return disk;

    }

Tenga en cuenta que debe incluir el espacio de nombres System.Management (disponible como parte de System.Management.dll) en su proyecto. Las clases de WMI incluidas como parte de este espacio de nombres incluyen lo siguiente:

  1. Win32_LogicalDisk: esta clase representa una fuente de datos que corresponde al dispositivo de almacenamiento de su sistema. Puede utilizar esta clase para recuperar el número de serie, el espacio libre disponible y el tamaño inicial del disco duro.
  2. Win32_NetworkAdapterConfiguration: esta clase representa los atributos de un adaptador de red en su sistema. Puede utilizar esta clase para recuperar la dirección MAC, el estado de la IP o la información de la puerta de enlace IP predeterminada.
  3. Win32_Processor: esta clase representa el procesador que se ejecuta en un sistema que tiene instalado el sistema operativo Windows. Puede utilizar esta clase para recuperar la identificación de la CPU, el estado de la CPU, la velocidad del reloj de la CPU, etc. de los procesadores de su sistema.

Para obtener la información de metadatos de los discos fijos en su sistema, es decir, el nombre, espacio libre, tamaño del disco, etc., puede utilizar el siguiente código.

static void GetDiskMetadata()

        {

            System.Management.ManagementScope managementScope = new System.Management.ManagementScope();

            System.Management.ObjectQuery objectQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");

            ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(managementScope,objectQuery);

            ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get();

            foreach (ManagementObject managementObject in managementObjectCollection)

            {

                Console.WriteLine("Disk Name : " + managementObject["Name"].ToString());

                Console.WriteLine("FreeSpace: " + managementObject["FreeSpace"].ToString());

                Console.WriteLine("Disk Size: " + managementObject["Size"].ToString());

                Console.WriteLine("---------------------------------------------------");

            }

        }

El siguiente fragmento de código ilustra cómo puede recuperar el número de serie del volumen de los discos duros de su sistema.

static string GetHardDiskSerialNumber(string drive = "C")

        {

            ManagementObject managementObject = new ManagementObject("Win32_LogicalDisk.DeviceID=\"" + drive + ":\"");

            managementObject.Get();

            return managementObject["VolumeSerialNumber"].ToString();

        }

Para obtener el processorId del procesador en su sistema, necesitaría especificar el "ProcessorId" en la matriz de propiedades de la instancia de la clase ManagementObject como se muestra en el fragmento de código que sigue.

string processorId = managementObject.Properties ["ProcessorId"]. Value.ToString ();

Para obtener la velocidad de reloj del procesador en su sistema, necesitaría especificar "CurrentClockSpeed" en la matriz de propiedades de la instancia de clase ManagementObject como se muestra en el fragmento de código que sigue.

Int32 clockSpeed = Convert.ToInt32(managementObject.Properties["CurrentClockSpeed"].Value.ToString());

Ahora que hemos explorado la programación de WMI usando C #, permítame contarle un ejemplo práctico donde puede utilizar WMI. De hecho, hice uso de WMI en algunos de mis proyectos para implementar el bloqueo de nodos, una característica que evita que una aplicación se copie en otro sistema y se ejecute en él.

Bloqueo de nodo

Permítanme explicar qué hice para implementar el bloqueo de nodos y por qué era necesario. El bloqueo de nodos implica bloquear un nodo; un nodo es solo un sistema. En esencia, este concepto evita que un ejecutable generado por su aplicación se instale y ejecute en múltiples sistemas. Usé WMI para recuperar los detalles de hardware del sistema en el que se debe instalar y ejecutar la aplicación. A continuación, estos detalles se cifraron mediante un algoritmo de cifrado y luego se generó un código de activación único para ese sistema. Este código deberá utilizarse para activar la aplicación. Tenga en cuenta que el Id. De nodo o el código de activación son únicos porque se componen de una combinación del Id de la CPU y el Id de MAC del sistema en el que se iba a instalar y ejecutar la aplicación.