Condividi tramite


Esecuzione di uno script basato su un evento

Il consumer standard implementato dalla classe ActiveScriptEventConsumer consente a un computer di eseguire uno script e di intervenire quando si verificano eventi importanti per garantire che un computer possa rilevare e risolvere automaticamente i problemi.

Questo consumer viene caricato per impostazione predefinita nello spazio dei nomi root\subscription .

È possibile configurare le prestazioni di tutte le istanze di ActiveScriptEventConsumer in un sistema impostando i valori della proprietà Timeout o MaximumScripts in una singola istanza di ScriptingStandardConsumerSetting.

La procedura di base per l'utilizzo dei consumer standard è sempre la stessa e si trova in Monitoraggio e risposta agli eventi con consumer standard. La procedura seguente che aggiunge alla routine di base, è specifica della classe ActiveScriptEventConsumer e descrive come creare un consumer di eventi che esegue uno script.

Attenzione

La classe ActiveScriptEventConsumer ha vincoli di sicurezza speciali. Questo consumer standard deve essere configurato da un membro locale del gruppo Administrators nel computer locale. Se si usa un account di dominio per creare la sottoscrizione, l'account LocalSystem deve disporre delle autorizzazioni necessarie per il dominio per verificare che l'autore sia membro del gruppo Administrators locale.

 

La procedura seguente descrive come creare un consumer di eventi che esegue uno script.

Per creare un consumer di eventi che esegue uno script

  1. Scrivere lo script da eseguire quando si verifica un evento.

    È possibile scrivere lo script in qualsiasi linguaggio, ma assicurarsi che nel computer sia installato un motore di scripting per il linguaggio scelto. Lo script non deve usare oggetti script WMI.

    Solo un amministratore può configurare un consumer di script e lo script viene eseguito in Credenziali LocalSystem, che offre funzionalità generali al consumer, ad eccezione dell'accesso alla rete. Tuttavia, lo script non ha accesso a dati di accesso utente specifici, ad esempio variabili di ambiente e condivisioni di rete.

  2. Nel file MOF (Managed Object Format) creare un'istanza di ActiveScriptEventConsumer per ricevere gli eventi richiesti nella query.

    È possibile inserire il testo dello script in ScriptText oppure specificare il percorso e il nome file dello script in ScriptFileName. Per altre informazioni, vedere Progettazione di classi MOF (Managed Object Format).

  3. Creare un'istanza di __EventFilter, denominarla e quindi creare una query per specificare il tipo di evento, che attiva l'esecuzione dello script.

    Per altre informazioni, vedere Esecuzione di query con WQL.

  4. Creare un'istanza di __FilterToConsumerBinding per associare il filtro all'istanza di ActiveScriptEventConsumer.

  5. Compilare il file MOF usando Mofcomp.exe.

Gli esempi nella sezione seguente illustrano due modi per implementare uno script basato su eventi. Il primo esempio usa uno script definito in un file esterno e il secondo esempio usa uno script integrato nel codice MOF. Gli esempi si trovano nel codice MOF, ma è possibile creare le istanze a livello di codice usando l'API di scripting per WMI o l'API COM per WMI.

Esempio di utilizzo di uno script esterno

La procedura seguente descrive come usare l'esempio di script esterno.

Per usare l'esempio di script esterno

  1. Creare un file denominato c:\Asec.vbs e quindi copiarlo in questo esempio.

  2. Copiare l'elenco MOF in un file di testo e salvarlo con estensione mof.

  3. In una finestra del prompt dei comandi compilare il file MOF usando il comando seguente.

    Mofcomp filename**.mof**

  4. Eseguire il calcolatore, che crea un processo di calc.exe. Attendere più di cinque secondi, chiudere la finestra Calcolatrice e quindi cercare nella directory C:\ un file denominato ASEC.log.

    Il testo seguente è simile al testo contenuto nel file ASEC.log.

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

Nell'esempio di codice VBScript seguente viene illustrato lo script chiamato quando un evento viene ricevuto dal consumer permanente. L'oggetto TargetEvent è un'istanza di __InstanceDeletionEvent in modo che abbia una proprietà denominata TargetInstance, ovvero un'istanza di Win32_Process usata per generare l'evento. La classe Win32_Process ha le proprietà UserModeTime e KernelModeTime inserite nel file di log creato dallo 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

Nell'esempio di codice MOF seguente viene chiamato lo script quando viene ricevuto un evento. Crea il filtro, il consumer e l'associazione tra di essi nello spazio dei nomi 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;
};

Esempio di utilizzo dello script inline

La procedura seguente descrive come usare l'esempio di script inline.

Per usare l'esempio di script inline

  1. Copiare l'elenco MOF in questa sezione in un file di testo e salvarlo con estensione mof.

  2. In una finestra del prompt dei comandi compilare il file MOF usando il comando seguente.

    Mofcomp filename**.mof**

L'esempio di codice MOF seguente crea il filtro, il consumer e l'associazione tra di essi e contiene anche lo 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;
};

Monitoraggio e risposta agli eventi con consumer standard