Sei sulla pagina 1di 45

Manual de

Informacin General

sobre WMI .NET


Manual de Informacin General sobre WMI .NET

ndice del Manual

1. Resumen de la tecnologa para WMI .NET


2. Arquitectura de WMI .NET
3. Escenarios con WMI .NET
4. Directorio de cdigo de WMI .NET
5. Ms informacin sobre WMI .NET
5.1. Ventajas de WMI en .NET Framework
5.2. Limitaciones de WMI en .NET Framework
5.3. Seguridad de WMI en .NET Framework
5.4. Esquema de WMI y .NET Framework
5.5. Introduccin al acceso a datos WMI
5.5.1.Cmo configurar el entorno de desarrollo para utilizar WMI .NET
5.5.2.Cmo enumerar las clases en un espacio de nombres WMI
5.5.3.Aplicacin System.Management sencilla
5.5.4.Cmo ejecutar un mtodo
5.5.5.Eventos de administracin WMI
5.5.5.1. Cmo recibir un evento
5.5.6.Consultas WMI
5.5.6.1. Cmo recuperar colecciones de objetos administrados
5.5.6.2. Cmo recuperar informacin acerca de objetos administrados mediante
consultas
5.6. Temas de programacin avanzada en WMI .NET
5.6.1.Cmo llamar a un mtodo de forma asincrnica
5.6.2.Cmo conectarse a un equipo remoto
5.6.3.Cmo recibir eventos de administracin sin esperar
5.6.4.Cmo recibir informacin de administracin sin esperar
5.6.5.Cmo actualizar un descriptor de seguridad de un espacio de nombres WMI
5.6.6.Cmo utilizar objetos con establecimiento inflexible de tipos
5.6.6.1. Cdigo generado desde MgmtClassGen.exe
5.7. Proporcionar informacin de administracin mediante instrumentacin de aplicaciones
5.7.1.Clases WMI en cdigo administrado
5.7.2.Cmo proporcionar datos de administracin
5.7.2.1. Herencia para clases derivadas de Instance
5.7.2.2. Herencia para clases no derivadas de Instance
5.7.3.Cmo publicar en WMI el esquema de una aplicacin instrumentada
5.7.4.Proporcionar eventos de administracin
5.7.4.1. Cmo crear una clase de evento mediante la derivacin de BaseEvent
5.7.4.1.1. Herencia de eventos para clases derivadas de BaseEvent
5.7.4.2. Cmo crear una clase de eventos con el atributo InstrumentationClass
5.7.4.2.1. Herencia de eventos para clases no derivadas de BaseEvent

MCT: Luis Dueas Pag. 2 de 45


Manual de Informacin General sobre WMI .NET

Informacin General sobre WMI .NET


Con el espacio de nombres de .NET Framework System.Management, puede desarrollar aplicaciones en C#, Microsoft
Visual Basic .NET o Microsoft J# para obtener datos empresariales y automatizar tareas administrativas mediante
Instrumental de administracin de Windows (WMI). Tambin puede desarrollar aplicaciones que proporcionen datos a
clases WMI con el espacio de nombres System.Management.Instrumentation.
Esta gua constituye un suplemento a la informacin de la gua de programacin de .NET Framework y proporciona
informacin general acerca del uso y la programacin de ejemplos de cdigo para clases en los espacios de nombres
System.Management y System.Management.Instrumentation. La gua de programacin de .NET Framework contiene
toda la informacin de referencia con respecto a los espacios de nombres System.Management y System.
Management.Instrumentation.

En esta seccin
Resumen de la tecnologa para WMI .NET
Resume los conceptos sobre WMI .NET y el uso de clases en los espacios de nombres WMI .NET.
Arquitectura de WMI .NET
Traza un diagrama de la arquitectura de la API de WMI .NET e ilustra cmo interactan las aplicaciones
creadas con la API con proveedores y clases WMI.
Escenarios con WMI .NET
Describe los escenarios ms habituales para la implementacin de clases WMI .NET.
Directorio de cdigo de WMI .NET
Proporciona vnculos a ejemplos de cdigo para diversas tareas con los espacios de nombres
System.Management y System.Management.Instrumentation. Estos ejemplos se clasifican por tipo de
tarea.

Referencia
Espacio de nombres System.Management
Proporciona documentacin de referencia para el espacio de nombres System.Management, que contiene
clases que se utilizan para el acceso y la manipulacin de informacin de administracin de WMI.
Espacio de nombres System.Management.Instrumentation
Proporciona documentacin de referencia para el espacio de nombres System.Management.
Instrumentation, que contiene clases que se utilizan para crear proveedores de eventos y datos.

Secciones relacionadas
Ms informacin sobre WMI .NET
Proporciona una descripcin general de WMI en .NET Framework y cmo funciona con el WMI original.
Introduccin al acceso a datos WMI
Describe qu se necesita para empezar a utilizar WMI en .NET Framework.
Temas de programacin avanzada en WMI .NET
Proporciona vnculos a temas que contienen ejemplos de operaciones avanzadas relacionadas con WMI en
.NET Framework.
Proporcionar informacin de administracin mediante instrumentacin de aplicaciones
Explica para qu se utiliza un proveedor WMI y cmo puede usarse WMI en .NET Framework para crear un
proveedor WMI.

1. Resumen de la tecnologa para WMI .NET


Instrumental de administracin de Windows (WMI) es un componente del sistema operativo Windows que permite
obtener acceso mediante programacin a informacin de administracin en un entorno empresarial. WMI en .NET
Framework se basa en la tecnologa WMI original y permite el mismo desarrollo de aplicaciones y proveedores, adems
de las ventajas que ofrece la programacin en .NET Framework.
Las clases .NET Framework que utilizan WMI se encuentran en los espacios de nombres System.Management y
System.Management.Instrumentation. Sin embargo, las aplicaciones de cdigo administrado, basadas en .NET
Framework, presentan algunas limitaciones que no tienen las aplicaciones y los proveedores de WMI original.

Palabras clave
Calificador, proveedor, lenguaje de consulta WMI, consumidor de eventos, modelo de informacin comn, asincrnico,
semisincrnico, esquema Win32, aplicacin de administracin

Espacios de nombres
System.Management, System.Management.Instrumentation

MCT: Luis Dueas Pag. 3 de 45


Manual de Informacin General sobre WMI .NET

Tecnologas relacionadas
Instrumental de administracin de Windows (WMI)
WMI en .NET Framework se basa en la tecnologa WMI original.

Informacin previa
La versin no administrada de WMI es la implementacin de Microsoft de WBEM (Web-Based Enterprise Management),
una iniciativa del sector desarrollada para normalizar la tecnologa de administracin de entornos informticos
empresariales. WMI utiliza clases basadas en el estndar del sector CIM (modelo de informacin comn) para
representar sistemas, procesos, redes, dispositivos y otros componentes empresariales.
WMI suministra un esquema de clases preinstalado que permite a secuencias de comandos o aplicaciones programadas
con lenguajes de secuencias de comandos, Visual Basic o C++, supervisar y configurar aplicaciones, componentes de
sistema o de red y hardware de una organizacin. Por ejemplo, las instancias de la clase Win32_Process representan
todos los procesos de un equipo y la clase Win32_LogicalDisk puede representar los dispositivos de disco.
La arquitectura de WMI consta de los niveles siguientes:
Los componentes de software cliente realizan operaciones mediante WMI, como leer detalles de
administracin, configurar sistemas y realizar suscripciones a eventos.
El administrador de objetos es un intermediario entre los proveedores y los clientes que proporciona ciertos
servicios esenciales, como la publicacin y suscripcin estndar de eventos, el filtrado de eventos, motor de
consultas y otros servicios.
Los componentes de software de proveedor capturan y devuelven datos activos a las aplicaciones cliente,
procesan llamadas a mtodos procedentes de los clientes y vinculan al cliente con la infraestructura que se
est administrando.

Implementacin de clases WMI .NET


WMI en .NET Framework se basa en la tecnologa WMI y permite el mismo desarrollo de aplicaciones y proveedores,
con las ventajas que ofrece .NET Framework. Sin embargo, las aplicaciones de cdigo administrado creadas en .NET
Framework presentan algunas limitaciones que no tienen los proveedores de WMI original.
WMI organiza sus clases reinstaladas en espacios de nombres. Los espacios de nombres WMI, como root\cimv2 y
root\default, no deben confundirse con los espacios de nombres .NET Framework System.Management
y System.Management.Instrumentation. El espacio de nombres System.Management contiene WMI en clases .NET
Framework para llevar a cabo operaciones WMI. El espacio de nombres System.Management.
Instrumentation contiene las clases para agregar instrumental a la aplicacin.
Los administradores y los programadores de TI puede utilizar las clases de System.Management para escribir
aplicaciones que obtengan acceso a datos WMI en cualquier lenguaje .NET, como ASP.NET, C#, Visual Basic .NET o J#.
Estas aplicaciones pueden:
Enumerar o recuperar una coleccin de datos de propiedad de instancia, como la propiedad FreeSpace de
todas las instancias de Win32_LogicalDisk en todos los equipos de una red.
Consultar datos de instancias seleccionadas.
WMI en .NET Framework utiliza el lenguaje de consulta de WMI original WQL, un subconjunto de SQL.
Suscribirse a eventos, definidos como instancias de clases de eventos.
Se produce un evento cuando una aplicacin instrumentada (proveedor) crea una instancia de una de sus
clases de eventos.
Los desarrolladores pueden utilizar las clases de System.Management.Instrumentation para instrumentar su
aplicacin de manera que proporcione datos a WMI acerca del comportamiento de la aplicacin.
La instrumentacin implica que cree sus propias clases e instancias con propiedades y mtodos que almacenan datos
sobre la aplicacin en WMI. Al establecer determinados atributos para clases, puede designarlos como instrumental. Por
ejemplo, su aplicacin puede exponer datos sobre su estado y rendimiento o uso de recursos. La aplicacin tambin
puede suministrar datos a WMI sobre los dispositivos con los que interacta la aplicacin. Puede crear clases y
registrarlas con WMI para que los datos estn a disposicin de otras secuencias de comandos y aplicaciones. Una
aplicacin instrumentada es un proveedor de datos para WMI que funciona del mismo modo que los proveedores en
WMI original.
La funcionalidad de WMI en .NET Framework se logra a travs de una serie de herramientas WMI integradas en el
entorno de desarrollo Microsoft Visual Studio .NET. Por ejemplo, puede utilizarse Server Explorer Management Extension
de Visual Studio .NET como ayuda para desarrollar aplicaciones de administracin.

Sinopsis de las clases WMI .NET


En las siguientes tablas se enumeran las clases principales que deben implementarse para cada una de las reas de
tareas especificadas. En los casos pertinentes, tambin se enumeran las interfaces y los elementos de configuracin
asociados. sta no es una lista exhaustiva de las clases de cada espacio de nombres, sino que incluye todas las clases
que se muestran en los temas prcticos.
Espacio de nombres System.Management

MCT: Luis Dueas Pag. 4 de 45


Manual de Informacin General sobre WMI .NET

rea de tecnologa Clases/interfaces/elementos de configuracin

Obtener informacin de clases WMI ManagementObject, ManagementClass

Consultar datos SelectQuery, ManagementObjectSearcher, WqlObjectQuery, ObjectQu


Consultar datos de forma ery
asincrnica ManagementObjectCollection, ManagementOperationObserver

Ejecutar mtodos ManagementBaseObject


Ejecutar mtodos de forma ManagementOperationObserver
asincrnica

Recibir eventos WqlEventQuery, ManagementEventWatcher


Recibir eventos de forma EventArrivedEventArgs, EventArrivedEventHandler, CompletedEvent
asincrnica Args, CompletedEventHandler

Conectarse a un equipo remoto ConnectionOptions, ManagementScope


Espacio de nombres System.Management.Instrumentation

rea de tecnologa Clases/interfaces/elementos de configuracin

Crear proveedores de datos Instance, InstrumentationClassAttribute, InstrumentedAttribute

Crear proveedores de eventos BaseEvent, Instrumentation

Registrar un proveedor ManagementInstaller

2. Arquitectura de WMI .NET


Las clases del espacio de nombres System.Management interactan con el administrador de objetos WMI para enviar y
recibir datos en el repositorio WMI, as como objetos dinmicos suministrados por proveedores. Los formularios Web
Forms y otras aplicaciones de administracin utilizan los mtodos, las propiedades, los constructores y otros miembros
del espacio de nombres System.Management.

Elementos de arquitectura
En la siguiente ilustracin se identifican los tres niveles de WMI, as como el modo en que el espacio de nombres
System.Management se distribuye en capas en WMI:
Niveles de WMI

Los clientes que obtienen acceso a los datos a travs de WMI pueden ser:
Formularios Windows Forms
Formularios Web Forms/ASP.NET
Aplicaciones de administracin, como Management Operations Manager (MOM), Systems Management
Server (SMS) o HP OpenView.
Los proveedores de datos de administracin pueden ser:
Proveedores de WMI original que exponen datos de sistema o de aplicacin, como el proveedor
Win32_Provider o el proveedor de Registro del sistema.

MCT: Luis Dueas Pag. 5 de 45


Manual de Informacin General sobre WMI .NET

Aplicaciones de Windows Forms y de marco de pginas Web Forms/ASP.NET que exponen su instrumental de
administracin a otros clientes, como SMS.

3. Escenarios con WMI .NET


Las clases WMI .NET permiten automatizar tareas administrativas. Los escenarios de este tema describen las tareas ms
habituales que se pueden realizar con WMI en .NET Framework.
Si es nuevo usuario de WMI y .NET Framework, empiece por Introduccin al acceso a datos WMI.
Si tiene experiencia en el uso de WMI o .NET Framework, quiz necesite informacin sobre temas tales como el acceso a
datos en equipos remotos o la realizacin de llamadas asincrnicas.

Escenario 1: Recibir datos WMI


Puede crear una aplicacin cliente que solicite datos de clases WMI. Las clases WMI suministran informacin acerca de
componentes de sistemas informticos, como la versin de un sistema operativo, el espacio libre disponible en una
unidad de disco duro, la direccin IP de un equipo u otros datos acerca de un sistema informtico. Las clases Win32, por
ejemplo Win32_LogicalDisk y Win32_OperatingSystem, son clases WMI preinstaladas que proporcionan la
informacin que se consulta con ms frecuencia. En su aplicacin, consultar las propiedades de la clase que desea para
recibir los datos. Las clases del espacio de nombres System.Management se utilizan para ejecutar la consulta.

Escenario 2: Ejecutar un mtodo de una clase WMI


Puede crear una aplicacin cliente que ejecute un mtodo de una clase WMI. Mediante la ejecucin de mtodos de
clase WMI puede controlar el comportamiento de distintos componentes de un equipo. Por ejemplo, puede ejecutar el
mtodo Create de la clase WMI Win32_Process para iniciar un proceso, o bien ejecutar el mtodo Reboot de la clase
Win32_OperatingSystem para reiniciar un equipo. Puede utilizar clases del espacio de nombres System.Management
para ejecutar mtodos de clase WMI.

Escenario 3: Recibir un evento de WMI


Puede crear una aplicacin cliente que reciba eventos generados por WMI mediante la especificacin del tipo de evento
que se debe recibir. Por ejemplo, puede recibir un evento cada vez que se inicia o se detiene un proceso, o cuando
cambia el Registro de un equipo. Las clases del espacio de nombres System.Management se utilizan para recibir un
evento.

Escenario 4: Obtener acceso a un equipo remoto


Puede crear una aplicacin cliente que se conecte a un equipo remoto y que, a continuacin, consulte datos WMI,
ejecute un mtodo o reciba un evento en el equipo remoto. Las clases del espacio de nombres System.Management se
utilizan para la conexin al equipo remoto. Por ejemplo, puede conectarse a un equipo remoto y comprobar cunto
espacio de disco libre hay disponible en la unidad de disco del equipo remoto, reiniciar el equipo remoto o recibir una
notificacin de evento cada vez que se cambia el Registro en el equipo remoto.

Escenario 5: Crear un proveedor de datos o de eventos


Puede crear una aplicacin instrumentada o un proveedor de eventos o datos WMI con las clases del espacio de
nombres System.Management.Instrumentation. Despus de crear un proveedor de datos o eventos para una aplicacin,
otras aplicaciones pueden descubrir la aplicacin que tiene el proveedor, supervisar las propiedades de la aplicacin que
defina en el proveedor de datos y configurar objetos con WMI para obtener los datos que se proporcionan. Puede
permitir que otras personas y aplicaciones consulten datos acerca de la aplicacin mediante WMI. Lea
atentamente Limitaciones de WMI en .NET Framework si tiene la intencin de instrumentar una aplicacin.
Si nunca ha creado una aplicacin instrumentada o un proveedor de WMI original, empiece por Proporcionar
informacin de administracin mediante instrumentacin de aplicaciones.

4. Directorio de cdigo de WMI .NET


