Compartir a través de


Ejecutar un script basado en un evento

El consumidor estándar que es implementado por la ActiveScriptEventConsumer clase permite a un ordenador ejecutar un script y tomar acciones cuando ocurren eventos importantes para asegurar que un ordenador pueda detectar y resolver problemas automáticamente.

Este consumidor se carga por defecto en el root\subscription espacio de nombre.

Puede configurar el rendimiento de todas las instancias de ActiveScriptEventConsumer en un sistema estableciendo el valor del tiempo de espera or MaximumScripts propiedad en una sola instancia de ScriptingStandardConsumerSetting.

El procedimiento básico para utilizar consumidores estándar es siempre el mismo, y se encuentra en Supervisión y respuesta a eventos con consumidores estándar. El siguiente procedimiento que se añade al procedimiento básico, es específico del ActiveScriptEventConsumer clase y describe cómo crear un consumidor de eventos que ejecute un script.

Precaución

La ActiveScriptEventConsumer clase tiene restricciones de seguridad especiales. Este consumidor estándar debe ser configurado por un miembro local del grupo Administradores en el ordenador local. Si utiliza una cuenta de dominio para crear la suscripción, la cuenta LocalSystem debe tener los permisos necesarios en el dominio para verificar que el creador es miembro del grupo local Administradores.

 

El siguiente procedimiento describe cómo crear un consumidor que ejecuta un script.

Para crear un consumidor que ejecuta un script

  1. Escriba el script para que se ejecute cuando se produzca un evento.

    Puede escribir la secuencia de comandos en cualquier idioma, pero asegúrese de tener instalado en su máquina un motor de secuencias de comandos para el idioma que elija. La secuencia de comandos no tiene que utilizar objetos de secuencia de comandos WMI.

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

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

    Puede poner el texto del script en ScriptText, o puede especificar la ruta 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. Crear, y nombrar, una instancia de __EventFilter,nómbrelo y, a continuación, crear una consulta para especificar el tipo de evento que desencadena la ejecución de la secuencia de comandos.

    Para más información, véase, Consulta con WQL.

  4. Crear una instancia de __FilterToConsumerBinding para asociar el filtro con la instancia de ActiveScriptEventConsume.

  5. Compile el archivo MOF utilizando Mofcomp.exe.

Los ejemplos en la siguiente sección muestran dos formas de implementar un script dirigido por eventos. El primer ejemplo utiliza un script que se define en un archivo externo, y el segundo ejemplo utiliza un script que está incorporado en el código MOF. Los ejemplos están en código MOF, pero puede crear las instancias mediante programación utilizando la función Scripting API para WMI o el COM API para WMI.

Ejemplo de uso de un script externo

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

Para usar el ejemplo del script externo

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

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

  3. En una ventana de línea de comandos, compile el archivo MOF utilizando el siguiente comando.

    Mofcomp nombre de archivo**.mof**

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

    El siguiente texto es similar al que contendrá el fichero ASEC.log.

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

El siguiente ejemplo de código VBScript muestra el script que se llama cuando el consumidor permanente recibe un evento. El TargetEvent objecto es un __InstanceDeletionEvent iinstancia por lo que tiene una propiedad nombrada TargetInstance, que es una Win32_Process instancia utilizada para disparar el evento. La Win32_Process clase tiene el UserModeTime y KernelModeTime propiedades que se introducen 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 archivo root\subscription espacio del nombre.

#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 un script Inline

El siguiente procedimiento describe cómo usar el ejemplo de script inline.

Para usar el ejemplo del script inline

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

  2. En una ventana de línea de comandos, compile el archivo MOF utilizando el siguiente comando.

    Mofcomp nombre de archivo**.mof**

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

#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