Sdílet prostřednictvím


Spuštění skriptu na základě události

Standardní příjemce implementovaný třídy ActiveScriptEventConsumer umožňuje počítači spustit skript a provést akci v případě, že dojde k důležitým událostem, aby se zajistilo, že počítač dokáže rozpoznat a vyřešit problémy automaticky.

Tento příjemce se ve výchozím nastavení načte v oboru názvů root\subscription.

Můžete nakonfigurovat výkon všech instancí ActiveScriptEventConsumer v systému nastavením hodnot vlastností Timeout nebo MaximumScripts v jedné instanci ScriptingStandardConsumerSetting.

Základní postup použití standardních příjemců je vždy stejný a nachází se v Monitorování a reakce na události se standardními příjemci. Následující postup, který přidá do základní procedury, je specifický pro ActiveScriptEventConsumer třídy a popisuje, jak vytvořit příjemce událostí, který spouští skript.

Opatrnost

Třída ActiveScriptEventConsumer má zvláštní omezení zabezpečení. Tento standardní příjemce musí být nakonfigurován místním členem skupiny Administrators v místním počítači. Pokud k vytvoření předplatného použijete účet domény, musí mít účet LocalSystem potřebná oprávnění k doméně, aby bylo možné ověřit, že tvůrce je členem místní skupiny Administrators.

 

Následující postup popisuje, jak vytvořit příjemce událostí, který spouští skript.

Vytvoření příjemce událostí, který spouští skript

  1. Napište skript, který se má spustit, když dojde k události.

    Skript můžete napsat v libovolném jazyce, ale ujistěte se, že je na počítači nainstalovaný skriptovací modul pro jazyk, který zvolíte. Skript nemusí používat skriptovací objekty rozhraní WMI.

    Příjemce skriptu může nastavit pouze správce a skript se spustí v rámci přihlašovacích údajů LocalSystem, což příjemci poskytuje široké možnosti s výjimkou síťového přístupu. Skript ale nemá přístup ke konkrétním přihlašovacím datům uživatele, například proměnným prostředí a síťovým sdíleným složkám.

  2. V souboru MOF (Managed Object Format) vytvořte instanci ActiveScriptEventConsumer pro příjem událostí, které v dotazu požadujete.

    Text skriptu můžete umístit do ScriptText, nebo můžete zadat cestu a název souboru skriptu v ScriptFileName. Další informace naleznete v tématu Návrh tříd MOF (Managed Object Format).

  3. Vytvořte instanci __EventFilter, pojmenujte ji a pak vytvořte dotaz, který určí typ události, která aktivuje spuštění skriptu.

    Další informace najdete v tématu Dotazování pomocí jazyka WQL.

  4. Vytvořte instanci __FilterToConsumerBinding pro přidružení filtru k instanci ActiveScriptEventConsumer.

  5. Zkompilujte soubor MOF pomocí Mofcomp.exe.

Příklady v následující části ukazují dva způsoby implementace skriptu řízeného událostmi. První příklad používá skript definovaný v externím souboru a druhý příklad používá skript, který je integrovaný do kódu MOF. Příklady jsou v kódu MOF, ale instance můžete vytvořit programově pomocí rozhraní API pro skriptování pro rozhraní WMI nebo rozhraní API COM pro rozhraní WMI.

Příklad použití externího skriptu

Následující postup popisuje, jak použít příklad externího skriptu.

Použití příkladu externího skriptu

  1. Vytvořte soubor s názvem c:\Asec.vbsa zkopírujte do něj skript v tomto příkladu.

  2. Zkopírujte seznam MOF do textového souboru a uložte ho s příponou .mof.

  3. V okně příkazového řádku zkompilujte soubor MOF pomocí následujícího příkazu.

    mofcompnázev souboru**.mof**

  4. Spusťte kalkulačku, která vytvoří proces calc.exe. Počkejte déle než pět sekund, zavřete okno Kalkulačka a vyhledejte v adresáři C:\ soubor s názvem ASEC.log.

    Následující text je podobný textu, který bude obsažen v souboru ASEC.log.

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

Následující příklad kódu jazyka VBScript ukazuje skript, který je volán při přijetí události permanentním spotřebitelem. Objekt TargetEvent je instance __InstanceDeletionEvent, takže má vlastnost s názvem TargetInstance, což je instance Win32_Process sloužící k vyvolání události. Třída Win32_Process má vlastnosti UserModeTime a KernelModeTime vlastnosti, které jsou vloženy do souboru protokolu vytvořeného skriptem.

' 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

Následující příklad kódu MOF volá skript při přijetí události. Vytvoří filtr, příjemce a vazbu mezi nimi v oboru názvů 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;
};

Příklad použití vloženého skriptu

Následující postup popisuje, jak použít příklad vloženého skriptu.

Pro použití příkladu vloženého skriptu

  1. Zkopírujte seznam MOF v této části do textového souboru a uložte ho s příponou .mof.

  2. V okně příkazového řádku zkompilujte soubor MOF pomocí následujícího příkazu.

    mofcompnázev souboru**.mof**

Následující příklad kódu MOF vytvoří filtr, příjemce a vazbu mezi nimi a také obsahuje vložený skript.

#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;
};

Monitorování a reagování na události se standardními příjemci