Partilhar via


Executando 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 ocorrerem eventos importantes para garantir que um computador possa detectar e resolver problemas automaticamente.

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

Você pode configurar o desempenho de todas as instâncias de 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 Monitorando e respondendo a eventos com consumidores padrão. O procedimento a seguir, que é adicionado ao procedimento básico, é específico para a 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 Administradores local.

 

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

Para criar um consumidor de eventos que executa um script

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

    Você pode escrever o script em qualquer idioma, mas certifique-se de que um mecanismo de script para o idioma escolhido esteja instalado em sua máquina. O script não precisa usar objetos de script WMI.

    Somente um administrador pode configurar um consumidor de script, e o script é executado sob credenciais LocalSystem, o que fornece amplos recursos ao consumidor, exceto para 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 (Formato de Objeto Gerenciado), crie uma instância de ActiveScriptEventConsumer para receber os eventos solicitados na consulta.

    Você pode colocar o texto do script em ScriptText ou pode especificar o caminho e o nome do arquivo do script em ScriptFileName. Para obter mais informações, confira Como 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, consulte 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 de uso de um script externo

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

Para usar o exemplo de script externo

  1. Crie um arquivo chamado c:\Asec.vbs e copie o script neste exemplo para ele.

  2. Copie a lista MOF para 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.

    Nome do arquivoMofcomp**.mof**

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

    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 __InstanceDeletionEvent, portanto, ele tem uma propriedade chamada TargetInstance, que é uma instância 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 script embutido

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

Para usar o exemplo de script embutido

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

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

    Nome do arquivoMofcomp**.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;
};

Monitorando e respondendo a eventos com consumidores padrão