Executar um script com base em um evento

O consumidor padrão implementado pela classe ActiveScriptEventConsumer permite que um computador execute um script e tome medidas quando eventos importantes ocorrem a fim de garantir que o computador possa detectar e resolve problemas automaticamente.

Esse consumidor é carregado por padrão no namespace root\subscription.

Você pode configurar o desempenho de todas as instâncias do ActiveScriptEventConsumer em um sistema definindo os valores da propriedade Timeout ou MaximumScripts em uma única instância de ScriptingStandardConsumerSetting.

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 que baseia-se no procedimento básico é específico da classe ActiveScriptEventConsumer e descreve como criar um consumidor de eventos que executa um script.

Cuidado

A classe ActiveScriptEventConsumer 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.

 

O procedimento a seguir descreve como criar um consumidor de evento que executa um script.

Para criar um consumidor de eventos que executa um script

  1. Escreva o script a ser executado quando um evento ocorrer.

    Você pode escrever o script em qualquer idioma, mas o mecanismo de script para a linguagem escolhida deverá estar instalado em seu computador. O script não precisa usar objetos de script do WMI.

    Somente um administrador pode configurar um consumidor de script e o script é executado com credenciais LocalSystem, o que dá amplas capacidades para o consumidor, exceto o acesso à rede. No entanto, o script não tem acesso a dados de logon de usuário específicos, por exemplo, variáveis de ambiente e compartilhamentos de rede.

  2. No arquivo MOF (Managed Object Format), crie uma instância de ActiveScriptEventConsumer para receber os eventos solicitados na consulta.

    Você pode colocar o texto do script em ScriptText ou especificar o caminho e o nome do arquivo do script em ScriptFileName. Para obter mais informações, conira Criar classes MOF (Managed Object Format).

  3. Crie uma instância de __EventFilter, nomeie-a e crie uma consulta para especificar o tipo de evento que dispara a execução do script.

    Para obter mais informações, confira Como consultar com WQL.

  4. Crie uma instância de __FilterToConsumerBinding para associar o filtro à instância de ActiveScriptEventConsumer.

  5. Compile o arquivo MOF usando Mofcomp.exe.

Os exemplos na seção a seguir mostram duas maneiras de implementar um script controlado por eventos. O primeiro exemplo usa um script definido em um arquivo externo e o segundo exemplo usa um script integrado ao código MOF. Os exemplos estão 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.

Exemplo usando um script externo

O procedimento a seguir descreve como usar o exemplo com script externo.

Para usar o exemplo de script externo

  1. Crie um arquivo chamado c:\Asec.vbs e copie o script deste exemplo nesse arquivo.

  2. Copie a lista do MOF em um arquivo de texto e salve-o com uma extensão .mof.

  3. Em uma janela de prompt de comando, compile o arquivo MOF usando o comando a seguir.

    Mofcompfilename**.mof**

  4. Execute a Calculadora, que cria um processo calc.exe. Aguarde mais de cinco segundos, feche a janela da Calculadora e, em seguida, procure um arquivo chamado ASEC.log no diretório C:\.

    O texto a seguir é semelhante ao texto que estará contido no arquivo ASEC.log.

    Time: 12/31/2002 2:56:33 PM; Entry made by: ASEC
    Application closed. UserModeTime:  1562500; 
    KernelModeTime: 3125000 [hundreds of nanoseconds]
    

O exemplo de código VBScript a seguir mostra o script que é chamado quando um evento é recebido pelo consumidor permanente. O objeto TargetEvent é uma instância de __InstanceDeletionEvent, portanto, tem uma propriedade chamada TargetInstance, que é uma instância de Win32_Process usada para disparar o evento. A classe Win32_Process tem as propriedades UserModeTime e KernelModeTime que são colocadas no arquivo de log criado pelo script.

' asec.vbs script
Dim objFS, objFile
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile = objFS.OpenTextFile("C:\ASEC.log", 8, true)
objFile.WriteLine "Time: " & Now & "; Entry made by: ASEC"

objFile.WriteLine "Application closed. UserModeTime:  " & _
    TargetEvent.TargetInstance.UserModeTime & _
    "; KernelModeTime: " & _
    TargetEvent.TargetInstance.KernelModeTime & _
    " [hundreds of nanoseconds]"
objFile.Close

O exemplo de código MOF a seguir chama o script quando um evento é recebido. Ele cria o filtro, o consumidor e a associação entre eles no namespace root\subscription.

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

instance of ActiveScriptEventConsumer as $Cons
{
    Name = "ASEC";
    ScriptingEngine = "VBScript";
    ScriptFileName = "c:\\asec2.vbs";
};

instance of __EventFilter as $Filt
{
    Name = "EF";
    Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
        "WHERE TargetInstance ISA \"Win32_Process\" "
        "AND TargetInstance.Name = \"calc.exe\"";
    QueryLanguage = "WQL";
    EventNamespace = "root\\cimv2";
};

instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};

Exemplo usando o script embutido

O procedimento a seguir descreve como usar o exemplo com script embutido.

Para usar o exemplo de script embutido

  1. Copie a lista do MOF nesta seção em um arquivo de texto e salve-o com uma extensão .mof.

  2. Em uma janela de prompt de comando, compile o arquivo MOF usando o comando a seguir.

    Mofcompfilename**.mof**

O exemplo de código MOF a seguir cria o filtro, o consumidor e a associação entre eles e também contém o script embutido.

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

instance of ActiveScriptEventConsumer as $Cons
{
    Name = "ASEC";
    ScriptingEngine = "VBScript";
    
    ScriptText =
        "Dim objFS, objFile\n"
        "Set objFS = CreateObject(\"Scripting.FileSystemObject\")\n"
        "Set objFile = objFS.OpenTextFile(\"C:\\ASEC.log\","
        " 8, true)\nobjFile.WriteLine \"Time: \" & Now & \";"
        " Entry made by: ASEC\"\nobjFile.WriteLine"
        " \"Application closed. UserModeTime:  \" & "
        "TargetEvent.TargetInstance.UserModeTime &_\n"
        "\"; KernelModeTime: \" & "
        "TargetEvent.TargetInstance.KernelModeTime "
        "& \" [hundreds of nanoseconds]\"\n"
        "objFile.Close\n";
};

instance of __EventFilter as $Filt
{
    Name = "EF";
    Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
        "WHERE TargetInstance ISA \"Win32_Process\" "
        "AND TargetInstance.Name = \"calc.exe\"";
    QueryLanguage = "WQL";
    EventNamespace = "root\\cimv2";
};

instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};

Como monitorar e responder a eventos com consumidores padrão