Este tema proporciona vnculos a ejemplos de cdigo relacionados con WMI .NET que estn disponibles en la seccin de
la documentacin relativa a WMI .NET.
Tenga en cuenta que un vnculo siempre lleva a la parte superior del tema en el que se encuentra el ejemplo de cdigo.
Todos los ejemplos de cdigo de un tema estn vinculados al encabezado de ese tema.
Hay ejemplos de cdigo adicionales en la documentacin de referencia de la biblioteca de clases para los tipos y
miembros de los espacios de nombres System.Management y System.Management.Instrumentation.
Ejemplos de aplicaciones cliente
Consultas WMI
Aplicacin System.Management sencilla
Cmo recuperar colecciones de objetos administrados
Cmo recuperar informacin acerca de objetos administrados mediante consultas

MCT: Luis Dueas Pag. 6 de 45


Manual de Informacin General sobre WMI .NET

Cmo ejecutar un mtodo


Cmo recibir un evento
Cmo enumerar las clases en un espacio de nombres WMI
Cmo conectarse a un equipo remoto
Ejemplos de aplicaciones cliente asincrnicas
Cmo llamar a un mtodo de forma asincrnica
Cmo recibir eventos de administracin sin esperar
Cmo recibir informacin de administracin sin esperar
Ejemplos de objetos con establecimiento inflexible de tipos
Cmo utilizar objetos con establecimiento inflexible de tipos
Ejemplos de seguridad
Cmo actualizar un descriptor de seguridad de un espacio de nombres WMI
Ejemplos de proveedor
Cmo proporcionar datos de administracin
Herencia para clases derivadas de Instance
Herencia para clases no derivadas de Instance
Cmo crear una clase de evento mediante la derivacin de BaseEvent
Cmo crear una clase de eventos con el atributo InstrumentationClass
Herencia de eventos para clases derivadas de BaseEvent
Herencia de eventos para clases no derivadas de BaseEvent
Cmo publicar en WMI el esquema de una aplicacin instrumentada

5. Ms informacin sobre WMI .NET


Este tema proporciona vnculos a otros temas en los que se explican las distintas reas de WMI .NET con ms detalles
que en una descripcin general o un resumen, a travs de explicaciones sobre cmo utilizar WMI .NET e informacin
acerca de los distintos aspectos del uso de WMI en .NET Framework.

Ms informacin
En los siguientes temas se proporciona ms informacin sobre las distintas reas de WMI .NET:
Ventajas de WMI en .NET Framework
Describe las ventajas derivadas de utilizar WMI .NET en lugar de WMI original.
Limitaciones de WMI en .NET Framework
Explica las limitaciones de WMI .NET en comparacin con las que supone el uso de WMI original.
Seguridad de WMI en .NET Framework
Proporciona una descripcin general de la seguridad de WMI .NET para obtener acceso y proporcionar datos
de un modo seguro.
Esquema de WMI y .NET Framework
Explica en qu consiste WMI y cmo se incorpora en .NET Framework. En este tema se describen de forma
detallada los componentes de WMI.
Introduccin al acceso a datos WMI
Proporciona un punto de partida para crear aplicaciones WMI en .NET Framework.
Temas de programacin avanzada en WMI .NET
Proporciona vnculos a temas que contienen ejemplos de operaciones avanzadas para WMI en .NET
Framework.
Proporcionar informacin de administracin mediante instrumentacin de aplicaciones
Explica para qu se utiliza un proveedor WMI y cmo puede usarse WMI en .NET Framework para crear un
proveedor WMI.

5.1. Ventajas de WMI en .NET Framework


La escritura de una aplicacin cliente o de un proveedor con WMI en .NET Framework proporciona diversas ventajas con
respecto a WMI original, sobre todo para los desarrolladores que utilizan C# en lugar de C++. En este caso, escribir
un proveedor equivale a agregar instrumental a una aplicacin escrita en cdigo administrado.
WMI en .NET Framework ofrece las siguientes ventajas para escribir aplicaciones cliente y proveedores:
Aprovechamiento de caractersticas de Common Language Runtime, como recoleccin de elementos no
utilizados, indizador personalizado y diccionarios.
Tambin ofrece otras caractersticas de Common Language Runtime, como administracin automtica de
memoria, implementacin eficaz, un marco de trabajo orientado a objetos, seguridad basada en pruebas y
control de excepciones.

MCT: Luis Dueas Pag. 7 de 45


Manual de Informacin General sobre WMI .NET

Definicin de clases y publicacin de instancias ntegramente con clases .NET Framework para instrumentar
aplicaciones con objeto de que las aplicaciones puedan proporcionar datos a WMI.
Las clases de System.Management.Instrumentation le permiten registrar un nuevo proveedor, crear clases
nuevas y publicar instancias sin utilizar el cdigoMOF (Managed Object Format).
Simplicidad de uso.
En ocasiones, resulta difcil o muy laborioso desarrollar aplicaciones C++ para WMI original. La estructura de
clases de System.Management aporta una mayor simplicidad, comparable a las secuencias de comandos, a las
aplicaciones desarrolladas en .NET Framework. El desarrollo de aplicaciones y proveedores puede realizarse
con mayor rapidez con una depuracin ms sencilla.
Acceso a todos los datos WMI.
Las aplicaciones cliente tienen el mismo tipo de acceso a datos WMI y pueden realizar las mismas operaciones
con stos que en WMI original. Las aplicaciones instrumentadas por proveedor presentan ms restricciones.

5.2. Limitaciones de WMI en .NET Framework


Si bien el desarrollo de proveedores y aplicaciones de administracin empresarial es ms rpido con WMI en .NET
Framework, existen algunas limitaciones. Estas limitaciones afectan principalmente a los proveedores de objetos
instrumentados con cdigo administrado. Los objetos expuestos mediante proveedores de WMI C++ nativos todava
pueden exponer estas funciones a las que se puede obtener acceso desde cdigo administrado mediante clases
System.Management Una aplicacin cliente an puede realizar la mayora de las operaciones WMI originales. La mayora
de las limitaciones de WMI surgen en .NET Framework cuando se escriben aplicaciones instrumentadas por proveedor,
segn se describe en Proporcionar informacin de administracin mediante instrumentacin de aplicaciones.
Aunque no constituye una limitacin, una aplicacin instrumentada slo puede existir como proveedor desacoplado,
fuera de proceso para WMI.
WMI en .NET Framework presenta varias limitaciones:
Los proveedores de cdigo administrado no pueden definir mtodos.
Las aplicaciones instrumentadas que se ejecutan en .NET Framework y proporcionan datos a WMI no pueden
utilizar los mtodos de clase System.Management o System.Management.Instrumentation para definir e
implementar mtodos. Un proveedor an puede ejecutar el mtodo de un proveedor WMI original. Por
ejemplo, un proveedor instrumentado .NET Framework an puede ejecutar el mtodo StopService para una
instancia de la clase WMI preinstalada Win32_Service.
Las aplicaciones instrumentadas no pueden exponer propiedades que permitan escritura en nuevas clases si
no son contenedoras de clases WMI no administradas subyacentes.
Un usuario de una clase creada por una aplicacin instrumentada no puede cambiar datos de instancia y
despus volver a escribir los datos mediante una operacin Put.
No se pueden crear calificadores en clases instrumentadas.
Los calificadores WMI son similares conceptualmente a los atributos de cdigo administrado, aunque no hay
una asignacin directa entre ellos. Hay atributos en el espacio de nombres System.Management.
Instrumentation, pero no estn representados por calificadores en la definicin de clase WMI. En cambio, el
cdigo administrado define varias clases de atributos en System.Management. Instrumentation que
permiten a los desarrolladores definir la asignacin en una sintaxis declarativa. Algunas clases de atributos
que se utilizan con frecuencia son InstrumentedAttribute e InstrumentationClassAttribute.
Las propiedades de objetos instrumentados no se pueden definir como propiedades clave.
Aunque WMI admite objetos incrustados y referencias a otros objetos con WMI en .NET Framework, slo se
pueden utilizar objetos incrustados cuando se definen nuevas clases.
No se puede crear un proveedor del consumidor de eventos en cdigo administrado.
Sin embargo, las aplicaciones cliente administradas an pueden tener acceso a cdigo no administrado y a
proveedores del consumidor WMI, como los consumidores estndar.
WMI en .NET Framework no admite actualizadores.
Si desea recuperar datos de clases Win32_FormattedData_*, puede utilizar la clase System.Diagnostics.
PerformanceCounter en lugar de utilizar actualizadores con las clases Win32_FormattedData_*, o bien
obtener los ejemplos de contador sin formato de las clases Win32_PerfRawData_* en el intervalo deseado y
calcular el resultado mediante los dos ltimos ejemplos.
El espacio de nombres System.Management.Instrumentation no admite la herencia de clases si la clase
derivada est un espacio de nombres distinto del espacio de la clase primaria.
La infraestructura WMI y los proveedores en la pila nativa y administrada (.NET) no han sido comprobados
para su uso en un entorno de clsteres, por lo que no son compatibles con ese tipo de entorno.

5.3. Seguridad de WMI en .NET Framework


La seguridad de WMI en .NET Framework presenta diversos aspectos: la seguridad de los espacios de nombres WMI, la
seguridad DCOM para obtener acceso a los equipos locales y remotos, y los permisos necesarios en las aplicaciones
.NET Framework cuando se utiliza el servicio WMI no administrado subyacente.

MCT: Luis Dueas Pag. 8 de 45


Manual de Informacin General sobre WMI .NET

Obtener acceso a datos de WMI de un modo seguro


Seguridad de espacios de nombres WMI
Cada espacio de nombres WMI tiene un descriptor de seguridad que define los usuarios y grupos cuyo acceso
a los datos del espacio de nombres est permitido. El descriptor de seguridad est establecido inicialmente
segn la configuracin predeterminada, lo que permite que los miembros del grupo Administradores tengan
un control completo tanto local como remoto, mientras que los miembros de los grupos Todos, Servicio local
y Servicio de red tienen permiso para leer datos, escribir datos y ejecutar mtodos para proveedores en el
equipo local. El descriptor de seguridad predeterminado no permite a los miembros de los grupos Todos,
Servicio local y Servicio de red escribir un esquema nuevo ni instalar nuevos proveedores. Un miembro del
grupo Administradores puede cambiar la configuracin predeterminada mediante el Control WMI, un
complemento de MMC disponible en el Panel de control. Un descriptor de seguridad tambin se puede
actualizar mediante programacin.
Seguridad DCOM
La seguridad DCOM afecta principalmente a la obtencin de datos WMI de equipos remotos. Requiere
configuraciones de suplantacin y autenticacin.
Seguridad de acceso a cdigo no administrado .NET Framework
El servicio WMI es un componente no administrado que proporciona acceso a datos de distintos orgenes de
sistema operativo. El cdigo administrado que consume o proporciona datos y eventos WMI debe tener
permiso de acceso a cdigo no administrado.
Conectarse a travs del Firewall de Windows para obtener acceso a datos WMI de un equipo remoto
El servicio Firewall de Windows (antes conocido como Servidor de seguridad de conexin a Internet) y el
modelo de objetos componentes distribuido (DCOM) pueden provocar errores de acceso denegado (como un
error de servidor RPC no disponible) cuando los equipos remotos y las cuentas que se utilizan para
conexiones remotas no se han configurado correctamente. El Firewall de Windows est habilitado de forma
predeterminada en los equipos con Windows XP SP2, pero no en los equipos con Windows Server 2003 SP1.

Proporcionar datos a WMI de un modo seguro


WMI tambin proporciona los mecanismos para definir quin puede publicar datos y eventos en el sistema. Las
clases System.Management.Instrumentation utilizan la arquitectura de proveedores desasociados. En el proceso de la
aplicacin instrumentada reside un proveedor de WMI desasociado, cuya duracin es controlada por la aplicacin. La
aplicacin es cliente para WMI. El servicio WMI carga y descarga un proveedor de WMI no desasociado.
Los proveedores desasociados presentan las siguientes restricciones de seguridad:
Un proveedor desasociado no puede suplantar de forma predeterminada al cliente que realiza la llamada. Las
llamadas realizadas desde WMI a un proveedor desasociado suelen realizarse con un nivel de suplantacin de
identificacin, de modo que el proveedor pueda identificar a quin realiza la llamada, pero no suplantarlo.
De forma predeterminada, para el registro de cualquier proveedor con WMI es necesario que el usuario sea
administrador en el equipo local. Por lo tanto, cuando se instala una aplicacin instrumentada, el usuario que
la instala debe ser administrador para registrar esta aplicacin como proveedor.
El programador de un ensamblado instrumentado puede definir un descriptor de seguridad que identifique a
los usuarios y grupos a los que se les permitir publicar eventos y datos de administracin desde ese
ensamblado. En System.Management.Instrumentation, este descriptor de seguridad se puede pasar en
formato SDDL (lenguaje de definicin de descriptores de seguridad) como argumento para el atributo
Instrumented. El descriptor de seguridad se utiliza despus en el registro de la aplicacin con WMI. Un
administrador puede cambiar el descriptor de seguridad despus de la implementacin de la aplicacin.
De forma predeterminada, a los siguientes usuarios y grupos se les permite publicar datos y eventos:
Administradores
Sistema local
Servicio local
Servicio de red
Inicio de sesin por lotes
Si desea cambiar esta configuracin predeterminada puede especificar una configuracin de SDDL alternativa para la
aplicacin.

Especificar usuarios que pueden proporcionar datos y eventos


Para cambiar el conjunto predeterminado de usuarios que tienen permiso para activar eventos o exponer datos de una
aplicacin administrada, debe cambiar el descriptor de seguridad predeterminado que se haya asignado al proveedor
de una aplicacin. Esta operacin puede realizar mediante la especificacin del parmetro SecurityDescriptor para el
atributo de ensamblado instrumentado, de modo que sea:
O:BAG:BAD:(A;; 0x10000001;;;BA)(A;; 0x10000001;;;SY)
(A;; 0x10000001;;;LA)(A;; 0x10000001;;;NS)(A;; 0x10000001;;;LS)
(A;; 0x10000001;;;S-1-5-3)(A;; 0x10000001;;;S-1-5-6)

MCT: Luis Dueas Pag. 9 de 45


Manual de Informacin General sobre WMI .NET

Nota

Para Windows 2000, el descriptor de seguridad predeterminado es el siguiente:


O:BAG:BAD:(A;;0x10000001;;;BA)(A;;0x10000001;;;SY)
(A;;0x10000001;;;LA)(A;; 0x10000001;;;S-1-5-3)
(A;; 0x10000001;;;S-1-5-6)
Cuando conceda a un nuevo usuario permiso para proporcionar instrumental, debe anexar la cadena ACE del nuevo
usuario al descriptor de seguridad predeterminado. Si slo especifica el nuevo descriptor de seguridad en el
parmetro SecurityDescriptor, se sobrescribir el descriptor de seguridad predeterminado. Por ejemplo, para agregar el
grupo Usuarios avanzados a la lista de usuarios permitidos y al descriptor de seguridad predeterminado de Windows
2000, proporcione la siguiente cadena SDDL:
O:BAG:BAD:(A;; 0x10000001;;;BA)(A;; 0x10000001;;;SY)
(A;; 0x10000001;;;LA)(A;; 0x10000001;;;NS)(A;; 0x10000001;;;LS)
(A;; 0x10000001;;;S-1-5-3) (A;; 0x10000001;;;S-1-5-6)(A;;0x1;;;PU)

En esta cadena, "(A;;0x1;;;PU)" (al final de la cadena) es la nueva cadena ACE para permitir a los miembros del grupo
Usuarios avanzados que proporcionen instrumental. WMI requiere el bit menos significativo establecido (es decir, 0x1)
para el valor de derechos de usuario en una cadena ACE.

5.4. Esquema de WMI y .NET Framework


El trmino esquema que se utiliza en el contexto de WMI en .NET Framework puede hacer referencia tanto a los
esquemas WMI como a la biblioteca de clases .NET Framework. En WMI la informacin se publica mediante esquemas.
Los esquemas agrupan clases e instancias de administracin que se usan en un entorno empresarial y que presentan
una vista coherente y unificada de todos los tipos de objetos lgicos y fsicos. WMI suministra esquemas preinstalados
basados en el esquema CIM (modelo de informacin comn) desarrollado por el grupo de estndares Distributed
Management Task Force (DMTF). Por lo general, los diversos subconjuntos de un esquema preinstalado suelen
tener proveedores diferentes y a menudo se encuentran en espacios de nombres distintos.
Las clases bajo System.Management y System.Management.Instrumentation contienen la funcionalidad para WMI en
.NET Framework, como ManagementObject o ManagementObjectSearcher. En esta documentacin, "clase WMI" y
"objeto WMI" siempre hacen referencia a clases o instancias almacenadas en el repositorio WMIo que producen
dinmicamente los proveedores.

Espacios de nombres
El trmino "espacio de nombres" se utiliza tanto en el contexto de WMI como de .NET Framework, si bien hace
referencia a entidades diferentes. Un espacio de nombres WMI es una subdivisin del repositorio WMI, tambin
conocido como repositorio CIM. El espacio de nombres WMI ms frecuente es root\cimv2, donde se almacena el
enorme conjunto de clases Win32. En esta documentacin se hace referencia a estos espacios de nombres como
espacios de nombres WMI.
Un espacio de nombres de .NET Framework es el mecanismo que permite limitar el mbito de un nombre de clase de
manera que su definicin queda circunscrita a un espacio especfico. System.Management y System.Management.
Instrumentation son espacios de nombres dentro de la Biblioteca de clases .NET Framework. En esta documentacin se
hace referencia a estos espacios de nombres como espacios de nombres .NET Framework.

