根據事件執行腳本

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 檔案。

    Mofcompfilename**.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 檔案。

    Mofcompfilename**.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;
};

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