Aunque suelo observar con curiosidad toda la información que me llega al respecto, la administración de sistemas no es una de las áreas por las que tenga simpatía. Quizás sea porque los problemas que se plantean y resuelven son motivados y enfocados (generalmente) desde un punto de vista completamente corporativista, en el sentido de que dichos problemas y soluciones sólo sirven para cada caso concreto. Por ejemplo, conocer en profundidad la administración de sistemas en plataformas Windows practicamente no sirve para nada al administrador de otras plataformas como Unix o Mac. Por supuesto se aprenden y existen cosas comunes puesto que forzosamente deben compartir estándares (TCP, HTML, UNICODE, etc...) y también implementan estrategias similares (grupos de usuarios, perfiles, estructura de archivos, etc...) pero, siendo estrictos, saber que en Windows existe la clave de registro HKEY_LOCAL_MACHINE de poco o nada sirve en otros sistemas y saber ese tipo de cosas ocupa un amplio porcentaje del saber de un buen administrador de sistemas.
Afortunadamente, de vez en cuando se ven buenas ideas más o menos (nada es perfecto) estandarizadas que solucionan de una forma fabulosa problemas aparentemente difíciles, en este caso, normalizar y poner a disposición de todo el mundo la ingente cantidad de información que almacena un sistema informático (sí, en el sentido mas amplio de la palabra).
Windows Management Instrumentation (WMI) es la implementación de Microsoft de los estándares Web Based Enterprise Management (WBEM) y Common Information Model (CIM) emitidos por la Distributed Management Task Force (DMTF).
Acceder a la información disponible en WMI no es nada difícil aunque puede hacerse algo pesado si el número de estructuras y propiedades a las que queremos acceder es elevado, más que nada, que todas ellas estarán contenidas como datos en estructuras abstractas y no serán accesibles directamente.
Existe una buena forma de acceder a esa información desde .NET y es creando un wrapper mediante la herramientas mgmtclassgen.exe.
WMI es bastísimo, todo lo que podamos imaginar de un sistema informático (Windows) está ahí. Cualquier información sobre discos, procesadores, memoria, USB, red, usuarios, procesos, etc... la encontraremos ahí. Por eso, lo primero que deberemos hacer es saber dónde esta lo que queremos buscar. Para ello, qué mejor que dirigirse al SDK de Microsoft.
Construirnos una clase que contenga todos los miembros del elemento del que estamos interesados es muy fácil:
C:\...\tu-proyecto>mgmtclassgen.exe Win32_NetworkAdapter /l CS /p WMI_Win32_NetworkAdapter.cs
En el ejemplo anterior, se ha generado una clase para el tipo de objeto ManagementObject y para que "cargue" un objeto desde dicho tipo (puesto que no son de tipos "compatibles") una opción muy cómoda es pasarselo al constructor, por ejemplo:
... ManagementObjectSearcher m = new ManagementObjectSearcher( @" SELECT * FROM Win32_NetworkAdapter " ); foreach( ManagementObject o in m.Get() ) { Networkadapter a = new Networkadapter( o ); ...usar 'a', por ejemplo: ... a.Name ... ... a.ServiceName ... ... a.Description ... ... a.MACAddress ... ... } ...
Cómodo ¿no?.