Esquema WMI
WMI utiliza el concepto orientado a objetos de una clase para modelar una empresa. Las instancias de las clases WMI
preinstaladas, como Win32_Process oWin32_Processor, representan entidades de una red, un sistema informtico o un
sistema operativo. Varios proveedores integrados definen y suministran datos activos para las clases con nombres que
empiezan por "Win32_". Un subconjunto de las clases Win32, las clases Win32_PerfRawData y las clases
Win32_PerfFormattedData, proporcionan los mismos datos de rendimiento activos que la herramienta Monitor de
sistema. El proveedor de contadores de rendimiento y el proveedor de contador suministran datos a las instancias de
estas clases. El proveedor de volmenes de almacenamiento suministra otro subconjunto de clases WMI, del
que Win32_Volume constituye un ejemplo. Otros proveedores integrados, como el proveedor de directivas, suministran
clases preinstaladas con otros nombres, como MSFT_Providers.
Las clases incluyen propiedades que describen datos y mtodos para describir y controlar el comportamiento de una
aplicacin o de un dispositivo. Otros programadores pueden crear sus propios esquemas para describir entornos
especficos de su organizacin. Debido a que los esquemas estn diseados de manera que se puedan extender
infinitamente, siempre es posible agregar clases nuevas para representar nuevos objetos administrados en un entorno
existente.
La herencia es una herramienta muy eficaz en el esquema WMI. No es necesario que cree clases desde cero, ya que a
menudo se pueden derivar a partir de clases CIM o WMI existentes.
Al exponer informacin a travs de WMI, es esencial disponer de una buena estructura de clases que permita a las
herramientas administrar la aplicacin. La estructuracin de la informacin en un esquema es una caracterstica esencial

MCT: Luis Dueas Pag. 10 de 45


Manual de Informacin General sobre WMI .NET

de un sistema de administracin distribuido: permite definir operaciones que se pueden procesar con total confianza en
toda una serie de sistemas que admitan el esquema.
El esquema WMI es autodescriptivo. Es decir, puede describir mediante programacin qu propiedades y mtodos
proporciona una clase.
WMI le permite definir asociaciones, o vinculaciones, entre clases. Estas asociaciones pueden representar relaciones
entre instancias especficas de las clases vinculadas. Las aplicaciones de administracin pueden recorrer esas relaciones
de asociacin a travs de mtodos y consultas como RelatedObjectQuery o RelationshipQuery. Los programadores de
terceros tambin pueden definir clases de asociacin para su entorno de administracin.

Esquema .NET Framework


El esquema de clases se encuentra en el espacio de nombres System.Management .NET Framework. Debido a que el
espacio de nombres System.Management.Instrumentation permite a los programadores personalizar la asignacin
entre clases administradas y clases WMI, tienen a su disposicin lo mejor de ambos mundos. Los programadores de
aplicaciones pueden definir clases con la estructura que ms convenga a sus aplicaciones. Las clases administradas se
pueden asignar a clases WMI que se ajusten a los estndares de los esquemas WMI. De esta forma, los programadores
pueden disfrutar de una mayor productividad mediante el uso de las clases administradas, mientras que las
herramientas de administracin pueden interpretar correctamente los datos del instrumental proporcionado por la
aplicacin.

5.5. Introduccin al acceso a datos WMI


Esta seccin contiene informacin sobre cmo configurar el entorno de desarrollo para utilizar el espacio de nombres
System.Management. Tambin se muestra cmo realizar tareas administrativas bsicas con WMI en cdigo administrado
de .NET Framework.
WMI suele ser utilizado por usuarios con privilegios administrativos. Los usuarios sin esos privilegios no podrn realizar
las siguientes tareas:
Crear, modificar o eliminar clases WMI estticas de forma predeterminada.
Realizar operaciones no permitidas por los proveedores de WMI.
Se tiene en cuenta la seguridad especificada en el Control WMI.
Implementar aplicaciones instrumentadas.
Sin embargo, los usuarios que no tienen privilegios administrativos pueden ejecutar aplicaciones
instrumentadas cuando la aplicacin es implementada por un usuario con privilegios administrativos. A los
usuarios sin privilegios administrativos deben concedrseles derechos para publicar instancias WMI o activar
eventos WMI.
Generar clases de enlace en tiempo de compilacin en el caso de clases WMI que se encuentran en espacios
de nombres WMI protegidos.
Los temas de esta seccin se centran en tareas que tienen acceso a datos WMI preinstalados u objetos creados por
otros proveedores de WMI (las mismas operaciones de cliente que pueda haber programado en secuencias de
comandos o aplicaciones con WMI original).
Si, en cambio, prefiere obtener acceso a datos o eventos desde una aplicacin instrumentada (un proveedor de eventos o
datos WMI) en lugar de utilizar datos WMI preinstalados, puede recurrir a la informacin de Proporcionar informacin
de administracin mediante instrumentacin de aplicaciones para crear un proveedor y utilizar despus la informacin
de esta seccin para escribir una aplicacin cliente con el fin de obtener acceso a los datos WMI que suministra su
proveedor.
Los temas siguientes le ayudarn a empezar a utilizar WMI en .NET Framework.

Tema Description

Cmo configurar el entorno de Cmo configurar un proyecto de Visual Studio para el desarrollo
desarrollo para utilizar WMI de System.Management.
.NET

Consultas WMI Cmo utilizar los mtodos de la clase ManagementClass para enumerar u
obtener una coleccin de objetos WMI y cmo utilizar la
clase ManagementObjectSearcher para consultar una coleccin de objetos
que cumplan criterios especificados.

Cmo recuperar informacin Cmo utilizar clases de consulta para obtener subconjuntos especificados
acerca de objetos administrados de objetos WMI.
mediante consultas

Cmo ejecutar un mtodo Cmo ejecutar mtodos de objetos WMI.

MCT: Luis Dueas Pag. 11 de 45


Manual de Informacin General sobre WMI .NET

Eventos de administracin WMI Cmo utilizar ManagementEventWatcher para la suscripcin a eventos


WMI.

5.5.1. Cmo configurar el entorno de desarrollo para utilizar


WMI .NET
En este tema se describe cmo configurar un proyecto Visual Studio .NET que utilice miembros del espacio de
nombres System.Management.

Para utilizar System.Management


1. Inicie Visual Studio .NET.
2. Seleccione Archivo>Nuevo>Proyecto.
3. En la columna Tipo de proyecto, seleccione el tipo de proyecto que se va a crear (C# o Visual Basic .NET).
4. En la columna Plantilla, seleccione una plantilla de proyecto (Aplicacin de consola, Aplicacin para Windows,
etc.).
5. D nombre al proyecto.
6. Haga clic en Aceptar para crear un proyecto nuevo.
7. Seleccione Proyecto>Agregar referencia.
8. Seleccione System.DirectoryServices.dll de la lista.
9. Haga clic en Aceptar para agregar la referencia.
10. Agregue la siguiente lnea al cdigo:
Using System.Management;

Compilar el cdigo
Sugerencia No es necesario agregar al cdigo la instruccin del espacio de nombres using (instruccin Imports en VB
.NET), aunque puede simplificar los nombres de objeto. Si no agrega esta instruccin, deber declarar un objeto como
System.Management.ManagementObject en lugar de ManagementObject.

5.5.2. Cmo enumerar las clases en un espacio de nombres WMI


Este tema proporciona un ejemplo completo de cmo explorar las clases disponibles en un espacio de nombres WMI.

Ejemplo
En el ejemplo de cdigo siguiente se crea una aplicacin que permite al usuario explorar las clases WMI disponibles en
un espacio de nombres especificado.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Management;
using System.Data;

namespace SchemaBrowser
{
// This application browses WMI classes available in local namespace enter by users.
public class SchemaBrowerForm : System.Windows.Forms.Form
{
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox namespaceValue;
private System.Windows.Forms.ListBox classList;
private System.Windows.Forms.Button searchButton;
// Number of namespaces or classes found
private int count;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label statusValue;
private System.ComponentModel.Container components = null;

public SchemaBrowerForm()
{
count = 0;

MCT: Luis Dueas Pag. 12 de 45


Manual de Informacin General sobre WMI .NET

InitializeComponent();
}

protected override void Dispose( bool disposing )


{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

private void InitializeComponent()


{
this.classList = new System.Windows.Forms.ListBox();
this.searchButton = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.namespaceValue = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.statusValue = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// classList
//
this.classList.Location = new System.Drawing.Point(16, 64);
this.classList.Name = "classList";
this.classList.SelectionMode = System.Windows.Forms.SelectionMode.None;
this.classList.Size = new System.Drawing.Size(264, 173);
this.classList.Sorted = true;
this.classList.TabIndex = 3;
//
// searchButton
//
this.searchButton.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
this.searchButton.Location = new System.Drawing.Point(224, 6);
this.searchButton.Name = "searchButton";
this.searchButton.Size = new System.Drawing.Size(56, 24);
this.searchButton.TabIndex = 2;
this.searchButton.Text = "Search";
this.searchButton.Click += new System.EventHandler(this.button1_Click);
//
// label2
//
this.label2.Location = new System.Drawing.Point(16, 45);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(48, 14);
this.label2.TabIndex = 4;
this.label2.Text = "Results:";
//
// namespaceValue
//
this.namespaceValue.Location = new System.Drawing.Point(83, 8);
this.namespaceValue.Name = "namespaceValue";
this.namespaceValue.Size = new System.Drawing.Size(128, 20);
this.namespaceValue.TabIndex = 0;
this.namespaceValue.Text = "root/default";
//
// label1
//
this.label1.Location = new System.Drawing.Point(16, 10);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(68, 16);

MCT: Luis Dueas Pag. 13 de 45


Manual de Informacin General sobre WMI .NET

this.label1.TabIndex = 1;
this.label1.Text = "Namespace:";
//
// statusValue
//
this.statusValue.BorderStyle = System.Windows.Forms.
BorderStyle.FixedSingle;
this.statusValue.Location = new System.Drawing.Point(56, 250);
this.statusValue.Name = "statusValue";
this.statusValue.Size = new System.Drawing.Size(224, 18);
this.statusValue.TabIndex = 6;
//
// label3
//
this.label3.Location = new System.Drawing.Point(16, 251);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(40, 18);
this.label3.TabIndex = 5;
this.label3.Text = "Status:";
//
// Form1
//
this.AcceptButton = this.searchButton;
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(298, 279);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.statusValue, this.label3, this.label2, this.classList,
this.searchButton, this.label1, this.namespaceValue});
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.Name = "Form1";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Schema Browser";
this.ResumeLayout(false);

// The main entry point for the application.


[STAThread]
static void Main()
{
Application.Run(new SchemaBrowerForm());
}

private void button1_Click(object sender, System.EventArgs e)


{
// Initialize class counter and clear list view.
count = 0;
this.classList.Items.Clear();
if (namespaceValue.Text.Equals(""))
{
this.AddNamespacesToList();
}
else
{
System.Threading.ThreadPool.QueueUserWorkItem(
new System.Threading.WaitCallback(this.AddClassesToList));
}
}

private void AddNamespacesToList()


{
this.statusValue.Text = "Searching...";
try
{
// Enumerate all WMI instances of __namespace WMI class.

MCT: Luis Dueas Pag. 14 de 45


Manual de Informacin General sobre WMI .NET

ManagementClass nsClass = new ManagementClass(


new ManagementScope("root"), new ManagementPath("__namespace"),
null);
foreach(ManagementObject ns in nsClass.GetInstances())
{
this.classList.Items.Add(ns["Name"].ToString());
count++;
}
this.statusValue.Text = count + " namespaces found.";
}
catch (ManagementException e)
{
this.statusValue.Text = e.Message;
}
}

private void AddClassesToList(object o)


{
this.statusValue.Text = "Searching...";
try
{
// Perform WMI object query on selected namespace.
ManagementObjectSearcher searcher = new ManagementObjectSearcher(
new ManagementScope(namespaceValue.Text),
new WqlObjectQuery("select * from meta_class"), null);
foreach (ManagementClass wmiClass in searcher.Get())
{
this.classList.Items.Add(wmiClass["__CLASS"].ToString());
count++;
}
this.statusValue.Text = count + " classes found.";
}
catch (ManagementException ex)
{
this.statusValue.Text = ex.Message;
}
}
}
}

5.5.3. Aplicacin System.Management sencilla


En este ejemplo se muestra cmo WMI en .NET Framework lleva a cabo una enumeracin sencilla de una clase WMI en
comparacin con una secuencia de comandos similar escrita en Visual Basic Scripting Edition (VBScript).

En el siguiente ejemplo de cdigo se enumeran todas las instancias de la clase WMI Win32_Service.
using System;
using System.Management;

class Sample
{
public static void Main()
{
ManagementClass c = new ManagementClass("Win32_Service");
foreach (ManagementObject o in c.GetInstances())
{
Console.WriteLine("Service Name = {0} ProcessId = {1} Instance Path = {2}",
o["Name"], o["ProcessId"], o.Path);
}
}
}

En el siguiente ejemplo de cdigo VBScript se enumeran todas las instancias de la clase WMI Win32_Service.
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

MCT: Luis Dueas Pag. 15 de 45


Manual de Informacin General sobre WMI .NET

Set colServices = objWMIService.InstancesOf("Win32_Service")


For Each objService in colServices
Wscript.Echo "-----------------------------------------------------"
Wscript.Echo "Service Name = " & objService.Name & VBNewLine _
& "Process Id = " & objService.ProcessId & VBNewLine _
& "Instance Path = " & objService.Path_
Next

5.5.4. Cmo ejecutar un mtodo


Los objetos de administracin (que representan clases WMI) pueden tener mtodos a los que sea posible llamar a travs
de aplicaciones cliente de administracin. Por ejemplo, un objeto disco (que representa a la clase Win32_LogicalDisk)
podra exponer un mtodo "formato", o un objeto servicio (que representa a la claseWin32_Service) podra tener
mtodos "iniciar" y "detener".

Ejemplo
El cdigo siguiente ofrece un ejemplo de cmo invocar un mtodo WMI esttico. En el ejemplo se invoca el
mtodo Create de la clase Win32_Process con objetos de parmetro para iniciar Calc.exe. En el ejemplo tambin se
muestra cmo invocar el mtodo Create de la clase Win32_Process con una matriz de argumentos para iniciar
Notepad.exe. En este caso en concreto, el mtodo es esttico y se invoca en la propia clase; sin embargo, los mtodos se
invocarn normalmente en instancias.
using System;
using System.Management;

public class InvokeMethod


{

public static void Main()


{
//Get the object on which the method will be invoked
ManagementClass processClass = new ManagementClass("Win32_Process");
// Option 1: Invocation using parameter objects
//================================================
//Get an input parameters object for this method
ManagementBaseObject inParams =
processClass.GetMethodParameters("Create");
//Fill in input parameter values
inParams["CommandLine"] = "calc.exe";
//Execute the method
ManagementBaseObject outParams =
processClass.InvokeMethod("Create", inParams, null);
//Display results
//Note: The return code of the method is provided
// in the "returnValue" property of the outParams object
Console.WriteLine("Creation of calculator " +
"process returned: " + outParams["returnValue"]);
Console.WriteLine("Process ID: " + outParams["processId"]);
// Option 2: Invocation using args array
//=======================================
//Create an array containing all arguments for the method
object[] methodArgs = {"notepad.exe", null, null, 0};
//Execute the method
object result = processClass.InvokeMethod ("Create", methodArgs);
//Display results
Console.WriteLine ("Creation of process returned: " + result);
Console.WriteLine ("Process id: " + methodArgs[3]);
}
}

El cdigo siguiente ofrece un ejemplo de cmo invocar un mtodo WMI en una instancia de una clase WMI. En el
ejemplo se invoca el mtodo StartService de la clase Win32_Service en la instancia de la clase en la que la propiedad
Name es igual a 'PlugPlay' (el servicio Plug and Play).
using System;
using System.Management;
using System.Windows.Forms;

MCT: Luis Dueas Pag. 16 de 45


Manual de Informacin General sobre WMI .NET

namespace WMISample
{
public class CallWMIMethod
{
public static void Main()
{
try
{
ManagementObject classInstance = new ManagementObject("root\\CIMV2",
"Win32_Service.Name='PlugPlay'", null);
// no method [in] parameters to define
// Execute the method and obtain the return values.
ManagementBaseObject outParams = classInstance.InvokeMethod(
"StartService", null, null);
// List outParams
Console.WriteLine("Out parameters:");
Console.WriteLine("ReturnValue: " + outParams["ReturnValue"]);
}
catch(ManagementException err)
{
MessageBox.Show("An error occured while trying to execute" +
" the WMI method: " + err.Message);
}
}
}
}

5.5.5. Eventos de administracin WMI


Los eventos WMI son notificaciones de lo que ocurre en el sistema operativo, en los dispositivos o en las aplicaciones de
la red o de la organizacin. En WMI, un evento se representa como un objeto, como __InstanceCreationEvent. WMI
genera este evento cuando una aplicacin inicializa una nueva instancia de una clase WMI; por ejemplo,
Win32_LogicalDisk. Las aplicaciones instrumentadas pueden publicar eventos a los que se pueden suscribir clientes.
En los siguientes pasos se describe el proceso de suscripcin a eventos y la recepcin de stos:
1. Para suscribirse a un evento, especifique una consulta de eventos y una clase de eventos con WqlEventQuery y
la sintaxis de WQL, subconjunto de SQL especfico para las consultas WMI.
Por ejemplo, el cliente recibe una notificacin cuando se modifica una instancia de Win32_Service, si la clase
de eventos es __InstanceModificationEvent y la consulta de eventos utiliza la clase Win32_Service.
2. Suministre la consulta de eventos a una instancia de ManagementEventWatcher, que establece la suscripcin.
3. Reciba el evento.
El cliente puede recibir eventos de forma sincrnica al llamar al mtodo System.Management.
ManagementEventWatcher.WaitForNextEvent. Para recibir notificaciones de eventos de forma asincrnica, un
cliente puede utilizar la clase de delegado EventArrivedEventHandler.
Las aplicaciones que proporcionan eventos pueden utilizar clases de atributos de espacio de nombres System.
Management.Instrumentation para designar sus clases de eventos o derivar una nueva clase de evento de BaseEvent.

5.5.5.1. Cmo recibir un evento


Las aplicaciones cliente pueden suscribirse para recibir eventos de una aplicacin proveedora de eventos mediante una
consulta que describa los eventos y estableciendo una suscripcin a travs de ManagementEventWatcher.
La aplicacin cliente puede esperar un evento mediante una llamada al mtodo System.Management.
ManagementEventWatcher.WaitForNextEvent, que establece una suscripcin sincrnica para recibir eventos. Como
alternativa, el cliente puede configurar una suscripcin asincrnica y realizar otras operaciones mientras espera eventos.
Puede crear consultas de eventos con las clases EventQuery o WqlEventQuery. Tanto el mtodo sincrnico como el
asincrnico producen consumidores de eventosWMI temporales. Un consumidor temporal no reanuda la ejecucin
despus de que se reinicie el equipo.
Las aplicaciones que proporcionan eventos pueden utilizar clases de atributos de espacio de nombres System.
Management.Instrumentation para designar sus clases de eventos o derivar una nueva clase de eventos de BaseEvent.

Para suscribirse a eventos de forma sincrnica


1. Especifique una consulta de eventos con una clase de consulta de eventos, como WqlEventQuery, que toma
instrucciones sobre consultas WQL como argumentos de entrada para describir el evento.
WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent",
new TimeSpan(0,0,1), "TargetInstance isa \"Win32_Process\"");

