[NET2.0] Usando WMI (Windows Management Instrumentation) technology
por Ing. Juan Pablo Ibañez
http://ing.juanpablo.googlepages.com
Esta tecnología nos permite recuperar toda la información que deseemos de cualquier sistema operativo Windows ya sea local o remoto. Información como cuales son los adaptadores de red, la memoria RAM, los discos fijos y removibles, la CPU, etc. de nuestra PC puede ser obtenida programáticamente mediante WMI.
La definición de WMI es:
Instrumental de administración de Windows (WMI) es un componente del sistema operativo Windows que permite obtener acceso mediante programación a información de administración en un entorno empresarial. WMI en .NET Framework se basa en la tecnología WMI original y permite el mismo desarrollo de aplicaciones y proveedores, además de las ventajas que ofrece la programación en .NET Framework.
WMI en .NET puede ser utilizada mediante una serie de objetos lo cual nos facilita mucho su uso. Estos objetos se encuentras agrupados dentro del namespace System.Management. WMI utiliza una sintaxis muy parecedida a la de SQL para armar "queries" sobre los componentes de los cuales queremos obtener información.
Más información teórica sobre WMI puede ser encontrada en http://msdn2.microsoft.com/es-es/library/ms257353(VS.80).aspx. Microsoft nos proporciona también un software llamado WMI Code Creator v1.0 para generar código (VBScript, C# y VB.NET) que use WMI.
Nada mejor para entender WMI que llevarlo a la práctica. Supongamos que quisieramos obtener información sobre los discos fijos que tenemos en nuestra PC.
Primero debemos definir un objeto ManagementScope que representa un ámbito (espacio de nombres) para las operaciones de administración.
ManagementScope scope = new ManagementScope(ManagementPath.DefaultPath);
Luego debemos armar la query que nos devuelva por ejemplo el nombre y el tamaño de los discos fijos usando un objecto del tipo ObjectQuery que representa una consulta de administración que devuelve instancias o clases.
ObjectQuery query = new ObjectQuery("SELECT Size, Name FROM Win32_LogicalDisk where DriveType=3");
Por último crear un instancia de la clase ManagementObjectSearcher que recupera una colección de objetos de administración basándose en una consulta especificada. Esta clase es uno de los puntos de entrada más utilizados para recuperar información de administración. Se puede utilizar, por ejemplo, para enumerar todas las unidades de disco, adaptadores de red, procesos y muchos otros objetos de administración del sistema, o para saber qué conexiones de red están activas, qué servicios están detenidos, etc. El método Get de este objeto nos devuelve el resultado de la consulta en una colección de objetos del tipo ManagementObjectCollection. ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope,query);
ManagementObjectCollection drives = searcher.Get();
foreach (ManagementBaseObject drive in drives)
{
Console.WriteLine("Drive Name: " + drive["Name"]);
Console.WriteLine("Drive Size: " + drive["Size"]);
}
Console.ReadLine();
Otro lindo ejemplo es como recuperar cuales los los adaptadores de red conectados a nuestra PC.
class Program
{
public const string IP_Enabled = "IPEnabled";
public const string IP_Address = "IPAddress";
public const string IP_Subnet = "IPSubnet";
public const string DNS_Hostname = "DNSHostName";
public const string DNS_Domain = "DNSDomain"; static void Main(string[] args)
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration");
ManagementObjectCollection networks = searcher.Get();
foreach (ManagementBaseObject network in networks)
{
Console.WriteLine("-----------------------------------------------------");
Console.WriteLine("Description: " + network["Description"]);
Console.WriteLine("MacAddress: " + network["MacAddress"]);
if (Convert.ToBoolean(network[IP_Enabled]))
{
string[] ips = (string[])network[IP_Address];
string[] subnets = (string[]) network[IP_Subnet];
Console.WriteLine("DNS Hostname: " + network[DNS_Hostname]);
Console.WriteLine("DNS Domain: " + network[DNS_Domain]);
foreach (string ip in ips)
Console.WriteLine("IP: " + ip);
foreach (string subnet in subnets)
Console.WriteLine("Subnet: " + subnet);
}
}
Console.ReadLine();
}
}