Teilen über


Ausführen eines Skripts basierend auf einem Ereignis

Der Standardconsumer, der von der ActiveScriptEventConsumer-Klasse implementiert wird, ermöglicht es einem Computer, ein Skript auszuführen und Aktionen auszuführen 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 Timeout- oder MaximumScripts-Eigenschaft in einer einzelnen Instanz von ScriptingStandardConsumerSetting festlegen.

Das grundlegende Verfahren für die Verwendung von Standardconsumern ist immer identisch und wird unter Überwachen von Ereignissen und Reagieren auf Ereignisse mit Standardconsumern beschrieben. Das folgende Verfahren, das das grundlegende Verfahren ergänzt, ist spezifisch für die ActiveScriptEventConsumer-Klasse und beschreibt, wie ein Ereignisconsumer erstellt wird, der ein Skript ausführt.

Achtung

Die ActiveScriptEventConsumer-Klasse weist besondere Sicherheitseinschränkungen auf. 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 zu überprüfen, ob der Ersteller Mitglied der lokalen Gruppe „Administratoren“ ist.

 

Im folgenden Verfahren wird beschrieben, wie Sie einen Ereignisconsumer erstellen, 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 stattfindet.

    Sie können das Skript in einer beliebigen Sprache schreiben. Stellen Sie jedoch sicher, dass eine Skript-Engine 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, und das Skript wird unter LocalSystem-Anmeldeinformationen ausgeführt, wodurch dem Consumer umfassende Funktionen mit Ausnahme von Netzwerkzugriff zur Verfügung gestellt werden. Das Skript besitzt 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 Sie können 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 Typ des Ereignisses anzugeben, das 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 mit 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 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 WMI verwenden.

Beispiel für die Verwendung eines externen Skripts

Im folgenden Verfahren wird die Verwendung des externen Skriptbeispiels beschrieben.

So verwenden Sie das externe Skriptbeispiel

  1. Erstellen Sie eine Datei mit dem Namen „C:\Asec.vbs“, und kopieren Sie dann 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 mit dem folgenden Befehl.

    Mofcompdateiname**.mof**

  4. Führen Sie den Rechner aus, der einen Prozess „calc.exe“ 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 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, daher verfügt es über eine Eigenschaft namens TargetInstance, 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 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. Es erstellt den Filter, den Consumer und die Bindung zwischen ihnen im root\subscription-Namespace.

#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 unter Verwendung eines Inlineskripts

Im folgenden Verfahren wird die Verwendung des Inlineskriptbeispiels beschrieben.

So verwenden Sie das Inlineskriptbeispiel

  1. Kopieren Sie die MOF-Liste aus 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.

    Mofcompdateiname**.mof**

Im folgenden MOF-Codebeispiel werden der Filter, der Consumer und die Bindung zwischen ihnen erstellt. 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 von Ereignissen und Reagieren auf Ereignisse mit Standardconsumern