Compartir a través de


Supervisión y respuesta a eventos con consumidores estándar

Puede usar las clases de consumidor estándar instaladas para realizar acciones basadas en eventos en un sistema operativo. Los consumidores estándar son clases simples que ya están registradas y definen clases de consumidor permanentes. Cada consumidor estándar realiza una acción específica después de recibir una notificación de eventos. Por ejemplo, puede definir una instancia de ActiveScriptEventConsumer para ejecutar un script cuando el espacio libre en disco de un equipo es diferente del tamaño especificado.

WMI compila los consumidores estándar en espacios de nombres predeterminados que dependen del sistema operativo, por ejemplo:

  • En Windows Server 2003, todos los consumidores estándar se compilan de forma predeterminada en el espacio de nombres "Root\Subscription".

Nota

Para obtener los espacios de nombres predeterminados y los sistemas operativos específicos de cada clase WMI, vea las secciones Comentarios y requisitos de cada clase.

 

En la tabla siguiente se enumeran y describen los consumidores estándar de WMI.

Consumidor estándar Descripción
ActiveScriptEventConsumer Ejecuta un script cuando recibe una notificación de eventos. Para más información, vea Ejecución de un script en función de un evento.
LogFileEventConsumer Escribe cadenas personalizadas en un archivo de registro de texto cuando recibe una notificación de eventos. Para más información, vea Escritura en un archivo de registro en función de un evento.
NTEventLogEventConsumer Registra un mensaje específico en el registro de eventos de la aplicación. Para más información, vea Registro en el registro de eventos de NT en función de un evento.
SMTPEventConsumer Envía un mensaje de correo electrónico mediante SMTP cada vez que se entrega un evento. Para más información, vea Envío de correo electrónico en función de un evento.
CommandLineEventConsumer Inicia un proceso cuando se entrega un evento a un sistema local. El archivo ejecutable debe estar en una ubicación segura o estar protegido con una lista de control de acceso (ACL) segura para evitar que un usuario no autorizado reemplace el ejecutable por otro. Para más información, vea Ejecución de un programa desde la línea de comandos en función de un evento.

 

En el procedimiento siguiente se describe cómo supervisar y responder a eventos mediante un consumidor estándar. Tenga en cuenta que el procedimiento es el mismo para un archivo Managed Object Format (MOF), script o aplicación.

