共用方式為


根據事件執行腳本

ActiveScriptEventConsumer 類別所實作的標準取用者可讓電腦執行腳本,並在發生重要事件時採取動作,以確保計算機可以自動偵測並解決問題。

此取用者預設會在 root\subscription 命名空間中載入。

您可以在單一 ScriptingStandardConsumerSetting 的單一實例中設定 TimeoutMaximumScripts 屬性值,以設定系統上所有 ActiveScriptEventConsumer 實例的效能。

使用標準取用者的基本程式一律相同,且位於使用標準取用者的監視和回應事件中。 下列新增至基本程序的程式是 ActiveScriptEventConsumer 類別特有的程式,並說明如何建立執行腳本的事件取用者。

警告

ActiveScriptEventConsumer 類別具有特殊的安全性條件約束。 此標準取用者必須由本機計算機上的 Administrators 群組本機成員設定。 如果您使用網域帳戶來建立訂用帳戶,則 LocalSystem 帳戶必須具有網域的必要許可權,才能確認建立者是本機 Administrators 群組的成員。

 

下列程式描述如何建立執行腳本的事件取用者。

建立執行腳本的事件取用者

  1. 撰寫文本,以在事件發生時執行。

    您可以使用任何語言撰寫文本,但請確定您所選擇的語言的腳本引擎已安裝在您的電腦上。 腳本不需要使用 WMI 腳本物件。

    只有系統管理員可以設定腳本取用者,而且腳本會在LocalSystem認證下執行,除了網路存取之外,它可提供廣泛的功能給取用者。 不過,腳本無法存取特定的使用者登入數據,例如環境變數和網路共用。

  2. 在 Managed 物件格式 (MOF) 檔案中,建立 ActiveScriptEventConsumer實例,以接收您在查詢中要求的事件。

    您可以將腳本的文字放在 ScriptText 中,或在 ScriptFileName指定腳本的路徑和檔名。 如需詳細資訊,請參閱 設計 Managed 物件格式 (MOF) 類別

  3. 建立__EventFilter實例、為其命名,然後建立查詢以指定事件類型,以觸發執行腳本。

    如需詳細資訊, 請參閱使用 WQL 進行查詢。

  4. 建立 __FilterToConsumerBinding 實例,將篩選條件與 ActiveScriptEventConsumer 實例產生關聯。

  5. 使用 Mofcomp.exe 編譯MOF檔案。

下一節中的範例示範實作事件驅動腳本的兩種方式。 第一個範例會使用外部檔案中定義的腳本,而第二個範例會使用MOF程式碼內建的腳本。 這些範例位於MOF程式碼中,但您可以使用適用於WMI的腳本 API 或適用於WMICOM API,以程式設計方式建立實例。

使用外部腳本的範例

下列程式描述如何使用外部文本範例。

若要使用外部腳本範例

  1. 建立名為 c:\Asec.vbs 的檔案,然後將此範例中的腳本複製到其中。

  2. 將MOF清單複製到文字檔,並以 .mof 擴展名儲存。

  3. 在命令提示字元視窗中,使用下列命令編譯MOF檔案。

    Mofcomp filename**.mof**

  4. 執行計算機,以建立calc.exe程式。 等候五秒以上,關閉 [計算機] 視窗,然後查看 C:\ 目錄,尋找名為 ASEC.log 的檔案。

    下列文字類似於將包含在ASEC.log檔案中的文字。

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

下列 VBScript 程式代碼範例顯示永久取用者收到事件時所呼叫的腳本。 TargetEvent 對像是__InstanceDeletionEvent實例,因此其具有名為 TargetInstance 的屬性,這是用來引發事件的Win32_Process實例。 Win32_Process 類別具有 UserModeTime 和 KernelModeTime 屬性,這些屬性會放入腳本所建立的記錄檔中。

' 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

收到事件時,下列MOF程式碼範例會呼叫腳本。 它會在 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;
};

使用內嵌腳本的範例

下列程式描述如何使用內嵌腳本範例。

使用內嵌腳本範例

  1. 將本節中的MOF清單複製到文字檔中,並以 .mof 擴展名儲存。

  2. 在命令提示字元視窗中,使用下列命令編譯MOF檔案。

    Mofcomp filename**.mof**

下列MOF程式碼範例會建立篩選、取用者,以及它們之間的系結,而且也包含內嵌腳本。

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

使用標準取用者監視和回應事件