Executar um programa com a linha de comando com base em um evento

A classe CommandLineEventConsumer executa um programa executável especificado usando uma linha de comando quando ocorre um evento especificado. Essa classe é um consumidor de evento padrão que o WMI fornece.

Ao usar CommandLineEventConsumer, você deve proteger o executável que deseja iniciar. Se o executável não estiver em um local seguro ou não estiver protegido por uma ACL (lista de controle de acesso) forte, um usuário sem privilégios de acesso poderá substituir o executável por outro. Você pode usar as classes Win32_LogicalFileSecuritySetting ou Win32_LogicalShareSecuritySetting para alterar programaticamente a segurança de um arquivo ou um compartilhamento. Para obter mais informações, confira Criar um descritor de segurança para um novo objeto em C++.

O procedimento básico para usar consumidores padrão é sempre o mesmo e está localizado em Monitoramento e resposta a eventos com consumidores padrão. O procedimento a seguir adiciona ao procedimento básico, é específico para a classe CommandLineEventConsumer e descreve como criar um consumidor de evento que executa um programa.

Cuidado

A classe CommandLineEventConsumer tem restrições de segurança especiais. Esse consumidor padrão deve ser configurado por um membro local do grupo Administradores no computador local. Se você usar uma conta de domínio para criar a assinatura, a conta LocalSystem deverá ter as permissões necessárias no domínio para verificar se o criador é membro do grupo local Administradores.

A CommandLineEventConsumer não pode ser usada para iniciar um processo que é executado interativamente.

 

O procedimento a seguir descreve como criar um consumidor de evento que executa um processo por meio de uma linha de comando.

Para criar um consumidor de evento que executa um processo por meio de uma linha de comando

  1. No arquivo MOF (Managed Object Format), crie uma instância de CommandLineEventConsumer para receber os eventos solicitados na consulta. Para obter mais informações, conira Criar classes MOF (Managed Object Format).
  2. Crie uma instância de __EventFilter e dê um nome a ela.
  3. Crie uma consulta para especificar o tipo de evento. Para obter mais informações, confira Como consultar com WQL.
  4. Crie uma instância de __FilterToConsumerBinding para associar o filtro à instância de CommandLineEventConsumer.
  5. Compile o arquivo MOF usando Mofcomp.exe.

Exemplo

O exemplo de código a seguir cria uma classe chamada "MyCmdLineConsumer" para gerar eventos quando uma instância da nova classe é criada no final de um MOF. O exemplo está no código do MOF, mas você pode criar as instâncias programaticamente usando a API de Script para WMI ou a API COM para WMI.

O procedimento a seguir descreve como criar uma classe chamada MyCmdLineConsumer.

Para criar uma classe chamada MyCmdLineConsumer

  1. Crie o arquivo c:\cmdline_test.bat com um comando que executa um programa visível, como "calc.exe".
  2. Copie o MOF para um arquivo de texto e salve-o com uma extensão .mof.
  3. Em uma janela Comando, compile o arquivo MOF usando o seguinte comando: Mofcomp filename.mof.

Observação

O programa especificado no cmdline_test.bat deve ser executado.

 

// 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";
};

Como monitorar e responder a eventos com consumidores padrão