Para supervisar y responder a eventos con un consumidor estándar

  1. Especifique el espacio de nombres en un archivo MOF mediante el comando de preprocesador MOF #pragma namespace. En un script o aplicación, especifique el espacio de nombres en el código que se conecta a WMI.

    En el siguiente ejemplo de código de MOF se muestra cómo especificar el espacio de nombres root\subscription.

    #pragma namespace ("\\\\.\\root\\subscription")
    

    La mayoría de los eventos intrínsecos están asociados a cambios en las instancias de clase del espacio de nombres root\cimv2. Pero, el proveedor del Registro del sistema desencadena eventos como RegistryKeyChangeEvent en el espacio de nombres root\default.

    Un consumidor puede incluir clases de eventos ubicadas en otros espacios de nombres si especifica el espacio de nombres en la propiedad EventNamespace en la consulta para eventos __EventFilter. Las clases de eventos intrínsecos, como __InstanceOperationEvent, están disponibles en todos los espacios de nombres.

  2. Cree y rellene una instancia de una clase de consumidor estándar.

    Esta instancia puede tener un valor único en la propiedad Name. Puede actualizar un consumidor existente si reutiliza el mismo nombre.

    InsertStringTemplates contiene el texto que se va a insertar en un evento que especifique en EventType. Puede usar cadenas literales o hacer referencia directamente a una propiedad. Para más información, vea Uso de plantillas de cadena estándar e Instrucción SELECT para consultas de eventos.

    Use un origen existente para el registro de eventos que admita una cadena de inserción sin texto asociado.

    En el siguiente ejemplo de código MOF se muestra cómo usar un origen existente de WSH y un valor eventID de 8.

    instance of NTEventLogEventConsumer as $Consumer
    {
        Name = "RunKeyEventlogConsumer";
        SourceName = "WSH";               
        EventID = 8;
        // Warning                              
        EventType = 2;
        // One string supplies the entire message          
        NumberOfInsertionStrings = 1;             
        // the %Hive% and %KeyPath% are properties of
        // the RegistryKeyChangeEvent instance 
        InsertionStringTemplates = 
            {"The key %Hive%\\%RootPath% has been modified."
            "Check if the change is intentional"};
    };
    
  3. Cree una instancia de __EventFilter y defina una consulta para eventos.

    En el ejemplo siguiente, el filtro supervisa la clave del Registro donde se registran los programas de inicio. La supervisión de esta clave del Registro puede ser importante porque un programa no autorizado puede registrarse bajo la clave, lo que hace que se inicie cuando el equipo arranque.

    instance of __EventFilter as $Filter
    {
    Name = "RunKeyFilter";
    QueryLanguage = "WQL"; 
    Query = "Select * from RegistryTreeChangeEvent"
        " where (Hive = \"HKEY_LOCAL_MACHINE\" and "
        "RootPath = \"Software\\\\Microsoft\\\\Windows"
        "\\\\CurrentVersion\\\\Run\")";
    
    // RegistryTreeChangeEvents only fire in root\default namespace
    EventNamespace = "root\\default";                       
    };
    
  4. Identifique un evento para supervisar y crear una consulta de eventos.

    Puede comprobar si hay un evento intrínseco o extrínseco. Por ejemplo, use la clase RegistryTreeChangeEvent del proveedor del Registro para supervisar los cambios en el Registro del sistema.

    Si no existe una clase que describa un evento que necesita supervisar, debe crear un proveedor de eventos propio y definir nuevas clases de eventos extrínsecos. Para más información, vea Escritura de un proveedor de eventos.

    En un archivo MOF, puede definir un alias para el filtro y el consumidor, lo que proporciona una manera sencilla de describir las rutas de acceso de instancia.

    En el ejemplo siguiente se muestra cómo definir un alias para el filtro y el consumidor.

    instance of __EventFilter as $FILTER
    instance of LogFileEventConsumer as $CONSUMER
    
  5. Cree una instancia de __FilterToConsumerBinding para asociar el filtro y las clases de consumidor. Esta instancia determina que cuando se produce un evento que coincide con el filtro especificado, se debe producir la acción especificada por el consumidor. __EventFilter, __EventConsumer y __FilterToConsumerBinding deben tener el mismo Id. de seguridad (SID) individual en la propiedad CreatorSID. Para más información, vea Enlace de un filtro de eventos con un consumidor lógico.

    En el ejemplo siguiente se muestra cómo identificar una instancia por la ruta de acceso del objeto, o bien usar un alias como expresión abreviada para la ruta de acceso al objeto.

    instance of __EventFilter as $FILTER
    instance of NTEventLogEventConsumer as $CONSUMER
    

    En el ejemplo siguiente se enlaza el filtro al consumidor mediante alias.

    instance of __FilterToConsumerBinding
    {
        Filter = $FILTER;
        Consumer = $CONSUMER;
    
    };
    

    Puede enlazar un filtro a varios consumidores, lo que indica que cuando se producen eventos coincidentes, se deben realizar varias acciones; o bien puede enlazar un consumidor a varios filtros, lo que indica que la acción se debe realizar cuando se produzcan eventos que coincidan con uno de los filtros.

    Las siguientes acciones se realizan en función de la condición de los consumidores y eventos:

    • Si se produce un error permanente en uno de los consumidores, otros consumidores que solicitan la notificación reciben el evento.
    • Si se quita un evento, WMI desencadena __EventDroppedEvent.
    • Si se suscribe a este evento, devuelve el evento que se quita y una referencia a la instancia de __EventConsumer representa al consumidor con errores.
    • Si se produce un error en un consumidor, WMI desencadena __ConsumerFailureEvent, que puede contener más información en las propiedades ErrorCode, ErrorDescription y ErrorObject.

    Para más información, vea Enlace de un filtro de eventos con un consumidor lógico.

Ejemplo

En el ejemplo siguiente se muestra el código MOF para una instancia de NTEventLogEventConsumer. Después de compilar este código MOF, cualquier intento de crear, eliminar o modificar un valor en la ruta de acceso del Registro HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows\CurrentVersion\Run registra una entrada en el registro de eventos de aplicaciones, en el origen "WSH".

#pragma namespace ("\\\\.\\root\\subscription")
 
instance of __EventFilter as $Filter
{
    Name = "RunKeyFilter";
    QueryLanguage = "WQL";
    Query = "Select * from RegistryTreeChangeEvent"
            " where (Hive = \"HKEY_LOCAL_MACHINE\" and "
            "KeyPath = \"Software\\\\Microsoft\\\\Windows"
            "\\\\CurrentVersion\\\\Run\")";

    // RegistryTreeChangeEvents only fire
    // in root\default namespace
    EventNamespace = "root\\default";   
};
 
instance of NTEventLogEventConsumer as $Consumer
{
    Name = "RunKeyEventlogConsumer";
    SourceName = "WSH";               
    EventID = 8;
    EventType = 2;                            // Warning
    Category = 0;
    NumberOfInsertionStrings = 1;

    // the %Hive% and %KeyPath% are properties
    // of the RegistryKeyChangeEvent instance 
    InsertionStringTemplates = {"The key %Hive%\\%RootPath% "
        "has been modified. Check if the change is intentional"};
};
 

// Bind the filter to the consumer
instance of __FilterToConsumerBinding
{
    Filter = $Filter;
    Consumer = $Consumer;
};

Recepción de eventos de forma segura