Compartir a través de


Ejecución de un programa desde la línea de comandos en función de un evento

La clase CommandLineEventConsumer ejecuta un programa ejecutable especificado desde una línea de comandos cuando se produce un evento especificado. Esta clase es un consumidor de eventos estándar que proporciona WMI.

Al usar CommandLineEventConsumer, debe proteger el ejecutable que quiera iniciar. Si el ejecutable no está en una ubicación segura o no está protegido con una lista de control de acceso (ACL) segura, un usuario sin privilegios de acceso puede reemplazar el ejecutable por otro. Puede usar las clases Win32_LogicalFileSecuritySetting o Win32_LogicalShareSecuritySetting para cambiar la seguridad de un archivo o recurso compartido mediante programación. Para más información, vea Creación de un descriptor de seguridad para un nuevo objeto en C++.

El procedimiento básico para usar consumidores estándar siempre es el mismo y se encuentra en Supervisión y respuesta a eventos con consumidores estándar. El siguiente procedimiento agrega al procedimiento básico, es específico de la clase CommandLineEventConsumer y describe cómo crear un consumidor de eventos que ejecuta un programa.

Precaución

La clase CommandLineEventConsumer tiene restricciones de seguridad especiales. Este consumidor estándar lo debe configurar un miembro local del grupo Administradores en el equipo local. Si usa una cuenta de dominio para crear la suscripción, la cuenta LocalSystem debe tener los permisos necesarios en el dominio para comprobar que el creador es miembro del grupo Administradores local.

CommandLineEventConsumer no se puede usar para iniciar un proceso que se ejecute de forma interactiva.

 

En el procedimiento siguiente se describe cómo crear un consumidor de eventos que ejecute un proceso desde una línea de comandos.

Para crear un consumidor de eventos que ejecute un proceso desde una línea de comandos

  1. En el archivo Managed Object Format (MOF), cree una instancia de CommandLineEventConsumer para recibir los eventos que solicita en la consulta. Para más información, vea Diseño de clases de formato de Managed Object Format (MOF).
  2. Cree una instancia de __EventFilter y asígnele un nombre.
  3. Cree una consulta para especificar el tipo de evento. Para más información, vea Consulta con WQL.
  4. Cree una instancia de __FilterToConsumerBinding para asociar el filtro a la instancia de CommandLineEventConsumer.
  5. Compile el archivo MOF mediante Mofcomp.exe.

Ejemplo

En el ejemplo de código siguiente se crea una clase denominada "MyCmdLineConsumer" para generar eventos cuando se crea una instancia de la nueva clase al final de un archivo MOF. El ejemplo está en código MOF, pero puede crear las instancias mediante programación con la API de scripting para WMI o la API COM para WMI.

En el procedimiento siguiente se describe cómo crear una clase denominada MyCmdLineConsumer.

Para crear una clase denominada MyCmdLineConsumer

  1. Cree el archivo c:\cmdline_test.bat con un comando que ejecute un programa visible, como "calc.exe".
  2. Copie el código MOF en un archivo de texto y guárdelo con una extensión .mof.
  3. En una ventana Comandos, compile el archivo MOF con el siguiente comando: Nombre_de_archivoMofcomp.mof.

Nota

Se debería ejecutar el programa especificado en cmdline_test.bat.

 

// Set the namespace as root\subscription.
// The CommandLineEventConsumer is already compiled
// in the root\subscription namespace. 
#pragma namespace ("\\\\.\\Root\\subscription")

class MyCmdLineConsumer
{
 [key]string Name;
};

// Create an instance of the command line consumer
// and give it the alias $CMDLINECONSUMER

instance of CommandLineEventConsumer as $CMDLINECONSUMER
{
 Name = "CmdLineConsumer_Example";
 CommandLineTemplate = "c:\\cmdline_test.bat";
 RunInteractively = True;
 WorkingDirectory = "c:\\";
};    

// Create an instance of the event filter
// and give it the alias $CMDLINEFILTER
// The filter queries for instance creation event
// for instances of the MyCmdLineConsumer class

instance of __EventFilter as $CMDLINEFILTER
{
    Name = "CmdLineFilter";
    Query = "SELECT * FROM __InstanceCreationEvent"
        " WHERE TargetInstance.__class = \"MyCmdLineConsumer\"";
    QueryLanguage = "WQL";
};

// Create an instance of the binding
// between filter and consumer instances.

instance of __FilterToConsumerBinding
{
     Consumer = $CMDLINECONSUMER;
     Filter = $CMDLINEFILTER;
};

// Create an instance of this class right now. 
// The commands in c:\\cmdline_test.bat execute
// as the result of creating the instance
// of MyCmdLineConsumer.
 
instance of MyCmdLineConsumer
{
     Name = "CmdLineEventConsumer test";
};

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