Ausführen eines Skripts basierend auf einem Ereignis

Der von der ActiveScriptEventConsumer-Klasse implementierte Standardconsumer ermöglicht einem Computer das Ausführen eines Skripts und das Ausführen von Maßnahmen, wenn wichtige Ereignisse auftreten, um sicherzustellen, dass ein Computer Probleme automatisch erkennen und beheben kann.

Dieser Consumer wird standardmäßig im \ Stammabonnementnamespace geladen.

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

Das grundlegende Verfahren für die Verwendung von Standard-Consumern ist immer identisch und befindet sich unter Überwachen und Reagieren auf Ereignisse mit Standard-Consumern. Die folgende Prozedur, die der grundlegenden Prozedur hinzufügt, ist spezifisch für die ActiveScriptEventConsumer-Klasse und beschreibt, wie ein Ereignisconsumer erstellt wird, der ein Skript ausführt.

Achtung

Die ActiveScriptEventConsumer-Klasse weist spezielle Sicherheitseinschränkungen auf. Dieser Standardverbraucher muss von einem lokalen Mitglied der Gruppe Administratoren auf dem lokalen Computer konfiguriert werden. Wenn Sie zum Erstellen des Abonnements ein Domänenkonto verwenden, muss das LocalSystem-Konto über die erforderlichen Berechtigungen für die Domäne verfügen, um zu überprüfen, ob der Ersteller Mitglied der lokalen Administratorgruppe ist.

Im folgenden Verfahren wird beschrieben, wie Sie einen Ereignisverbraucher erstellen, der ein Skript ausführt.

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

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

    Sie können das Skript in einer beliebigen Sprache schreiben, aber stellen Sie sicher, dass eine Skript-Engine für die sprache, die Sie auswählen, auf Ihrem Computer installiert ist. Das Skript muss keine WMI-Skriptobjekte verwenden.

    Nur ein Administrator kann einen Skriptverbraucher einrichten, und das Skript wird unter LocalSystem-Anmeldeinformationen ausgeführt, was dem Consumer mit Ausnahme des Netzwerkzugriffs umfassende Funktionen bietet. Das Skript hat jedoch keinen Zugriff auf bestimmte Benutzeranmeldungsdaten, 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 speichern, oder Sie können den Pfad und den 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 ActiveScriptEventConsumerzuzuordnen.

  5. Kompilieren Sie die MOF-Datei mitMofcomp.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 wird ein Skript verwendet, das in den MOF-Code integriert ist. Die Beispiele befinden sich im MOF-Code, aber Sie können die Instanzen programmgesteuert erstellen, indem Sie entweder die Skript-API für WMI oder die COM-API für WMIverwenden.

Beispiel für die Verwendung eines externen Skripts

Das folgende Verfahren beschreibt die Verwendung des beispiels für ein externes Skript.

So verwenden Sie das Beispiel für ein externes Skript

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

  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 mit dem folgenden Befehl.

    Mofcomp-Dateiname}.mof*

  4. Führen Sie den Rechner aus, um einen calc.exe Prozess zu erstellen. Warten Sie mehr als fünf Sekunden, schließen Sie das Fenster Rechner, 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 ist.

    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 permanenten Consumer empfangen wird. Das TargetEvent-Objekt ist eine _ _ InstanceDeletionEvent-Instanz, sodass es über eine Eigenschaft namens TargetInstance verfügt, bei der es sich um eine Win32 _ Process-Instanz handelt, die zum Auslösen des Ereignisses verwendet wird. Die Win32 _ Process-Klasse verfügt über die Eigenschaften UserModeTime und KernelModeTime, die in die vom Skript erstellte Protokolldatei aufgenommen 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

Das folgende MOF-Codebeispiel ruft das Skript auf, wenn ein Ereignis empfangen wird. Er erstellt den Filter, den Consumer und die Bindung zwischen ihnen im \ Stammabonnementnamespace.

#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

Das folgende Verfahren beschreibt die Verwendung des Inlineskriptbeispiels.

So verwenden Sie das Inlineskriptbeispiel

  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 mit dem folgenden Befehl.

    Mofcomp-Dateiname}.mof*

Im folgenden MOF-Codebeispiel werden der Filter, der Consumer und die Bindung zwischen ihnen erstellt, und es 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 und Reagieren auf Ereignisse mit Standard-Consumern