Ausführen eines Skripts auf der Grundlage eines Ereignisses

Der Standardconsumer, der von der ActiveScriptEventConsumer-Klasse implementiert wird, ermöglicht es einem Computer, ein Skript auszuführen und Maßnahmen zu ergreifen, wenn wichtige Ereignisse auftreten, um sicherzustellen, dass ein Computer Probleme automatisch erkennen und beheben kann.

Dieser Consumer wird standardmäßig im Namespace root\subscription geladen.

Sie können die Leistung aller Instanzen von ActiveScriptEventConsumer auf einem System konfigurieren, indem Sie die Werte der Eigenschaft Timeout oder MaximumScripts in einer einzelnen Instanz von ScriptingStandardConsumerSetting festlegen.

Das grundlegende Verfahren für die Verwendung von Standardconsumern ist immer gleich und befindet sich in Überwachen von und Reagieren auf Ereignisse mit Standardconsumern. Das folgende Verfahren gilt zusätzlich zu der grundlegenden Prozedur und ist spezifisch für die ActiveScriptEventConsumer-Klasse und beschreibt, wie ein Ereignisconsumer erstellt wird, der ein Skript ausführt.

Achtung

Für die ActiveScriptEventConsumer-Klasse gelten spezielle Sicherheitseinschränkungen. Dieser Standardconsumer muss von einem lokalen Mitglied der Gruppe „Administratoren“ auf dem lokalen Computer konfiguriert werden. Wenn Sie ein Domänenkonto zum Erstellen des Abonnements verwenden, muss das LocalSystem-Konto über die erforderlichen Berechtigungen für die Domäne verfügen, um sicherzustellen, dass der Ersteller Mitglied der lokalen Administratorgruppe ist.

 

Das folgende Verfahren beschreibt, wie ein Ereignisconsumer erstellt wird, der ein Skript ausführt.

So erstellen Sie einen Ereignisconsumer, der ein Skript ausführt

  1. Schreiben Sie das Skript, das ausgeführt werden soll, wenn ein Ereignis eintritt.

    Sie können das Skript in einer beliebigen Sprache schreiben, stellen Sie aber sicher, dass ein Skriptmodul für die von Ihnen ausgewählte Sprache auf Ihrem Computer installiert ist. Das Skript muss keine WMI-Skriptobjekte verwenden.

    Nur ein Administrator kann einen Skriptconsumer einrichten. Das Skript wird unter LocalSystem-Anmeldeinformationen ausgeführt, wodurch dem Consumer umfassende Funktionen mit Ausnahme des Netzwerkzugriffs zur Verfügung gestellt werden. Das Skript hat jedoch keinen Zugriff auf bestimmte Benutzeranmeldedaten, z. B. Umgebungsvariablen und Netzwerkfreigaben.

  2. Erstellen Sie in der MOF-Datei (Managed Object Format) eine Instanz von ActiveScriptEventConsumer, um die Ereignisse zu empfangen, die Sie in der Abfrage anfordern.

    Sie können den Text des Skripts in ScriptText einfügen oder den Pfad und Dateinamen des Skripts in ScriptFileName angeben. Weitere Informationen finden Sie unter Entwerfen von MOF-Klassen (Managed Object Format).

  3. Erstellen Sie eine Instanz von __EventFilter, benennen Sie sie, und erstellen Sie dann eine Abfrage, um den Ereignistyp anzugeben, der die Ausführung des Skripts auslöst.

    Weitere Informationen finden Sie unter Abfragen mit WQL.

  4. Erstellen Sie eine Instanz von __FilterToConsumerBinding, um den Filter der Instanz von ActiveScriptEventConsumer zuzuordnen.

  5. Kompilieren Sie die MOF-Datei mithilfe von Mofcomp.exe.

Die Beispiele im folgenden Abschnitt zeigen zwei Möglichkeiten zum Implementieren eines ereignisgesteuerten Skripts. Im ersten Beispiel wird ein Skript verwendet, das in einer externen Datei definiert ist, und im zweiten Beispiel ein Skript, das in den MOF-Code integriert ist. Die Beispiele sind im MOF-Code gehalten, Sie können die Instanzen aber auch programmgesteuert erstellen, indem Sie entweder die Skript-API für WMI oder die COM-API für WMI verwenden.

Beispiel für die Verwendung eines externen Skripts

Im folgenden Verfahren wird die Verwendung des Beispiels mit einem externen Skript beschrieben.

So verwenden Sie das Beispiel mit externem Skript

  1. Erstellen Sie eine Datei mit dem Namen c:\Asec.vbs, und kopieren Sie das Skript in diesem Beispiel in diese Datei.

  2. Kopieren Sie die MOF-Liste in eine Textdatei, und speichern Sie sie mit der Erweiterung .mof.

  3. Kompilieren Sie die MOF-Datei in einem Eingabeaufforderungsfenster mithilfe des folgenden Befehls.

    Mofcomp filename**.mof**

  4. Führen Sie den Rechner aus, der einen calc.exe Prozess erstellt. Warten Sie mehr als fünf Sekunden, schließen Sie das Rechnerfenster, und suchen Sie dann im Verzeichnis C:\ nach einer Datei mit dem Namen ASEC.log.

    Der folgende Text ähnelt dem Text, der in der Datei ASEC.log enthalten sein wird.

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

Das folgende VBScript-Codebeispiel zeigt das Skript, das aufgerufen wird, wenn ein Ereignis vom dauerhaften Consumer empfangen wird. Das TargetEvent-Objekt ist eine __InstanceDeletionEvent-Instanz, hat daher eine Eigenschaft mit dem Namen TargetInstance; dies ist eine Win32_Process-Instanz zum Auslösen des Ereignisses. Die Win32_Process-Klasse verfügt über die Eigenschaften UserModeTime und KernelModeTime, die in die vom Skript erstellte Protokolldatei eingefügt werden.

' 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

Im folgenden MOF-Codebeispiel wird das Skript aufgerufen, wenn ein Ereignis empfangen wird. Er erstellt den Filter, den Consumer und die Bindung zwischen diesen im 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;
};

Beispiel für die Verwendung eines Inlineskripts

Im folgenden Verfahren wird die Verwendung des Beispiels mit einem Inlineskript beschrieben.

So verwenden Sie das Inlineskript-Beispiel

  1. Kopieren Sie die MOF-Liste in diesem Abschnitt in eine Textdatei, und speichern Sie sie mit der Erweiterung .mof.

  2. Kompilieren Sie die MOF-Datei in einem Eingabeaufforderungsfenster mithilfe des folgenden Befehls.

    Mofcomp filename**.mof**

Das folgende MOF-Codebeispiel erstellt den Filter, den Consumer und die Bindung zwischen diesen und enthält auch das Skript 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;
};

Überwachen von und Reagieren auf Ereignisse mit Standardconsumern