Share via


Ejecución de un script basado en un evento

El consumidor estándar implementado por la clase ActiveScriptEventConsumer permite a un equipo ejecutar un script y tomar medidas cuando se producen eventos importantes para asegurarse de que un equipo pueda detectar y resolver problemas automáticamente.

Este consumidor se carga de forma predeterminada en el espacio de nombres root\subscription.

Puede configurar el rendimiento de todas las instancias de ActiveScriptEventConsumer en un sistema estableciendo los valores de la propiedad Timeout o MaximumScripts en una sola instancia de ScriptingStandardConsumerSetting.

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 que agrega al procedimiento básico es específico de la clase ActiveScriptEventConsumer y describe cómo crear un consumidor de eventos que ejecute un script.

Precaución

La clase ActiveScriptEventConsumer 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.

 

En el procedimiento siguiente se describe cómo crear un consumidor de eventos que ejecute un script.

Para crear un consumidor de eventos que ejecute un script

  1. Escriba el script que se va a ejecutar cuando se produzca un evento.

    Puede escribir el script en cualquier idioma, pero asegúrese de que un motor de scripting para el idioma que elija esté instalado en el equipo. El script no tiene que usar objetos de scripting WMI.

    Solo un administrador puede configurar un consumidor de scripts y el script se ejecuta en las credenciales del sistema local, lo que proporciona amplias capacidades al consumidor, excepto para el acceso a la red. Sin embargo, el script no tiene acceso a datos de inicio de sesión de usuario específicos, por ejemplo, variables de entorno y recursos compartidos de red.

  2. En el archivo Managed Object Format (MOF), cree una instancia de ActiveScriptEventConsumer para recibir los eventos que solicita en la consulta.

    Puede colocar el texto del script en ScriptText, o bien puede especificar la ruta de acceso y el nombre de archivo del script en ScriptFileName. Para obtener más información, vea Diseño de clases de formato de Managed Object Format (MOF).

  3. Cree una instancia de __EventFilter, asígnela el nombre y, después, cree una consulta para especificar el tipo de evento, que desencadena la ejecución del script.

    Para obtener más información, vea Consulta con WQL.

  4. Cree una instancia de __FilterToConsumerBinding para asociar el filtro a la instancia de ActiveScriptEventConsumer.

  5. Compile el archivo MOF mediante Mofcomp.exe.

En los ejemplos de la sección siguiente se muestran dos maneras de implementar un script controlado por eventos. En el primer ejemplo se usa un script que se define en un archivo externo y el segundo ejemplo se usa un script integrado en el código 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.

Ejemplo de uso de un script externo

En el procedimiento siguiente se describe cómo usar el ejemplo de script externo.

Para usar el ejemplo de script externo

  1. Cree un archivo denominado c:\Asec.vbs y, después, copie el script de este ejemplo en él.

  2. Copie la lista MOF en un archivo de texto y guárdela con una extensión .mof.

  3. En una ventana del símbolo del sistema, compile el archivo MOF mediante el siguiente comando.

    MofcompNombreDeArchivo**.mof**

  4. Ejecute la Calculadora, que crea un proceso de calc.exe. Espere más de cinco segundos, cierre la ventana Calculadora y, después, busque en C:\ directorio de un archivo denominado ASEC.log.

    El texto siguiente es similar al texto que se incluirá en el archivo ASEC.log.

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

En el siguiente ejemplo de código vbScript se muestra el script al que se llama cuando el consumidor permanente recibe un evento. El objeto TargetEvent es una instancia de __InstanceDeletionEvent, por lo que tiene una propiedad denominada TargetInstance, que es una instancia de Win32_Process que se usa para desencadenar el evento. La clase Win32_Process tiene las propiedades UserModeTime y KernelModeTime que se colocan en el archivo de registro creado por el 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

El siguiente ejemplo de código MOF llama al script cuando se recibe un evento. Crea el filtro, el consumidor y el enlace entre ellos en el espacio de nombres 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;
};

Ejemplo de uso de script insertado

En el procedimiento siguiente se describe cómo usar el ejemplo de script insertado.

Para usar el ejemplo de script insertado

  1. Copie la lista MOF de esta sección en un archivo de texto y guárdela con una extensión .mof.

  2. En una ventana del símbolo del sistema, compile el archivo MOF mediante el siguiente comando.

    MofcompNombreDeArchivo**.mof**

El siguiente ejemplo de código MOF crea el filtro, el consumidor y el enlace entre ellos y también contiene el script insertado.

#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;
};

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