MCT: Luis Dueas Pag. 17 de 45


Manual de Informacin General sobre WMI .NET

2. Cree una nueva instancia de ManagementEventWatcher para establecer la suscripcin.


ManagementEventWatcher watcher = new ManagementEventWatcher(query);
3. Espere los eventos.
ManagementBaseObject e = watcher.WaitForNextEvent();

Ejemplo
En el ejemplo de cdigo siguiente se muestra cmo realizar una suscripcin a eventos intrnsecos de WMI y recibirlos de
manera sincrnica. En el ejemplo se crea en sintaxis WQL una consulta de eventos, que se utiliza para inicializar un
objeto ManagementEventWatcher y, despus, se espera a que se entreguen los eventos que cumplan las condiciones
especificadas en el filtro.
En este ejemplo de cdigo, el cliente recibe una notificacin cuando se crea una instancia de Win32_Process porque la
clase de eventos es__InstanceCreationEvent. El cliente recibe eventos de forma sincrnica tras llamar al mtodo
System.Management.ManagementEventWatcher.WaitForNextEvent. Este ejemplo se puede probar mediante el
inicio de un proceso, como el Bloc de notas, mientras se ejecuta el cdigo de ejemplo.
using System;
using System.Management;

// This example shows synchronous consumption of events.


// The client is blocked while waiting for events.
public class EventWatcherPolling
{
public static int Main(string[] args)
{
// Create event query to be notified within 1 second of
// a new process being created
WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent",
new TimeSpan(0,0,1), "TargetInstance isa \"Win32_Process\"");
// Initialize an event watcher and subscribe to events
// that match this query
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
// times out watcher.WaitForNextEvent in 5 seconds
watcher.Options.Timeout = new TimeSpan(0,0,5);
// Block until the next event occurs
// Note: this can be done in a loop if waiting for more than one occurrence
Console.WriteLine("Open an application (notepad.exe) to trigger an event.");
ManagementBaseObject e = watcher.WaitForNextEvent();
//Display information from the event
Console.WriteLine("Process {0} has been created, path is: {1}",
((ManagementBaseObject)e ["TargetInstance"])["Name"],
((ManagementBaseObject)e ["TargetInstance"])["ExecutablePath"]);
//Cancel the subscription
watcher.Stop();
return 0;
}
}

5.5.6. Consultas WMI


Puede utilizar consultas WMI estndar en aplicaciones .NET Framework. En las consultas WMI se utiliza el el lenguaje de
consulta WMI (WQL), subconjunto de SQL. La cadena de la consulta se almacena en una clase de consulta .NET
Framework, como la clase SelectQuery, la clase WqlEventQuery o la clase RelatedObjectQuery, y es invocada por los
constructores de clases ManagementObjectSearcher o ManagementEventWatcher.

Las consultas limitan la cantidad de datos que se devuelven mediante la inclusin de lo


siguiente:
La clusula SELECT para especificar nicamente las propiedades de las que desea que se devuelvan datos.
La clusula WHERE para especificar qu instancias desea que se devuelvan.
Por ejemplo, con la siguiente consulta se seleccionan todas las unidades de un equipo (C, D, etc.) que tengan menos de
2 MB de espacio libre:
SELECT * FROM Win32_LogicalDisk WHERE FreeSpace < 2000000

Tipos de clases de consulta

MCT: Luis Dueas Pag. 18 de 45


Manual de Informacin General sobre WMI .NET

WMI en .NET Framework tiene una serie de clases de consulta en el esquema de Framework. Algunas realizan ciertos
tipos de consultas WQL, como las consultas WQL SELECT o las consultas WQL ASSOCIATORS OF.
En la siguiente tabla se muestran las clases de consulta que se pueden utilizar para crear consultas de los datos WMI.

Clase .NET
Description
Framework

EventQuery Consulta de evento WMI. Los objetos de esta clase o sus derivados se utilizan en el
constructor de la clase ManagementEventWatcherpara la suscripcin a eventos WMI.
Siempre que pueda, utilice un derivado ms especfico de esta clase, como la
clase WqlEventQuery.

ManagementQuery Clase base abstracta de la que se derivan otras clases de consulta.

ObjectQuery Consulta de objetos WMI que puede devolver instancias o clases.

RelatedObjectQuery Consulta WQL ASSOCIATORS OF que se puede utilizar tanto para consultas de
instancias como de esquema, en funcin de si solicita la clase o un subconjunto de
instancias. Se utiliza para especificar la consulta en el constructor de la
clase ManagementObjectSearcher con el fin de obtener todas las instancias de clases
relacionadas a travs de clases de asociacin.

RelationshipQuery Consulta WQL REFERENCES OF que se puede utilizar tanto para consultas de
instancias como de esquema, en funcin de si solicita la clase o un subconjunto de
instancias.

SelectQuery Consulta WQL SELECT que se puede utilizar tanto para consultas de instancias
como de esquema, en funcin de si solicita la clase o un subconjunto de instancias.

WqlEventQuery Consulta de evento WMI en formato WQL. Los objetos de esta clase o sus derivados
se utilizan en la clase ManagementEventWatcherpara la suscripcin a eventos
WMI.

WqlEventQuery Consulta WMI en formato WQL. Los objetos de esta clase o sus derivados se utilizan
para especificar una consulta en el constructor de la clase Management
ObjectSearcher. Para una mayor especificidad, utilice cuando sea posibles derivados
de esta clase ms concisos, como la clase SelectQuery.
En el siguiente diagrama se muestra la herencia de clases de consulta WMI en la biblioteca de clases .NET Framework.
WMI en .NET Framework tiene clases de consulta de eventos y de objetos.

Clases de consulta y consultas WQL


En los dos ejemplos de cdigo siguiente se realizan consultas equivalentes.
En este ejemplo de cdigo se utiliza la clase SelectQuery para formular una consulta WQL.
using System;
using System.Management;
class Query_SelectQuery
{
public static int Main(string[] args)
{
SelectQuery selectQuery = new SelectQuery("Win32_LogicalDisk");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery);
foreach (ManagementObject disk in searcher.Get())
{
Console.WriteLine(disk.ToString());
}
Console.ReadLine();

MCT: Luis Dueas Pag. 19 de 45


Manual de Informacin General sobre WMI .NET

return 0;
}
}

En este ejemplo de cdigo se utiliza la forma WQL original de una consulta SELECT.
using System;
using System.Management;

class Query_Select_FullString
{
public static int Main(string[] args)
{
WqlObjectQuery wqlQuery = new WqlObjectQuery("SELECT * FROM Win32_LogicalDisk");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wqlQuery);
foreach (ManagementObject disk in searcher.Get())
{
Console.WriteLine(disk.ToString());
}
Console.ReadLine();
return 0;
}
}

5.5.6.1. Cmo recuperar colecciones de objetos administrados


La funcin de la coleccin .NET Framework proporciona un medio de controlar una gran cantidad de datos WMI
devueltos por enumeraciones y consultas. Muchas clases del espacio de nombres System.Management tienen mtodos
que devuelven colecciones, como la clase ManagementClass, la clase ManagementObject o la clase ManagementObject
Searcher.
La clase ManagementObjectCollection representa a la propia coleccin. Tambin se puede utilizar la clase System.
Management.ManagementObjectCollection.ManagementObjectEnumerator para realizar otras operaciones con
colecciones.

Ejemplo
En el cdigo de ejemplo siguiente se utilizan las clases de la coleccin System.Management para enumerar las
variables de entorno de un equipo. En este ejemplo, algunos parmetros se pueden dejar con los valores
predeterminados porque la informacin se obtiene del equipo local. Asimismo, se devuelve una coleccin que incluye
todos los objetos de Win32_Environment, la clase de datos WMI que representa variables de entorno. Despus de
recuperar la coleccin, el cdigo la enumera mediante la instruccin foreach y muestra el nombre y el valor de cada
variable de la coleccin. Los programadores que estn familiarizados con la API Scripting para WMI notarn algunas
similitudes.

En el ejemplo se obtiene la coleccin consultando con la clase ManagementObjectSearcher.


using System;
using System.Management;

public class EnumerateInstances


{
public static int Main(string[] args)
{
// Build a query for enumeration of Win32_Environment instances
SelectQuery query = new SelectQuery("Win32_Environment");
// Instantiate an object searcher with this query
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);

// Call Get() to retrieve the collection of objects and loop through it


foreach (ManagementObject envVar in searcher.Get())
Console.WriteLine("Variable : {0}, Value = {1}",
envVar["Name"],envVar["VariableValue"]);
return 0;
}
}

MCT: Luis Dueas Pag. 20 de 45


Manual de Informacin General sobre WMI .NET

5.5.6.2. Cmo recuperar informacin acerca de objetos


administrados mediante consultas
Se pueden especificar consultas de datos WMI en .NET Framework como una cadena en el formato WQL admitido por
WMI, o bien se pueden construir mediante una clase de consulta del espacio de nombres System.Management. La
clase WqlEventQuery se utiliza para consultas de eventos, mientras que la clase WqlObjectQuery se utiliza para consultas
de datos.

Ejemplo
En el ejemplo de cdigo siguiente se muestra cmo se puede realizar una consulta mediante la clase Management
ObjectSearcher. En este caso, la clase SelectQuery se usa para especificar una solicitud de variables de entorno bajo el
nombre de usuario System. La consulta devuelve resultados en una coleccin.
using System;
using System.Management;

// This example demonstrates how to perform an object query.


public class QueryInstances {
public static int Main(string[] args) {
// Create a query for system environment variables only
SelectQuery query = new SelectQuery("Win32_Environment","UserName=\"<SYSTEM>\"");
// Initialize an object searcher with this query
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
// Get the resulting collection and loop through it
foreach (ManagementObject envVar in searcher.Get()) {
Console.WriteLine("System environment variable {0} = {1}",
envVar["Name"], envVar["VariableValue"]);
}
return 0;
}
}

5.6. Temas de programacin avanzada en WMI .NET


En la tabla siguiente se describen operaciones avanzadas para WMI en .NET Framework y se proporcionan vnculos a
temas con cdigo de ejemplo.

Tema Descripcin

Cmo conectarse a un equipo Las conexiones remotas para WMI en .NET Framework se realizan a
remoto travs del objeto ManagementScope.

Cmo llamar a un mtodo de Una aplicacin cliente puede llamar a un mtodo de forma asincrnica y
forma asincrnica realizar otras operaciones mientras se ejecuta el mtodo.

Cmo recibir eventos de Una aplicacin cliente puede configurar una suscripcin asincrnica y
administracin sin esperar realizar otras operaciones mientras espera eventos.

Cmo recibir informacin de Las operaciones de administracin pueden realizarse de forma asincrnica.
administracin sin esperar

Cmo actualizar un descriptor de En este ejemplo se actualiza la informacin de descriptor de seguridad


seguridad de un espacio de para un espacio de nombres, de modo que ciertos usuarios puedan obtener
nombres WMI acceso al espacio de nombres y modificarlo.

Cmo utilizar objetos con WMI permite generar automticamente contenedores enlazados en tiempo
establecimiento inflexible de de compilacin para objetos WMI.
tipos

5.6.1. Cmo llamar a un mtodo de forma asincrnica


Puede llamar un mtodo de forma asincrnica con WMI en .NET Framework pasando una instancia de la clase
ManagementOperationObserver en el mtodo InvokeMethod. Al llamar un mtodo de forma asincrnica, puede realizar

MCT: Luis Dueas Pag. 21 de 45


Manual de Informacin General sobre WMI .NET

otras tareas mientras se llama y ejecuta el mtodo. Si llama al mtodo de forma semi sincrnica, debe esperar a que el
mtodo termine la ejecucin antes de iniciar otras tareas.

Ejemplo
El cdigo siguiente llama a un mtodo de forma asincrnica. Se llama al mtodo Win32_Process.Create para crear un
nuevo proceso de Calc.exe.
using System;
using System.Management;

public class InvokeMethodAsync


