Partilhar via


Executando um programa a partir da linha de comando com base em um evento

A classeCommandLineEventConsumer executa um programa executável especificado a partir de uma linha de comando quando ocorre um evento especificado. Essa classe é um consumidor padrão de eventos 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 com uma ACL (lista de controle de acesso) forte, um usuário sem privilégios de acesso poderá substituir seu executável por um executável diferente. Você pode usar as classes Win32_LogicalFileSecuritySetting ou Win32_LogicalShareSecuritySetting para alterar programaticamente a segurança de um arquivo ou compartilhamento. Para obter mais informações, consulte Criando um descritor de segurança para um novo objeto em C++.

O procedimento básico para utilizar consumidores padrão é sempre o mesmo e está localizado em Monitorização e Resposta a Eventos com Consumidores Padrão. O procedimento a seguir adiciona ao procedimento básico, é específico para a classeCommandLineEventConsumer e descreve como criar um consumidor de eventos que executa um programa.

Atenção

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 Administradores local.

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

 

O procedimento a seguir descreve como criar um consumidor de eventos que executa um processo a partir de uma linha de comando.

Para criar um consumidor de eventos que executa um processo a partir 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, consulte Designing Managed Object Format (MOF) Classes.
  2. Crie uma instância de __EventFilter e dê-lhe um nome.
  3. Crie uma consulta para especificar o tipo de evento. Para obter mais informações, consulte Consultando com WQL.
  4. Crie uma instância de __FilterToConsumerBinding para associar o filtro à instância de CommandLineEventConsumer.
  5. Compile seu arquivo MOF usando Mofcomp.exe.

Exemplo

O exemplo de código a seguir cria uma nova 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 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 nova classe chamada MyCmdLineConsumer.

Para criar uma nova 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 de comando, compile o arquivo MOF usando o seguinte comando: Mofcomp filename.mof.

Observação

O programa especificado em 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";
};

Monitoramento e Resposta a Eventos com Consumidores Padrão