{
public InvokeMethodAsync()
{
// Get the object on which the method will be invoked
ManagementClass processClass = new ManagementClass("Win32_Process");
// Create a results and completion handler
ManagementOperationObserver handler = new ManagementOperationObserver();
handler.Completed += new CompletedEventHandler(Completed);
// Invoke method asynchronously
ManagementBaseObject inParams = processClass.GetMethodParameters("Create");
inParams["CommandLine"] = "calc.exe";
processClass.InvokeMethod(handler, "Create", inParams, null);
// Do something while method is executing
while(!isComplete)
{
System.Threading.Thread.Sleep(1000);
}
}

private bool isComplete = false;


private ManagementBaseObject returnObject;

// Delegate called when the method completes and results are available
private void NewObject(object sender, ObjectReadyEventArgs e)
{
Console.WriteLine("New Object arrived!");
returnObject = e.NewObject;
}

private void Completed(object sender, CompletedEventArgs e)


{
isComplete = true;
}

public static void Main()


{
InvokeMethodAsync wmiMethod = new InvokeMethodAsync();
}

5.6.2. Cmo conectarse a un equipo remoto


WMI est diseado para supervisar el hardware y el software en equipos remotos. Las conexiones remotas para WMI en
.NET Framework se realizan a travs del objeto ManagementScope.
Para la conexin remota con clases en el espacio de nombres System.Management se utiliza DCOM como mecanismo
remoto subyacente. Las conexiones WMI remotas deben ajustarse a los requisitos de seguridad de DCOM por lo que
respecta a la suplantacin y la autenticacin. Para conexiones entre sistemas operativos diferentes (por ejemplo, una
conexin iniciada desde un equipo Windows 2000 con un equipo Windows Server 2003), pueden ser necesarios niveles
de suplantacin y autenticacin distintos que para una conexin entre dos equipos Windows 2000.
De forma predeterminada, un mbito est enlazado al equipo local y al espacio de nombres del sistema root\cimv2. Sin
embargo, se puede cambiar el espacio de nombres en la cadena que especifica la ruta de acceso al constructor o bien
utilizar un objeto ManagementPath. La cadena utilizada para la ruta de acceso sigue las mismas reglas que en el caso de
otras rutas de acceso WMI y se deben emplear caracteres de escape con las barras diagonales inversas (\).

MCT: Luis Dueas Pag. 22 de 45


Manual de Informacin General sobre WMI .NET

Adems, cuando conecte remotamente, podr especificar credenciales para cualquier otro usuario que no sea el que ha
iniciado la sesin en curso y las operaciones en el equipo remoto se realizarn en el contexto del usuario especificado.
Para ello, se puede emplear un objeto ConnectionOptions.

Ejemplo
En el siguiente ejemplo de cdigo se establece una conexin con un equipo remoto del mismo dominio que el del
usuario y se muestra informacin acerca del sistema operativo del equipo remoto. El usuario debe ser administrador en
el equipo remoto para que pueda establecerse la conexin.
using System;
using System.Management;
public class RemoteConnect
{
public static void Main()
{
/*// Build an options object for the remote connection
// if you plan to connect to the remote
// computer with a different user name
// and password than the one you are currently using
ConnectionOptions options = new ConnectionOptions();
// and then set the options.Username and
// options.Password properties to the correct values
// and also set
// options.Authority = "ntdlmdomain:DOMAIN";
// and replace DOMAIN with the remote computer's
// domain. You can also use kerberose instead
// of ntdlmdomain.
*/
// Make a connection to a remote computer.
// Replace the "FullComputerName" section of the
// string "\\\\FullComputerName\\root\\cimv2" with
// the full computer name or IP address of the
// remote computer.
ManagementScope scope = new ManagementScope(
"\\\\FullComputerName\\root\\cimv2");
scope.Connect();
// Use this code if you are connecting with a
// different user name and password:
//
// ManagementScope scope = new ManagementScope(
// "\\\\FullComputerName\\root\\cimv2", options);
// scope.Connect();
//Query system for Operating System information
ObjectQuery query = new ObjectQuery(
"SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(scope,query);
ManagementObjectCollection queryCollection = searcher.Get();
foreach ( ManagementObject m in queryCollection)
{
// Display the remote computer information
Console.WriteLine("Computer Name : {0}", m["csname"]);
Console.WriteLine("Windows Directory : {0}",
m["WindowsDirectory"]);
Console.WriteLine("Operating System: {0}", m["Caption"]);
Console.WriteLine("Version: {0}", m["Version"]);
Console.WriteLine("Manufacturer : {0}", m["Manufacturer"]);
}
}
}

El objeto ConnectionOptions controla tambin los niveles de suplantacin y autenticacin utilizados por WMI en las
operaciones remotas con DCOM. Las configuraciones predeterminadas de estos parmetros son Impersonate y
Unchanged, respectivamente.
El valor Unchanged significa que el cliente toma de forma predeterminada los requisitos de autenticacin del servidor,
utilizando el proceso estndar de negociacin DCOM. En Windows 2000, Windows NT 4.0 y Windows 98, el servicio WMI

MCT: Luis Dueas Pag. 23 de 45


Manual de Informacin General sobre WMI .NET

requerir autenticacin de nivel de conexin, mientras que en Windows XP Home Edition, Windows XP Professional,
Windows Server 2003 y Windows Server 2003 ser necesaria la autenticacin del nivel de paquete. Si el cliente requiere
una configuracin de autenticacin especfica, la propiedad de autenticacin en el objeto ConnectionOptions se puede
utilizar para controlar el nivel de autenticacin en esta conexin concreta.
El valor Impersonate significa que el cliente permite al proveedor de datos de WMI que suplante su identidad cuando
rena la informacin requerida. Esta configuracin predeterminada es ventajosa cuando el proveedor es una aplicacin
o servicio de confianza, porque elimina la necesidad de que el proveedor realice comprobaciones explcitas de identidad
y de acceso al obtener informacin para este cliente. Sin embargo, si por cualquier motivo el proveedor de destino o la
aplicacin instrumentada no son de confianza, la suplantacin del cliente puede constituir una amenaza para la
seguridad. En tales casos, es recomendable que la aplicacin cliente cambie el nivel de suplantacin a un nivel inferior,
como Identify. Tenga en cuenta que esto puede llevar a impedir que ciertos proveedores tengan acceso a la
informacin, en casos en los que el proveedor no realiza comprobaciones de acceso o no tiene suficientes permisos en
su propio contexto de ejecucin para obtener la informacin requerida.

En siguiente ejemplo de cdigo se establece una conexin con un equipo remoto y se muestra informacin acerca del
sistema operativo del equipo remoto. El cdigo tambin crea un formulario con el fin de recopilar la informacin de
nombre de usuario y contrasea para la conexin.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Management;

namespace WMISample
{
public class MyQuerySample : System.Windows.Forms.Form
{
private System.Windows.Forms.Label userNameLabel;
private System.Windows.Forms.TextBox userNameBox;
private System.Windows.Forms.TextBox passwordBox;
private System.Windows.Forms.Label passwordLabel;
private System.Windows.Forms.Button OKButton;
private System.Windows.Forms.Button cancelButton;
private System.ComponentModel.Container components = null;

public MyQuerySample()
{
InitializeComponent();
}

protected override void Dispose(bool disposing)


{
if(disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}

private void InitializeComponent()


{
this.userNameLabel = new System.Windows.Forms.Label();
this.userNameBox = new System.Windows.Forms.TextBox();
this.passwordBox = new System.Windows.Forms.TextBox();
this.passwordLabel = new System.Windows.Forms.Label();
this.OKButton = new System.Windows.Forms.Button();
this.cancelButton = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// userNameLabel

MCT: Luis Dueas Pag. 24 de 45


Manual de Informacin General sobre WMI .NET

//
this.userNameLabel.Location = new System.Drawing.Point(16, 8);
this.userNameLabel.Name = "userNameLabel";
this.userNameLabel.Size = new System.Drawing.Size(160, 32);
this.userNameLabel.TabIndex = 0;
this.userNameLabel.Text = "Enter the user name for the remote computer:";
//
// userNameBox
//
this.userNameBox.Location = new System.Drawing.Point(160, 16);
this.userNameBox.Name = "userNameBox";
this.userNameBox.Size = new System.Drawing.Size(192, 20);
this.userNameBox.TabIndex = 1;
this.userNameBox.Text = "";
//
// passwordBox
//
this.passwordBox.Location = new System.Drawing.Point(160, 48);
this.passwordBox.Name = "passwordBox";
this.passwordBox.PasswordChar = '*';
this.passwordBox.Size = new System.Drawing.Size(192, 20);
this.passwordBox.TabIndex = 3;
this.passwordBox.Text = "";
//
// passwordLabel
//
this.passwordLabel.Location = new System.Drawing.Point(16, 48);
this.passwordLabel.Name = "passwordLabel";
this.passwordLabel.Size = new System.Drawing.Size(160, 32);
this.passwordLabel.TabIndex = 2;
this.passwordLabel.Text =
"Enter the password for the remote computer:";
//
// OKButton
//
this.OKButton.Location = new System.Drawing.Point(40, 88);
this.OKButton.Name = "OKButton";
this.OKButton.Size = new System.Drawing.Size(128, 23);
this.OKButton.TabIndex = 4;
this.OKButton.Text = "OK";
this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
//
// cancelButton
//
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.cancelButton.Location = new System.Drawing.Point(200, 88);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(128, 23);
this.cancelButton.TabIndex = 5;
this.cancelButton.Text = "Cancel";
this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
//
// MyQuerySample
//
this.AcceptButton = this.OKButton;
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.CancelButton = this.cancelButton;
this.ClientSize = new System.Drawing.Size(368, 130);
this.ControlBox = false;
this.Controls.Add(this.cancelButton);
this.Controls.Add(this.OKButton);
this.Controls.Add(this.passwordBox);
this.Controls.Add(this.passwordLabel);
this.Controls.Add(this.userNameBox);
this.Controls.Add(this.userNameLabel);
this.Name = "MyQuerySample";

MCT: Luis Dueas Pag. 25 de 45


Manual de Informacin General sobre WMI .NET

this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Remote Connection";
this.ResumeLayout(false);
}

[STAThread]
static void Main()
{
Application.Run(new MyQuerySample());
}

private void OKButton_Click(object sender, System.EventArgs e)


{
try
{
ConnectionOptions connection = new ConnectionOptions();
connection.Username = userNameBox.Text;
connection.Password = passwordBox.Text;
connection.Authority = "ntlmdomain:DOMAIN";
ManagementScope scope = new ManagementScope(
"\\\\FullComputerName\\root\\CIMV2", connection);
scope.Connect();
ObjectQuery query= new ObjectQuery("SELECT * FROM Win32_Service");
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(scope, query);
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("-----------------------------------");
Console.WriteLine("Win32_Service instance");
Console.WriteLine("-----------------------------------");
Console.WriteLine("Caption: {0}", queryObj["Caption"]);
Console.WriteLine("Description: {0}", queryObj["Description"]);
Console.WriteLine("Name: {0}", queryObj["Name"]);
Console.WriteLine("PathName: {0}", queryObj["PathName"]);
Console.WriteLine("State: {0}", queryObj["State"]);
Console.WriteLine("Status: {0}", queryObj["Status"]);
}
Close();
}
catch(ManagementException err)
{
MessageBox.Show("An error occured while querying for WMI data: "
+ err.Message);
}
catch(System.UnauthorizedAccessException unauthorizedErr)
{
MessageBox.Show("Connection error " +
"(user name or password might be incorrect): " +
unauthorizedErr.Message);
}
}

private void cancelButton_Click(object sender, System.EventArgs e)


{
Close();
}
}
}

5.6.3. Cmo recibir eventos de administracin sin esperar


Una aplicacin cliente puede configurar una suscripcin asincrnica y realizar otras operaciones mientras espera
eventos.

Para suscribirse a eventos de forma asincrnica

MCT: Luis Dueas Pag. 26 de 45


Manual de Informacin General sobre WMI .NET

1. Cree una consulta en la que se especifiquen los eventos mediante la clase EventQuery o la
clase WqlEventQuery.
2. Cree una nueva instancia de ManagementEventWatcher para suscribirse a eventos que respondan a la
consulta.
3. Configure un agente de escucha de eventos mediante los eventos EventArrived y Stopped de la clase
ManagementEventWatcher.
4. Cree una clase de controlador de eventos con un mtodo que reciba la clase EventArrivedEventArgs.
5. Cree una instancia del delegado EventArrivedEventHandler que utilice el mtodo de controlador de eventos.
6. Inicie la escucha de eventos llamando al mtodo Start de la clase ManagementEventWatcher.
Esta operacin equivale a llamar a IWbemServices::ExecNotificationQueryAsync o a SWbemServices::
ExecNotificationQueryAsync en WMI sin administrar.
7. Realice otras operaciones.
8. Llame al mtodo Stop de la clase ManagementEventWatcher para detener la escucha.
Esta llamada da fin a la suscripcin.

Ejemplo
En el siguiente ejemplo de cdigo asincrnico se configura un temporizador WMI para provocar un evento cada
segundo, y se quita cuando ya no es necesario. El objeto ManagementEventWatcher define varios eventos .NET
Framework que se generan cuando se entregan eventos de WMI. Con el fin de controlar los datos entrantes, se asocian
delegados a estos eventos.
using System;
using System.Management;

// This example shows asynchronous consumption of events.


// In this example you are listening for timer events.
// The first part of the example sets up the timer.
public class EventWatcherAsync
{
public EventWatcherAsync()
{
// Set up a timer to raise events every 1 second
//=============================================
ManagementClass timerClass = new ManagementClass("__IntervalTimerInstruction");
ManagementObject timer = timerClass.CreateInstance();
timer["TimerId"] = "Timer1";
timer["IntervalBetweenEvents"] = 1000;
timer.Put();
// Set up the event consumer
//==========================
// Create event query to receive timer events
WqlEventQuery query = new WqlEventQuery("__TimerEvent","TimerId=\"Timer1\"");
// Initialize an event watcher and subscribe to timer events
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
// Set up a listener for events
watcher.EventArrived += new EventArrivedEventHandler(HandleEvent);
// Start listening
watcher.Start();
// Do something in the meantime
System.Threading.Thread.Sleep(10000);
// Stop listening
watcher.Stop();
}

private void HandleEvent(object sender, EventArrivedEventArgs e)


{
Console.WriteLine("Event arrived !");
}

public static void Main()


{
EventWatcherAsync eventWather = new EventWatcherAsync();
}
}

MCT: Luis Dueas Pag. 27 de 45


Manual de Informacin General sobre WMI .NET

5.6.4. Cmo recibir informacin de administracin sin esperar


El acceso a informacin de administracin suele suceder en entornos distribuidos y puede tratarse de cantidades
enormes de datos. Para hacerlo posible, las operaciones de administracin tambin pueden realizarse de manera
asincrnica.
El mtodo utilizado para llamar a una operacin de manera asincrnica es una sobrecarga del mtodo sincrnico, con
un parmetro adicional del tipo ManagementOperationObserver con el fin de controlar las devoluciones de llamadas de
los resultados. Este objeto define eventos para notificaciones cuando llegan los resultados y en el momento de la
finalizacin. Puede crear controladores e incluirlos en la suscripcin que se ejecuta cuando se generan estos eventos.

Ejemplo
En el siguiente ejemplo de cdigo se demuestra cmo consultar informacin de administracin de forma asincrnica. La
consulta es para instancias de la clase Win32_Service (servicios que se ejecutan en el equipo local); se muestran el
nombre y estado de las instancias de la clase Win32_Service.
using System;
using System.Management;

// This example demonstrates how to perform an asynchronous instance enumeration.


public class EnumerateInstancesAsync
{
public EnumerateInstancesAsync()
{
// Enumerate asynchronously using Object Searcher
// ===============================================
// Instantiate an object searcher with the query
ManagementObjectSearcher searcher = new ManagementObjectSearcher(new
SelectQuery("Win32_Service"));
// Create a results watcher object
ManagementOperationObserver results = new ManagementOperationObserver();
// Attach handler to events for results and completion
results.ObjectReady += new ObjectReadyEventHandler(NewObject);
results.Completed += new CompletedEventHandler(Done);
// Call the asynchronous overload of Get() to start the enumeration
searcher.Get(results);
// Do something else while results arrive asynchronously
while (!isCompleted)
{
System.Threading.Thread.Sleep (1000);
}
Reset();
}

private bool isCompleted = false;

private void NewObject(object sender, ObjectReadyEventArgs obj)


{
Console.WriteLine("Service : {0}, State = {1}",
obj.NewObject["Name"], obj.NewObject["State"]);
}

private void Reset()


{
isCompleted = false;
}

private void Done(object sender, CompletedEventArgs obj)


{
isCompleted = true;
}

public static void Main()


{
EnumerateInstancesAsync asyncQuery = new EnumerateInstancesAsync();
}

MCT: Luis Dueas Pag. 28 de 45


Manual de Informacin General sobre WMI .NET

5.6.5. Cmo actualizar un descriptor de seguridad de un espacio


de nombres WMI
Un descriptor de seguridad identifica a un propietario de un objeto asegurable y a un grupo principal. Un descriptor de
seguridad funcional se encuentra en formato binario, pero los descriptores de seguridad tambin pueden estar en
formato de cadena para almacenar y transmitir informacin de descriptor de seguridad. Al cambiar un descriptor de
seguridad, puede conceder a un grupo ciertos derechos de acceso a un objeto asegurable. En este ejemplo se actualiza
la informacin de descriptor de seguridad para un espacio de nombres, de modo que ciertos usuarios puedan obtener
acceso al espacio de nombres y modificarlo.

Ejemplo
En el siguiente ejemplo de cdigo se conceden todos los derechos al grupo Usuarios avanzados para un espacio de
nombres determinado. Para cambiar el nombre del espacio de nombres, cambie el valor de la variable namespace
Name en la clase Sample.
using System;
using System.Management;
using System.ComponentModel;
using System.Runtime.InteropServices;

namespace ManagementSample
{
class Sample
{
private readonly string namespaceName = "TestNamespaceSecurity";

public void Run()


{
IntPtr stringSecurityDescriptorPtr = IntPtr.Zero;
IntPtr securityDescriptorPtr = IntPtr.Zero;
int stringSecurityDescriptorSize = 0;
int securityDescriptorSize = 0;
try
{
// Create a test namespace
this.CreateTestNamespace();
// Retreive SD of a namespace
ManagementClass systemSecurity = new ManagementClass("root/" +
namespaceName + ":__SystemSecurity");
ManagementBaseObject outParams = systemSecurity.InvokeMethod("GetSD",
null, null);
if ((uint)outParams["ReturnValue"] != 0)
{
Console.WriteLine("GetSD returns an error: " +
outParams["ReturnValue"]);
return;
}
// Convert SD to string SD
this.ConvertSDtoStringSD((byte[])outParams["SD"],
out stringSecurityDescriptorPtr, out stringSecurityDescriptorSize);
string stringSecurityDescriptor = Marshal.PtrToStringAuto(
stringSecurityDescriptorPtr);
Console.WriteLine("Original string security " +
"descriptor of the {0} namespace:", namespaceName);
Console.WriteLine(stringSecurityDescriptor);
// Grant all permissions to Power Users Group
stringSecurityDescriptor += "(A;;CCDCLCSWRPWPRCWD;;;PU)";
//Convert string SD to SD
Console.WriteLine("\nNew String Security Descriptor:");
Console.WriteLine(stringSecurityDescriptor);
this.ConvertStringSDtoSD(stringSecurityDescriptor,
out securityDescriptorPtr, out securityDescriptorSize);
byte[] securityDescriptor = new byte[securityDescriptorSize];

MCT: Luis Dueas Pag. 29 de 45


Manual de Informacin General sobre WMI .NET

Marshal.Copy(securityDescriptorPtr,
securityDescriptor, 0, securityDescriptorSize);
//Set the new SD for the namespace
ManagementBaseObject inParams =
systemSecurity.GetMethodParameters("SetSD");
inParams["SD"] = securityDescriptor;
outParams = systemSecurity.InvokeMethod("SetSD",
inParams, null);
if ((uint)outParams["ReturnValue"] != 0)
{
Console.WriteLine("SetSD returns error: " +
outParams["ReturnValue"]);
return;
}
Console.WriteLine("\nNew string security descriptor"
+ " is set. Press Enter to exit.");
Console.ReadLine();
}
finally
{
// Free unmanaged memory
if (securityDescriptorPtr != IntPtr.Zero)
{
Marshal.FreeHGlobal(securityDescriptorPtr);
securityDescriptorPtr = IntPtr.Zero;
}
if (stringSecurityDescriptorPtr != IntPtr.Zero)
{
Marshal.FreeHGlobal(stringSecurityDescriptorPtr);
stringSecurityDescriptorPtr = IntPtr.Zero;
}
this.DeleteTestNamespace();
}
}

public void ConvertSDtoStringSD(byte[] securityDescriptor,


out IntPtr stringSecurityDescriptorPtr,
out int stringSecurityDescriptorSize)
{
bool result =
ConvertSecurityDescriptorToStringSecurityDescriptor(
securityDescriptor, 1,
SecurityInformation.DACL_SECURITY_INFORMATION |
SecurityInformation.GROUP_SECURITY_INFORMATION |
SecurityInformation.OWNER_SECURITY_INFORMATION |
SecurityInformation.SACL_SECURITY_INFORMATION,
out stringSecurityDescriptorPtr,
out stringSecurityDescriptorSize);
if (!result)
{
Console.WriteLine( "Fail to convert SD to string SD:" );
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}

public void ConvertStringSDtoSD(string stringSecurityDescriptor,


out IntPtr securityDescriptorPtr, out int securityDescriptorSize)
{
bool result = ConvertStringSecurityDescriptorToSecurityDescriptor(
stringSecurityDescriptor, 1, out securityDescriptorPtr,
out securityDescriptorSize);
if (!result)
{
Console.WriteLine("Fail to convert string SD to SD:");
throw new Win32Exception(Marshal.GetLastWin32Error());
}

MCT: Luis Dueas Pag. 30 de 45


Manual de Informacin General sobre WMI .NET

private enum SecurityInformation : uint


{
OWNER_SECURITY_INFORMATION= 0x00000001,
GROUP_SECURITY_INFORMATION= 0x00000002,
DACL_SECURITY_INFORMATION= 0x00000004,
SACL_SECURITY_INFORMATION= 0x00000008,
PROTECTED_DACL_SECURITY_INFORMATION= 0x80000000,
PROTECTED_SACL_SECURITY_INFORMATION= 0x40000000,
UNPROTECTED_DACL_SECURITY_INFORMATION= 0x20000000,
UNPROTECTED_SACL_SECURITY_INFORMATION= 0x10000000,
};

[DllImport("Advapi32.dll", CharSet=CharSet.Auto,
SetLastError=true, ExactSpelling=false)]
private static extern bool
ConvertSecurityDescriptorToStringSecurityDescriptor(
[In] byte[] SecurityDescriptor,
[In] int RequestedStringSDRevision,
[In] SecurityInformation SecurityInformation,
[Out] out IntPtr StringSecurityDescriptor,
[Out] out int StringSecurityDescriptorLen
);

[DllImport("Advapi32.dll", CharSet=CharSet.Auto, SetLastError=true,


ExactSpelling=false)]
private static extern bool
ConvertStringSecurityDescriptorToSecurityDescriptor(
[In] string StringSecurityDescriptor,
[In] uint StringSDRevision,
[Out] out IntPtr SecurityDescriptor,
[Out] out int SecurityDescriptorSize
);

private void CreateTestNamespace()


{
ManagementClass rootNamespace = new ManagementClass("root:__namespace");
ManagementObject testNamespace = rootNamespace.CreateInstance();
testNamespace["Name"] = namespaceName;
testNamespace.Put();
}

private void DeleteTestNamespace()


{
ManagementObject testNamespace =
new ManagementObject("root:__namespace.Name='" + namespaceName + "'");
try
{
testNamespace.Get();
testNamespace.Delete();
}
catch (ManagementException e)
{
if (e.ErrorCode == ManagementStatus.NotFound) return;
}
}

[STAThread]
static void Main(string[] args)
{
try
{
new Sample().Run();
}

MCT: Luis Dueas Pag. 31 de 45


Manual de Informacin General sobre WMI .NET

catch (Win32Exception e)
{
Console.WriteLine(e);
}
}
}
}

5.6.6. Cmo utilizar objetos con establecimiento inflexible de


tipos
Para satisfacer las necesidades de extensin de los clientes, los objetos WMI se suelen enlazar en tiempo de ejecucin, lo
que no fuerza el establecimiento inflexible de los tipos. En el entorno .NET Framework, WMI permite generar
automticamente contenedores enlazados en tiempo de compilacin para objetos WMI.
Los contenedores con establecimiento inflexible de tipos permiten a las aplicaciones aprovechar todas las caractersticas
de ayuda de Microsoft Visual Studio disponibles, como Intellisense y exploracin de objetos, para los objetos con
establecimiento inflexible de tipos. Por ejemplo, puede generar un contenedor de enlace en tiempo de ejecucin para la
clase Win32_Service a fin de poder utilizar Intellisense para buscar rpidamente los miembros en la clase Win32_Service.
La siguiente lista contiene las herramientas y los mtodos que generan contenedores para objetos WMI.
La herramienta MgmtClassGen.exe en .NET Framework SDK.
La extensin Server Explorer Management de Visual Studio .NET, que genera automticamente el contenedor
al arrastrar una clase de administracin al diseador.
Mediante programacin a travs de los mtodos GetStronglyTypedClassCode.
Los contenedores se implementan como clases de cdigo administrado y, como tales, proporcionan compatibilidad con
varios lenguajes para poder utilizarlos con cualquier lenguaje de programacin.

Ejemplo
En el siguiente ejemplo de cdigo se incluye la clase con establecimiento inflexible de tipos Service, que es un
contenedor de la clase Win32_Service. Para ejecutar este ejemplo, antes debe generar una clase especfica mediante el
siguiente comando desde la lnea de comandos de Visual Studio 2005 (cambie el valor del lenguaje de cdigo en
funcin de si desea generar un archivo de cdigo C# o Visual Basic .NET):
C:\> MgmtClassGen Win32_Service /L CS /N root\cimv2 /P C:\temp\service.cs
El resultado de la herramienta de generador ser el archivo de cdigo .cs del servicio, que se debe agregar a
continuacin al proyecto junto con el cdigo que aparece abajo. Observe el uso de la clase con establecimiento
inflexible de tipos "Service" en la instruccin foreach en vez de la clase genrica ManagementObjecty el uso de la
notacin estndar simplificada que emplea puntos para el acceso a las propiedades de los objetos devueltos.

using System;
using ROOT.CIMV2.Win32;
// Contains the strongly typed generated class "Service"
// in ROOT.CIMV2.Win32 namespace. This namespace was
// generated using the MgmtClassGen tool for the Win32_Service class
class Sample
{
// Enumerate instances of Win32_Service class
void EnumerateServices()
{
Console.WriteLine("List services and their state");
foreach(Service ser in Service.GetInstances())
Console.WriteLine("Service: "+ ser.Name + " is " + ser.State);
}

public static void Main(string[] args)


{
Sample test = new Sample();
test.EnumerateServices();
return;
}
}

5.6.6.1. Cdigo generado desde MgmtClassGen.exe


La herramienta Mgmtclassgen.exe genera cdigo para una clase WMI determinada. La herramienta utiliza WMI en clases
.NET Framework que se encuentran en el espacio de nombres System.Management con el fin de generar cdigo para la

MCT: Luis Dueas Pag. 32 de 45


Manual de Informacin General sobre WMI .NET

clase. La clase generada desde Mgmtclassgen.exe permite al usuario obtener acceso a todos los mtodos y propiedades
de la clase WMI a travs de una clase de enlace en tiempo de compilacin, en contraste con las clases de enlace en
tiempo de ejecucin del espacio de nombres System.Management. Un objeto se enlaza en tiempo de compilacin
cuando se asigna a una variable que se declara de un tipo de objeto especfico. Los objetos enlazados en tiempo de
compilacin permiten al compilador asignar memoria y realizar otras optimizaciones antes de que se ejecute la
aplicacin. Por el contrario, un objeto se enlaza en tiempo de ejecucin cuando se asigna a una variable que se declara
como variable de tipo Object.

Cdigo generado
El cdigo generado desde Mgmtclassgen.exe tiene las siguientes especificaciones:
Todas las propiedades de la clase generada tienen una propiedad equivalente en la clase WMI.
o Las propiedades de slo lectura de la clase WMI, que se identifican por la ausencia de un calificador
Write o por el establecimiento de un calificador Write como null, se representan en el cdigo
generado mediante propiedades que slo utilizan el descriptor de acceso de propiedad get.
o Las propiedades estticas de la clase WMI, identificadas por un calificador esttico en la propiedad,
se representan en el cdigo generado como propiedades estticas.
o Para las propiedades de la clase WMI con calificadores ValueType y Value numricos, las clases de
enumeracin se crean en el cdigo generado. Las propiedades se asignan a un tipo Enum recin
generado.
o Para las propiedades de la clase WMI con calificadores Bitmap y BitValue numricos, las clases de
enumeracin se crean en el cdigo generado. Las propiedades se asignan al tipo Enum recin
generado.
o Todas las propiedades se marcan con atributos Visual Studio para que Visual Studio Intellisense
pueda descubrirlas.
o Todas las propiedades ValueType en el cdigo generado tienen un atributo TypeConverter
establecido como WMIValueTypeConverter. Esto permite la serializacin de estas propiedades en
cadenas.
Todos los mtodos de la clase generada tienen un mtodo equivalente en la clase WMI.
o Todos los mtodos se marcan con el atributo Visual Studio para que Visual Studio Intellisense
pueda descubrirlos.
o Los mtodos estticos de la clase WMI, identificados por un calificador esttico, se crean como
mtodos estticos en el cdigo generado.
Se crean varios constructores en el cdigo generado para inicializar una instancia de la clase generada.
o Un constructor que toma los valores de las propiedades de clase WMI clave (que identifica el
calificador clave) como argumentos de entrada. Este constructor se puede utilizar para inicializar
una instancia mediante los valores clave de la instancia de la clase.
o Una clase WMI Singleton tendr el constructor predeterminado para inicializar la instancia en la
instancia singleton de la clase.
Una clase ManagementSystemProperties interna. Esta clase tiene todas las propiedades de sistema WMI
estndar.
Se generan un enumerador interno y una clase de coleccin para controlar las enumeraciones de la instancia
de la clase WMI. Las clases generadas son <GeneratedClassName> Collection y <GeneratedClassName>
Enumerator.
Variables miembro private
o Variable ManagementBaseObject para almacenar el objeto WMI subyacente.
o Variable de cadena inicializada con el espacio de nombres WMI.
o Variable de cadena inicializada con el nombre de clase WMI.
o Variable ManagementSystemProperties para almacenar las propiedades del sistema.
o Variable AutoCommitProp de tipo Boolean para indicar si la propiedad debe guardarse en WMI
inmediatamente o si debera guardarse en WMI cuando se llame al mtodo CommitObject.
o Variable isEmbedded de tipo Boolean y variable embeddedObj de tipo ManagementBaseObject
para controlar objetos incrustados.
Propiedades public
o Propiedad AutoCommit de tipo Boolean para indicar si las propiedades deben guardarse
inmediatamente despus de establecerse, o bien cuando se llama al mtodo CommitObject.
o Propiedad CreatedWmiNamespace de tipo String que almacena el espacio de nombres WMI de la
clase.
o Propiedad CreatedClassName de tipo String que almacena el nombre de clase WMI.
o La propiedad SystemProperties del tipo ManagementSystemProperties que representa las
propiedades del sistema de la instancia WMI.
o Propiedad LateBoundObject de tipo ManagementBaseObject que almacena el objeto WMI
subyacente.

MCT: Luis Dueas Pag. 33 de 45


Manual de Informacin General sobre WMI .NET

o Propiedad StaticScope de tipo ManagementScope que almacena el mbito de la clase o instancia


WMI actual.
Mtodos public
o El mtodo GetInstances enumera una instancia de la clase. Esta funcin devuelve una coleccin.
o El mtodo CommitObject llama al mtodo Put del objeto WMI subyacente para guardar los
cambios en WMI. Se utiliza cuando la propiedad AutoCommit se establece como true.
o DeleteInstance es un mtodo esttico con el que se elimina una instancia WMI.
o Los mtodos ToDateTime y ToDmtfDateTime permiten convertir objetos datetime DMTF
en DateTime y viceversa.
o Las funciones ToTimeSpan y ToDmtfTimeInterval permiten convertir intervalos de tiempo DMTF
en objetos TimeSpan y viceversa.
La clase interna WMIValueTypeConverter, derivada de la clase TypeConverter, se genera para convertir las
distintas propiedades ValueType en otros tipos de clases. Este cdigo se agrega especficamente para que se
muestren correctamente valores de propiedad como cadenas en la ventana de propiedad de Visual Studio.
Mtodos ShouldSerialize<PropertyName> e Is<PropertyName>Null para todas las propiedades ValueType
generadas. En WMI, una propiedad de tipo de valor como Integer puede establecerse como NULL, lo que no
es posible en un entorno de programacin. Las funciones ShouldSerialize utilizan funciones Is
<PropertyName>Null para controlar valores null cuando se muestran en el examinador de propiedades de
Visual Studio.Is<PropertyName>Null se utiliza para comprobar si el valor de la propiedad es NULL.
Las funciones Reset<PropertyName> tambin se agregan para propiedades de lectura y escritura que pueden
ser null. Asimismo, estas funciones se agregan para la funcionalidad del Examinador de propiedades. Los
usuarios pueden hacer clic con el botn secundario en la propiedad en el Examinador de propiedades de
Visual Studio y establecer el valor como NULL mediante esta funcin.

5.7. Proporcionar informacin de administracin mediante


instrumentacin de aplicaciones
El objetivo del espacio de nombres System.Management.Instrumentation es reducir lo mximo posible el trabajo que
supone habilitar una aplicacin para administrarla. El espacio de nombres tambin facilita la exposicin de eventos y
datos, as como el uso de relaciones entre objetos de administracin.
Una de las principales ventajas de WMI es que permite a los programadores de aplicaciones obtener acceso a
informacin de distintos orgenes a travs de una arquitectura comn. El origen de la informacin podra ser un
dispositivo de hardware, un sistema operativo o una aplicacin de software. La informacin proporcionada por el origen
de datos se conoce como instrumental.
La finalidad del instrumental es muy parecida a la que tiene el panel frontal de un automvil. Un automvil tiene
indicadores que permiten supervisar informacin relativa a diversos componentes (como el indicador de combustible) e
indicadores que avisan cuando ocurren ciertos hechos (como la alarma de puerta abierta). Todo este instrumental
posibilita tomar decisiones acerca de cmo conducir y mantener el automvil. Los componentes de un equipo que
proporcionan informacin de instrumental permiten que el software de administracin diagnostique y solucione
problemas en el entorno informtico de una organizacin.
WMI es el instrumental estndar utilizado por aplicaciones de administracin como Microsoft Operations Manager,
Microsoft Application Center y muchas otras herramientas de administracin creadas por terceros. El sistema operativo
Windows est instrumentado con WMI, pero los programadores que deseen que sus propios productos funcionen con
herramientas de administracin deben proporcionar instrumental en su propio cdigo. El espacio de nombres System.
Management.Instrumentation permite a los programadores de cdigo administrado extraer informacin para
herramientas compatibles con WMI. La exposicin de objetos de una aplicacin para administrarlos debera resultar muy
fcil a los programadores de .NET Framework: el esquema de WMI est orientado a objetos y tiene muchos rasgos en
comn con los metadatos de .NET Framework; las clases de cdigo se asignan a las clases de esquema, las propiedades
de los objetos de cdigo se asignan a las propiedades de los objetos WMI, y as sucesivamente. Por lo tanto, es fcil
instrumentar aplicaciones de cdigo administrado para permitir su administracin. Los programadores que estn
familiarizados con la programacin de cdigo administrado ya disponen de los conocimientos y la experiencia
necesarios para proporcionar instrumental mediante WMI. La curva de aprendizaje es prcticamente inexistente y no hay
necesidad de conocer la API de cliente de WMI.
Puede exponer informacin de la aplicacin para la administracin mediante declaraciones: no hace falta ninguna
codificacin exhaustiva adicional. El programador marca los objetos como administrables mediante las clases de
atribucin de .NET Framework y define cmo se asignarn al esquema deSystem.Management.Instrumentation. El
programador tambin puede derivar la clase de una clase de esquema System.Management.Instrumentation comn
y, en este caso, el establecimiento de atributos y la asignacin ya estarn resueltos. Las clases InstrumentedAttribute y
InstrumentationClassAttribute constituyen el principal medio de instrumentar el cdigo.
Despus de que la aplicacin ha sido instrumentada, otras aplicaciones pueden descubrir, supervisar y configurar
objetos y eventos mediante WMI y las aplicaciones de administracin programadas por la amplia base de usuarios de
WMI (como Computer Associates, Tivoli Systems Inc., BMC Software, Hewlett-Packard, etctera). Los eventos de cdigo
administrado marcados para administracin se generan automticamente como eventos WMI.

MCT: Luis Dueas Pag. 34 de 45


Manual de Informacin General sobre WMI .NET

El sistema de seguridad de System.Management est estrechamente vinculado al de WMI. En WMI, el acceso de un


cliente a la informacin se controla mediante un sistema de seguridad basado en los espacios de nombres.

Recomendaciones sobre espacios de nombres


Por comodidad, durante la programacin los datos del instrumental se publicarn en el espacio de nombres
root\default, si no se especifica de otro modo mediante la clase InstrumentedAttribute en el ensamblado.
No obstante, es recomendable que los programadores reemplacen esta configuracin predeterminada y
definan un espacio de nombres especfico para su aplicacin, de manera que se pueda administrar
independientemente.
Cree un espacio de nombres independiente para su ensamblado, grupo de ensamblados o aplicacin
particular con requisitos de seguridad parecidos. Use el nombre de su compaa y el nombre del producto de
software en la definicin de su espacio de nombres para asegurarse de que son nicos. Por ejemplo, el
instrumental de su aplicacin se puede publicar en el espacio de nombres "root\<nombre de su
compaa>\<nombre de su producto>". La jerarqua de espacios de nombres tambin puede contener
informacin sobre versiones (vea ms informacin acerca del control de versiones en la seccin de registro de
esquemas).
Los administradores pueden utilizar Control WMI con el fin de especificar restricciones de seguridad para un
espacio de nombres concreto.

5.7.1. Clases WMI en cdigo administrado


El concepto de definicin de clase es el ncleo de la programacin en cdigo administrado. WMI se basa en el mismo
principio de definiciones de clase. No obstante, WMI tiene su propia sintaxis para describir clases: el formato
MOF (Managed Object Format). WMI sin administrar tambin tiene una API para la definicin de clases mediante
programacin.
La finalidad bsica del instrumental es extraer informacin que podra ser til para herramientas que intentan
administrar una aplicacin. Otras tecnologas de instrumental, como el seguimiento o los archivos de registro, obliga a
las aplicaciones a proporcionar un bloque sin formato de informacin de diagnstico sin estructurar (por ejemplo, una
simple cadena).
El instrumental de WMI permite extraer informacin muy completa basada en esquemas. Para ello, las aplicaciones
definen un conjunto de clases WMI que describen la informacin que se proporcionar a travs del instrumental. Estas
definiciones de clases se publican mediante WMI y las herramientas de administracin pueden tener acceso a ellas. Las
definiciones de clases deben estar disponibles en todo momento una vez instalada una aplicacin, no slo cuando sta
se est ejecutando. En tiempo de ejecucin, la aplicacin proporciona los datos reales que describen las clases WMI.
El modelo WMI de definiciones de clase que se pueden descubrir en cualquier momento es muy parecido al modelo CLI
(Common Language Infrastructure) de clases y metadatos administrados. El espacio de nombres System.
Management.Instrumentation permite aprovechar las similitudes entre las clases para que los programadores puedan
definir clases WMI mediante la escritura de definiciones de clases en cdigo administrado. As pues, un desarrollador de
cdigo administrado ya sabe cmo definir WMI.
En general, las clases de cdigo administrado se asignan a clases WMI. En algunos casos, las clases tienen caractersticas
que no se pueden describir en clases administradas. Por ejemplo, los tipos primitivos WMI pueden ser null, a diferencia
de los tipos de valor de CTS (Common Type System, Sistema de tipos comn), que no pueden serlo. El espacio de
nombres System.Management.Instrumentation no permite que los programadores describan clases WMI que
representan objetos que no se puede describir en el CTS.
En la lista siguiente se describen algunas de las formas bsicas en que las clases administradas se asignan a las clases
WMI:
Slo las clases administradas pblicas se pueden asignar a clases WMI y slo los miembros pblicos se
pueden asignar a la definicin de clase WMI.
Los tipos de valor primitivos se asignan directamente a tipos WMI CIM.

Tipo de datos CIM Tipo de datos CLR

uint8 Byte

sint8 SByte

uint16 UInt16

sint16 Int16

uint32 UInt32

MCT: Luis Dueas Pag. 35 de 45


Manual de Informacin General sobre WMI .NET

sint32 Int32

uint64 UInt64

sint64 Int64

string String

boolean Boolean

real32 Single

real64 Double

datetime DateTime

char16 Char

Las matrices en cdigo administrado se asignan a matrices en las definiciones de clase WMI.
La CLI distingue entre tipos de valor y tipos de referencia.
WMI no establece esta distincin y tanto los tipos de valor como los tipos de referencia se pueden asignar a
una definicin de clase WMI.
WMI admite objetos incrustados as como referencias a otros objetos.
El espacio de nombres System.Management.Instrumentation slo admite objetos incrustados, no
referencias. Para clases administradas que contienen miembros de tipo de valor, es lgico que stos se
asignen a clases WMI que contienen un objeto incrustado. Las clases administradas que contienen miembros
de tipo de referencia tambin se asignan a clases WMI con objetos incrustados, pero las futuras versiones
podran permitir que los programadores especifiquen que las referencias en tiempo de ejecucin deban estar
representadas por referencias WMI.
Las jerarquas de herencia de clases administradas estn representadas por jerarquas de herencia en WMI.
El espacio de nombres System.Management.Instrumentation no permite valores WMI predeterminados.
A los inicializadores de campo en campos de clases administradas no se les asignan valores predeterminados
WMI.
WMI no distingue entre campos y propiedades.
En una definicin de clase administrada, tanto a los campos como a las propiedades se les asignan
propiedades WMI.
El espacio de nombres de una definicin de clase administrada no est relacionado con el espacio de
nombres de la definicin de clase WMI.
En otras palabras, una clase administrada podra estar definida en el espacio de nombres
MyCompany.MyApplication y la correspondiente clase de instrumental WMI podra estar definida como el
espacio de nombres WMI root\MyCompany.
WMI admite un concepto similar al de atributo, denominado calificador.
En el espacio de nombres System.Management.Instrumentation no hay asignacin entre atributos de
cdigo administrado y calificadores WMI. Hay atributos en el espacio de nombres System.
Management.Instrumentation, pero no estn representados por calificadores en la definicin de clase WMI.
Para permitir la asignacin entre los dos, el espacio de nombres System.Management.Instrumentation
define varias clases de atributos que permiten a los programadores definir la asignacin en una sintaxis
declarativa (un conocimiento consolidado), en lugar de hacerlo a travs de una nueva API. Como se ha
mencionado, el instrumental consta principalmente de dos fases: definicin de las clases en tiempo de diseo
y provisin de datos en tiempo de ejecucin. El uso de atributos es crucial en la primera fase y permite que los
metadatos de clases administradas describan completamente el esquema del instrumental. Despus, los
metadatos se usan para crear el esquema WMI que pueden ver las herramientas de administracin.

5.7.2. Cmo proporcionar datos de administracin


Puede crear clases que proporcionen datos de administracin a WMI mediante el atributo InstrumentationClassAttribute
(InstrumentationType.Instance) en la clase o, como alternativa, mediante derivacin de la clase a partir de la clase
Instance.
Con cualquiera de los mtodos de creacin se genera automticamente el esquema WMI de la clase de cdigo
administrado. Las instancias de la clase se exponen como instancias WMI con todos los valores de las propiedades
asignados.

MCT: Luis Dueas Pag. 36 de 45


Manual de Informacin General sobre WMI .NET

El espacio de nombres System.Management.Instrumentation proporciona algunas clases para exponer datos de


administracin. La definicin de clases de instrumental se realiza en tiempo de diseo (en tiempo de compilacin) y es
slo la primera mitad de la responsabilidad de una aplicacin. En tiempo de ejecucin, la aplicacin debe proporcionar
datos reales. No es necesario que los programadores de cdigo administrado aprendan nuevos mtodos para dar
formato a datos en el esquema CIM (modelo de informacin comn). Con las mismas clases administradas que definen
las clases del instrumental de WMI, para proporcionar los datos las aplicaciones administradas crean una instancia de la
clase y rellenan los campos. Los datos expuestos a travs de WMI se leern directamente desde los campos y
propiedades de la clase administrada.
En el siguiente procedimiento se muestra cmo exponer datos de administracin de una clase a travs de WMI .NET.

Para exponer datos de administracin de una clase


1. Incluya el espacio de nombres System.Management.Instrumentation y el espacio de nombres System.
Configuration.Install.
2. Utilice la clase InstrumentedAttribute para indicar que el ensamblado tiene datos instrumentados.
Esta clase tambin permite especificar el espacio de nombres en el que deben publicarse los datos.
3. Utilice la clase RunInstallerAttribute para informar al sistema de que la herramienta InstallUtil.exe se ejecutar
con el ensamblado.
4. Defina en cualquier lenguaje compatible una o varias clases administradas que describan el instrumental.
5. Marque la clase con InstrumentationClassAttribute(InstrumentationType.Instance) para indicar que los
datos de la clase deben publicarse a travs de WMI.

Ejemplo
En el ejemplo de cdigo siguiente se demuestra cmo definir una clase de instrumental de administracin y cmo
publicar una instancia de dicha clase en WMI.
using System;
using System.Management;
using System.Configuration.Install;
using System.Management.Instrumentation;

// Specify the namespace into which the data should be published


[assembly:Instrumented("root/default")]

// Let the system know that the InstallUtil.exe tool will be run against this assembly
[System.ComponentModel.RunInstaller(true)]
public class MyInstaller : DefaultManagementProjectInstaller {}

// Define a management instrumentation class


[InstrumentationClass(InstrumentationType.Instance)]
public class InstanceClass
{
public string Name;
public int Number;
}
public class Sample_InstanceProvider
{
public static int Main(string[] args) {
InstanceClass instClass = new InstanceClass();
instClass. Name = "Hello";
instClass. Number = 888;
// Publish this instance to WMI
Instrumentation.Publish(instClass);
Console.WriteLine("Instance now visible through WMI");
Console.ReadLine();
Instrumentation.Revoke(instClass); //optional
return 0;
}
}

5.7.2.1. Herencia para clases derivadas de Instance


La creacin de jerarquas de instancias se parece mucho a la creacin de jerarquas de eventos. La principal diferencia es
que los eventos WMI de nivel superior se derivan de la clase WMI __ExtrinsicEvent, mientras que las instancias de nivel
superior no tienen clase primaria (o superclase, segn la terminologa de WMI). Al generar instrumental de instancias

MCT: Luis Dueas Pag. 37 de 45


Manual de Informacin General sobre WMI .NET

sencilla mediante la tcnica de derivar una sola clase de la clase auxiliar de Instance en el espacio de
nombres System.Management.Instrumentation, la clase WMI aparece como una sola clase de instancia de nivel superior.
Las jerarquas de instancias, sin embargo, son algo ms complejas. En la versin actual de System.Management, slo los
nodos hoja de una jerarqua de instancias pueden permitir en realidad la publicacin de instancias. Los nodos que no
son hoja se consideran clases WMI abstractas. En otras palabras, si tiene dos clases, BaseInstance y una clase
derivada DerivedInstance, puede crear instancias de la clase DerivedInstance pero no de la clase BaseInstance. Otro
trmino utilizado con frecuencia para describir clases que pueden admitir instancias es clase concreta. Por lo tanto, la
regla de herencia para el instrumental de instancias podra expresarse de la siguiente manera: slo los nodos hoja de
una jerarqua de herencias pueden ser clases concretas de instancia. El resto de los nodos de la jerarqua deben
marcarse como clases WMI abstractas.
Para marcar una clase como clase de instrumental WMI abstracta, debe tener el atributo [InstrumentationClassAttribute
(InstrumentationType.Abstract)]. La clase auxiliar Instance se marca con [InstrumentationClassAttribute
(InstrumentationType.Instance)], que se propaga a clases secundarias de manera predeterminada. Esto no constituye
un problema cuando se tiene una clase de instancia concreta de nivel superior pero, con una jerarqua ms compleja,
tiene que agregar manualmente el atributo Abstract a la clase de nivel superior.
En el siguiente ejemplo de cdigo se muestra una jerarqua que agrega manualmente el atributo Abstract a la clase de
nivel superior. La clase de nivel superior,TopInstance, se deriva de la clase Instance y se marca explcitamente
con Abstract. Las clases derivadas que no son nodos hoja heredarn correctamente este atributo (y sern clases WMI
abstractas como TopInstance). Los nodos hoja deben marcarse como instancias concretas y, por lo tanto, tendrn
atributos Instanceexplcitos en sus definiciones de clase.
using System;
using System.Management.Instrumentation;

[assembly:Instrumented]
// A simple tree of instances derived from Instance
// TopInstance--Branch1Instance--Leaf1AInstance
// \ \-Leaf1BInstance
// \
// Branch2Instance--Leaf2AInstance
// Only the leafs of the tree can be concrete instances.
// All other nodes on the tree must be abstract.
// This is a top-level abstract class. It must have the
// 'InstrumentationType.Abstract' attribute or it would
// inherit the 'Instance' attribute
// from the base class 'Instance'
[InstrumentationClass(InstrumentationType.Abstract)]
public class TopInstance : Instance
{
}

// This class inherits the 'InstrumentationType.Abstract' attribute


public class Branch1Instance : TopInstance
{
}

// This is a leaf class which can be concrete


[InstrumentationClass(InstrumentationType.Instance)]
public class Leaf1AInstance : Branch1Instance
{
}

// This is a leaf class which can be concrete


[InstrumentationClass(InstrumentationType.Instance)]
public class Leaf1BInstance : Branch1Instance
{
}

// This class inherits the 'InstrumentationType.Abstract' attribute


public class Branch2Instance : TopInstance
{
}

// This is a leaf class which can be concrete


[InstrumentationClass(InstrumentationType.Instance)]
public class Leaf2AInstance : Branch2Instance

MCT: Luis Dueas Pag. 38 de 45


Manual de Informacin General sobre WMI .NET

{
}

class App {
static void Main(string[] args)
{
// Publish an instance of each leaf
Leaf1AInstance leaf1a = new Leaf1AInstance();
Leaf1BInstance leaf1b = new Leaf1BInstance();
Leaf2AInstance leaf2a = new Leaf2AInstance();
leaf1a.Published = true;
leaf1b.Published = true;
leaf2a.Published = true;
// Instances now visible through WMI
Console.WriteLine("Instances now visible through WMI");
Console.ReadLine();
// Revoke all instances
leaf1a.Published = false;
leaf1b.Published = false;
leaf2a.Published = false;
}
}

5.7.2.2. Herencia para clases no derivadas de Instance


Si slo utiliza atributos para declarar clases de instrumental de instancia, las jerarquas se definen igual que el mtodo
utilizado para las clases de instrumental derivadas de la clase auxiliar Instance.
De nuevo, la clase de instrumental de instancia de nivel superior se debe marcar con [InstrumentationClass
(InstrumentationType.Abstract)], a menos que slo haya una clase de instancia concreta de nivel superior. Las ramas
de la jerarqua heredarn este atributo, as que no tienen que declarar explcitamente su propia
clase InstrumentationClassAttribute. En este caso, los nodos hoja tambin se deben marcar explcitamente como clases
de instancia WMI concretas y necesitarn el atributo [InstrumentationClassAttribute (InstrumentationType.
Instance)].
En el siguiente ejemplo de cdigo se muestra la misma funcionalidad que en el ejemplo de Herencia para clases
derivadas de Instance, pero slo se utiliza la claseInstrumentationClassAttribute en lugar de derivar la clase de nivel
superior de la clase auxiliar Instance.
using System;
using System.Management.Instrumentation;

[assembly:Instrumented]
// A simple tree of instances declared with attributes
// TopInstance2--Branch1Instance2--Leaf1AInstance2
// \ \-Leaf1BInstance2
// \
// Branch2Instance2--Leaf2AInstance2
// Only the leafs of the tree can be concrete instances.
// All other nodes on the tree must be abstract.
// This is a top level abstract class.
[InstrumentationClass(InstrumentationType.Abstract)]
public class TopInstance2 {
}

// This class inherits the 'InstrumentationType.Abstract' attribute


public class Branch1Instance2 : TopInstance2{
}

// This is a leaf class which can be concrete


[InstrumentationClass(InstrumentationType.Instance)]
public class Leaf1AInstance2 : Branch1Instance2 {
}

// This is a leaf class which can be concrete


[InstrumentationClass(InstrumentationType.Instance)]
public class Leaf1BInstance2 : Branch1Instance2 {
}

MCT: Luis Dueas Pag. 39 de 45


Manual de Informacin General sobre WMI .NET

// This class inherits the 'InstrumentationType.Abstract' attribute


public class Branch2Instance2 : TopInstance2 {
}

// This is a leaf class which can be concrete


[InstrumentationClass(InstrumentationType.Instance)]
public class Leaf2AInstance2 : Branch2Instance2 {
}

class App {
static void Main(string[] args) {
// Publish an instance of each leaf
Leaf1AInstance2 leaf1a = new Leaf1AInstance2();
Leaf1BInstance2 leaf1b = new Leaf1BInstance2();
Leaf2AInstance2 leaf2a = new Leaf2AInstance2();
Instrumentation.Publish(leaf1a);
Instrumentation.Publish(leaf1b);
Instrumentation.Publish(leaf2a);
// Instances now visible through WMI
Console.WriteLine("Instances now visible through WMI");
Console.ReadLine();
// Revoke all instances
Instrumentation.Revoke(leaf1a);
Instrumentation.Revoke(leaf1b);
Instrumentation.Revoke(leaf2a);
}
}

5.7.3. Cmo publicar en WMI el esquema de una aplicacin


instrumentada
Una aplicacin instrumentada debe pasar por una fase de registro, en la que su esquema se puede descubrir y registrar
en el repositorio WMI. Se requiere una publicacin de esquema para cada ensamblado. Todo ensamblado que declare
tipos de instrumental (eventos o instancias) debe publicar su esquema en WMI. Para ello se utilizan los mecanismos del
instalador estndar de .NET Framework.
Independientemente de la opcin que elija para llamar al registro del esquema, dicho registro slo ser correcto si el
usuario que realiza la llamada es miembro del grupo de administradores locales. Normalmente, ste es el caso cuando
se instala una aplicacin, pero tenga en cuenta que si no desea requerir un paso de instalacin para la aplicacin, es
necesario que un administrador local la ejecute como mnimo una vez para que el esquema de administracin se
registre y la aplicacin pueda proporcionar datos y eventos de administracin.
Por comodidad para los programadores en el momento del diseo, el esquema se publica automticamente la primera
vez que una aplicacin genera un evento o publica una instancia. De esta manera se evita tener que declarar un
instalador de proyecto y ejecutar la herramienta InstallUtil.exe durante la rpida creacin de un prototipo de la
aplicacin. Tambin en este caso, la publicacin automtica del esquema slo se produce si la persona que ejecuta la
aplicacin es un miembro del grupo de administradores locales. Es importante resaltar que no se debera confiar en este
comportamiento cuando la aplicacin ya est preparada para ser implementada. El esquema de un ensamblado
instrumentado debera publicarse en WMI en el momento de la instalacin mediante uno de los mecanismos descritos
anteriormente que usan un instalador.
El esquema de clases de evento (o de instancia) reside en el ensamblado y se registra en el repositorio de WMI durante
la instalacin.
No obstante, hay casos en los que las aplicaciones cliente no se pueden volver a compilar. Hay dos escenarios en los
que se trata esta situacin, y ambos corresponden a esquemas de eventos.
En el primer escenario, no se ha modificado el esquema de clases de evento. La accin recomendada consiste en lo
siguiente: en el momento de volver a compilar y reinstalar, asegrese de que tanto la versin principal del ensamblado
que contiene la definicin de la clase como la secundaria tienen los valores originales.
En el segundo escenario, se ha modficado el esquema de eventos. Ms concretamente, el esquema de clases de eventos
se ha modificado al agregar propiedades o mtodos; no se ha quitado ninguna de las propiedades o mtodos definidos
anteriormente. En este caso, se recomienda encarecidamente mover el instrumental de la aplicacin a otro espacio de
nombres WMI.
Si el esquema registrado actualmente resulta daado por cualquier motivo, podra haber casos en los que al volver a
ejecutar InstallUtil.exe no se detecte la necesidad de volver a registrar el esquema original. En este caso, es posible
obligar al instalador a volver a instalar el esquema mediante la utilizacin del modificador /f o /force:
installutil.exe /F <nombre_del_ensamblado>

MCT: Luis Dueas Pag. 40 de 45


Manual de Informacin General sobre WMI .NET

Los instaladores admiten generalmente un modificador de desinstalacin que se utiliza normalmente de la forma
siguiente:
installutil.exe /U <nombre_del_ensamblado>
donde <nombre_del_ensamblado> es el ensamblado que contiene la definicin del esquema registrado anteriormente.
Sin embargo, en esta versin, la clase ManagementInstaller no realiza ninguna operacin en el proceso de
desinstalacin; ms concretamente, no elimina el registro del esquema. El motivo es que el mismo esquema puede ser
utilizado por ms de un proveedor WMI, y no se est aplicando ningn mecanismo que identifique si un esquema
concreto no est siendo utilizado por otra entidad y se puede quitar de forma segura.

Para publicar un esquema en WMI


1. Defina un instalador para el proyecto.
o Si el proyecto no necesita un instalador para ningn otro fin, utilice la clase auxiliar predeterminada
de instalador de administracin proporcionada en el espacio de nombres System.Management.
Instrumentation y dervela en el cdigo:
// Let the system know that the InstallUtil.exe
// tool will be run against this assembly
[System.ComponentModel.RunInstaller(true)]
public class MyInstaller :
DefaultManagementProjectInstaller
{
MyInstaller()
{
ManagementInstaller managementInstaller =
new ManagementInstaller();
Installers.Add(managementInstaller);
}
}
De esta manera, el sistema puede saber que la aplicacin tiene un paso de instalacin y que usted desea ejecutarlo.
Si hay otros pasos de instalacin que deben seguirse y ya existe un instalador definido para el proyecto,
utilice la clase ManagementInstaller que se proporciona en el espacio de nombres System.
Management.Instrumentation.
Por ejemplo, agregara el siguiente cdigo al constructor del instalador del proyecto:
ManagementInstaller managementInstaller = new ManagementInstaller();
Installers.Add(managementInstaller);
2. Invoque el paso de instalacin.
Si coloca su aplicacin en un paquete de instalacin de MSI, asegrese de que la opcin de ejecutar
instaladores de .NET est activada y de que el programa de instalacin de MSI los ejecutar.
Ejecute la herramienta installutil.exe disponible en .NET Framework SDK en el ensamblado
instrumentado.
c:> installutil <nombre_del_ensamblado>
string[] installArgs = new String[] {
"//logfile=", "//LogToConsole=false", "//ShowCallStack",
typeof(MyApp).Assembly.Location,
};
System.Configuration.Install.
ManagedInstallerClass.InstallHelper(installArgs);
Tenga en cuenta que, con esta opcin, el esquema de administracin de esta aplicacin slo estar
disponible para los consumidores despus de que se ejecute la aplicacin por primera vez, no cuando se
instala.

5.7.4. Proporcionar eventos de administracin


Pueden darse ciertas condiciones en la aplicacin ante las cuales resulte conveniente provocar un evento de
administracin para notificar a los consumidores un suceso en la aplicacin, como una condicin de error o un cambio
de estado.

Exponer eventos de administracin


El espacio de nombres System.Management.Instrumentation proporciona algunas clases para exponer eventos de
administracin. Puede proporcionar eventos de administracin de dos formas:
Marque la clase con el atributo InstrumentationClassAttribute(InstrumentationType.Event) con el fin de
identificarla como evento de administracin.
Derive la clase a partir de la clase BaseEvent para identificarla como evento de administracin en lugar de
utilizar un atributo.

MCT: Luis Dueas Pag. 41 de 45


Manual de Informacin General sobre WMI .NET

Este mtodo ofrece un mayor rendimiento.


Para generar un evento, cree una instancia de la clase de eventos, rellene los valores de las propiedades y utilice el
mtodo auxiliar System.Management.Instrumentation.Instrumentation.Fire(System.Object) o el mtodo System.
Management.Instrumentation.BaseEvent.Fire (segn el mtodo que eligi al declarar el evento).

Herencia de eventos
Si deriva ms clases de su propia clase, se reflejarn en un rbol de herencia de eventos WMI.
Con cdigo administrado se puede generar cualquier evento de la jerarqua de clases de evento administradas. De este
modo, las aplicaciones cliente pueden suscribirse a una amplia gama de eventos similares o a un slo evento
especializado. Por ejemplo, si tiene dos clases de eventos, MyBaseEvent y una clase derivada MyDerivedEvent, la
consulta WQL SELECT * FROM MyBaseEvent permitir que una aplicacin cliente detecte ambos
eventos, MyBaseEvent yMyDerivedEvent, generados desde su aplicacin. Por otro lado, un cliente que emita la
consulta WQL SELECT * FROM MyDerivedEvent no vera nada cuando su aplicacin generara MyBaseEvent, pero
obtendra eventos cuando la aplicacin generara MyDerivedEvent.

5.7.4.1. Cmo crear una clase de evento mediante la derivacin


de BaseEvent
Derive una clase a partir de la clase BaseEvent para identificarla como evento de administracin en lugar de utilizar un
atributo. Este mtodo tambin ofrece un mayor rendimiento que marcar la clase con InstrumentationClassAttribute
(InstrumentationType.Event). Para provocar un evento, cree una instancia de la clase de eventos, rellene las
propiedades con valores y llame al mtodo System.Management.Instrumentation.BaseEvent.Fire.

Ejemplo
En el ejemplo de cdigo siguiente se demuestra cmo crear una clase de eventos de administracin mediante la
derivacin de la clase BaseEvent y cmo generar el evento de administracin con cdigo administrado.
using System;
using System.Management;
using System.Configuration.Install;
using System.Management.Instrumentation;

// This example demonstrates how to create a management event class by deriving


// from the BaseEvent class and to raise a management event from managed code.
// Specify which namespace the management event class is created in
[assembly:Instrumented("Root/Default")]
// Let the system know you will run InstallUtil.exe tool against this assembly
[System.ComponentModel.RunInstaller(true)]
public class MyInstaller : DefaultManagementProjectInstaller {}

namespace WMISample
{
// Create a management instrumentation event class
public class MyEvent : System.Management.Instrumentation.BaseEvent
{
private string EventName;
public void setEventName(string name)
{
EventName = name;
}
}

public class SampleEventProvider


{
public static int Main(string[] args)
{
MyEvent e = new MyEvent();
e.setEventName("Hello");
// Raise a management event
Instrumentation.Fire(e);
return 0;
}
}
}

MCT: Luis Dueas Pag. 42 de 45


Manual de Informacin General sobre WMI .NET

5.7.4.1.1. Herencia de eventos para clases derivadas de


BaseEvent
Cuando los programadores desean exponer eventos de aplicaciones a travs de WMI, deben derivar los eventos de
la clase del sistema __ExtrinsicEvent de WMI. De manera predeterminada, al derivar una clase de la clase BaseEvent en
el espacio de nombres System.Management.Instrumentation, su clase administrada representar a una clase WMI
derivada de __ExtrinsicEvent.
En el ejemplo de cdigo siguiente se muestra cmo usar la herencia para crear una jerarqua de eventos WMI sencilla
mediante la clase auxiliar BaseEvent. La clase de evento administrada de alto nivel, TopEvent, est representada por
una clase WMI, TopEvent, derivada de __ExtrinsicEvent. La clase TopEvent tendr dos clases secundarias:
Branch1Event y Branch2Event. Por ltimo, habr dos clases secundarias de Branch1Event (Leaf1AEvent y
Leaf1BEvent), y una secundaria deBranch2Event (Leaf2AEvent).
Para ver esta jerarqua de eventos, puede examinar el diagrama del primer bloque de comentarios del ejemplo. Las
clases ms derivadas de una jerarqua (aqullas que no tienen ninguna clase derivada) se denominan nodos hoja. Los
nodos hoja no son especialmente importantes para las jerarquas de eventos, pero la distincin entre los nodos de hoja
y los dems es importante para el instrumental de instancias. Para que resulte ms simple, los eventos no tienen
propiedades. En la prctica, lo ms probable es que extienda cada clase secundaria con propiedades adicionales, pero
en el siguiente cdigo se han omitido para acortarlo.
using System;
using System.Management.Instrumentation;
[assembly:Instrumented]
// A simple tree of events derived from BaseEvent
// TopEvent--Branch1Event--Leaf1AEvent
// \ \-Leaf1BEvent
// \
// Branch2Event--Leaf2AEvent
// Any event in the hierarchy can be raised by the application
// This class inherits the 'InstrumentationType.Event' attribute
// from 'BaseEvent'
public class TopEvent : BaseEvent {
}

// This class inherits the 'InstrumentationType.Event' attribute


public class Branch1Event : TopEvent{
}

// This class inherits the 'InstrumentationType.Event' attribute


public class Leaf1AEvent : Branch1Event {
}

// This class inherits the 'InstrumentationType.Event' attribute


public class Leaf1BEvent : Branch1Event {
}

// This class inherits the 'InstrumentationType.Event' attribute


public class Branch2Event : TopEvent {
}

// This class inherits the 'InstrumentationType.Event' attribute


public class Leaf2AEvent : Branch2Event {
}

class App {
static void Main(string[] args) {
// Raise each type of event
new TopEvent().Fire();
new Branch1Event().Fire();
new Leaf1AEvent().Fire();
new Leaf1BEvent().Fire();
new Branch2Event().Fire();
new Leaf2AEvent().Fire();
}
}

MCT: Luis Dueas Pag. 43 de 45


Manual de Informacin General sobre WMI .NET

5.7.4.2. Cmo crear una clase de eventos con el atributo


InstrumentationClass
Marque una clase con el atributo InstrumentationClass(InstrumentationType.Event) con el fin de identificarla como
evento de administracin. Para provocar un evento, cree una instancia de la clase de eventos, rellene las propiedades
con valores y utilice el mtodo auxiliar System.Management.Instrumentation.Instrumentation.Fire(System.Object).

Ejemplo
En el siguiente ejemplo de cdigo se muestra cmo crear una clase de eventos de administracin mediante el
atributo InstrumentationClass y cmo generar un evento de administracin con cdigo administrado.

using System;
using System.Management;
using System.Configuration.Install;
using System.Management.Instrumentation;
// This example demonstrates how to create a management event class by using
// the InstrumentationClass attribute and to raise a management event from
// managed code.
// Specify which namespace the management event class is created in
[assembly:Instrumented("Root/Default")]
namespace WMISample
{
// Let the system know you will run InstallUtil.exe tool against this assembly
[System.ComponentModel.RunInstaller(true)]
public class MyInstaller : DefaultManagementProjectInstaller {}

// Create a management instrumentation event class


[InstrumentationClass(InstrumentationType.Event)]
public class MyEvent
{
private string EventName;
public void setEventName(string name)
{
EventName = name;
}
}

public class WMIInstrumentedEventExample


{
public static void Main()
{
MyEvent e = new MyEvent();
e.setEventName("Hello");
// Raise a management event
Instrumentation.Fire(e);
return;
}
}
}

5.7.4.2.1. Herencia de eventos para clases no derivadas de


BaseEvent
Como alternativa a la opcin de derivar las clases de eventos superiores a partir de la clase auxiliar BaseEvent en el
espacio de nombres System.Management.Instrumentation, los programadores pueden marcar una clase con el atributo,
[InstrumentationClassAttribute (InstrumentationType.Event)].
Esta accin slo debe realizarse en la clase de evento de nivel superior. Las clases derivadas de una clase con este
atributo tambin se interpretarn como clases de evento instrumentadas. Las clases derivadas heredan
automticamente el atributo InstrumentationClassAttribute.
En el siguiente ejemplo de cdigo se realizan las mismas tareas que en el ejemplo de Herencia de eventos para clases
derivadas de BaseEvent, pero se utiliza el atributo InstrumentationClassAttribute en lugar de la derivacin de la
clase BaseEvent.

MCT: Luis Dueas Pag. 44 de 45


Manual de Informacin General sobre WMI .NET

using System;
using System.Management.Instrumentation;
[assembly:Instrumented]
// A simple tree of events declared with attributes
// TopEvent2--Branch1Event2--Leaf1AEvent2
// \ \-Leaf1BEvent2
// \
// Branch2Event2--Leaf2AEvent2
// Any event in the hierarchy can be raised by the application
// This is a top-level event class
[InstrumentationClass(InstrumentationType.Event)]
public class TopEvent2 {
}

// This class inherits the 'InstrumentationType.Event' attribute


public class Branch1Event2 : TopEvent2{
}

// This class inherits the 'InstrumentationType.Event' attribute


public class Leaf1AEvent2 : Branch1Event2 {
}

// This class inherits the 'InstrumentationType.Event' attribute


public class Leaf1BEvent2 : Branch1Event2 {
}

// This class inherits the 'InstrumentationType.Event' attribute


public class Branch2Event2 : TopEvent2 {
}

// This class inherits the 'InstrumentationType.Event' attribute


public class Leaf2AEvent2 : Branch2Event2 {
}

class App {
static void Main(string[] args) {
// Raise each type of event
Instrumentation.Fire(new TopEvent2());
Instrumentation.Fire(new Branch1Event2());
Instrumentation.Fire(new Leaf1AEvent2());
Instrumentation.Fire(new Leaf1BEvent2());
Instrumentation.Fire(new Branch2Event2());
Instrumentation.Fire(new Leaf2AEvent2());
}
}

MCT: Luis Dueas Pag. 45 de 45

Potrebbero piacerti anche