共用方式為


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

您可以使用已安裝的 標準使用者類別,根據作業系統中的事件執行動作。 標準消費者是已註冊的簡單類別,並定義了永久性消費者類別。 每個標準取用者在收到事件通知之後都會採取特定動作。 例如,您可以定義 ActiveScriptEventConsumer 實例,以在電腦上的可用磁碟空間與指定的大小不同時執行腳本。

WMI 會將標準消費者編譯成相依於作業系統的預設命名空間,例如:

  • 在 Windows Server 2003 中,所有標準取用者預設都會編譯為 “Root\Subscription” 命名空間。

注意

如需每個 WMI 類別特定的預設命名空間和作業系統,請參閱每個類別主題中的備註和需求節。

 

下表列出並描述 WMI 標準取用者。

標準消費者 描述
ActiveScriptEventConsumer 在收到事件通知時執行腳本。 如需詳細資訊,請參閱根據事件 執行腳本
LogFileEventConsumer 在收到事件通知時,將自定義字串寫入文字檔。 如需詳細資訊,請參閱 根據事件寫入記錄檔。
NTEventLogEventConsumer 將特定訊息記錄至應用程式事件記錄檔。 如需更多資訊,請參閱 將事件記錄到 NT 事件記錄檔。
SMTPEventConsumer 每次事件被傳遞時,都會通過SMTP發送電子郵件訊息。 如需詳細資訊,請參閱 根據事件傳送電子郵件
CommandLineEventConsumer 當事件傳遞至本機系統時,啟動進程。 可執行文件必須位於安全的位置,或使用強式訪問控制清單 (ACL) 保護,以防止未經授權的使用者以不同的可執行檔取代可執行檔。 如需詳細資訊,請參閱根據事件從命令行執行程式

 

以下步驟說明如何使用標準消費者來監視和回應事件。 注意,Managed 物件格式 (MOF) 檔案、腳本或應用程式的程序是相同的。

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

  1. 使用MOF預處理器命令 #pragma 命名空間指定MOF檔案中的命名空間。 在腳本或應用程式中,在連線至 WMI 的程式代碼中指定 命名空間。

    下列MOF程式代碼範例示範如何指定 root\subscription 命名空間。

    #pragma namespace ("\\\\.\\root\\subscription")
    

    大部分 內部事件 與 root\cimv2 命名空間中類別實例的變更相關聯。 不過,系統登錄提供者會在 root\default 命名空間中引發登錄事件,例如 RegistryKeyChangeEvent

    取用者可以在事件 __EventFilter 查詢中指定 EventNamespace 屬性中的命名空間,以包含位於其他命名空間的事件類別。 內建事件 類別,例如 __InstanceOperationEvent 可在每個命名空間中使用。

  2. 建立並初始化標準消費者類別的實例。

    這個實例在 Name 屬性中可能有唯一的值。 您可以重複使用相同的名稱來更新現有的使用者。

    InsertionStringTemplates 包含要在您指定的 EventType事件中插入的文字。 您可以使用文字字串或直接參考屬性。 如需詳細資訊,請參閱 使用標準字串範本 以及 用於事件查詢的 SELECT 語句

    針對支援插入字串且沒有相關聯文字的事件記錄檔使用現有的來源。

    下列MOF程式代碼範例示範如何使用現有的WSH來源和 EventID 值為8。

    instance of NTEventLogEventConsumer as $Consumer
    {
        Name = "RunKeyEventlogConsumer";
        SourceName = "WSH";               
        EventID = 8;
        // Warning                              
        EventType = 2;
        // One string supplies the entire message          
        NumberOfInsertionStrings = 1;             
        // the %Hive% and %KeyPath% are properties of
        // the RegistryKeyChangeEvent instance 
        InsertionStringTemplates = 
            {"The key %Hive%\\%RootPath% has been modified."
            "Check if the change is intentional"};
    };
    
  3. 建立 __EventFilter 的實例,並定義事件的查詢。

    在下列範例中,篩選會監視註冊啟動程式的登錄機碼。 監視此登錄機碼可能很重要,因為未經授權的程式可以在機碼下註冊自己,這會導致計算機開機時啟動它。

    instance of __EventFilter as $Filter
    {
    Name = "RunKeyFilter";
    QueryLanguage = "WQL"; 
    Query = "Select * from RegistryTreeChangeEvent"
        " where (Hive = \"HKEY_LOCAL_MACHINE\" and "
        "RootPath = \"Software\\\\Microsoft\\\\Windows"
        "\\\\CurrentVersion\\\\Run\")";
    
    // RegistryTreeChangeEvents only fire in root\default namespace
    EventNamespace = "root\\default";                       
    };
    
  4. 識別要監視和建立事件查詢的事件。

    您可以檢查是否有內部或外部事件正在使用。 例如,使用登錄提供者的 RegistryTreeChangeEvent 類別來監視系統登錄的變更。

    如果類別不存在描述您需要監視的事件,您必須建立自己的事件提供者,並定義新的外部事件類別。 如需詳細資訊,請參閱 撰寫事件提供者

    在MOF檔案中,您可以為篩選和取用者定義 別名,以提供簡單的方法來描述實例路徑。

    下列範例示範如何為篩選和取用者定義 別名

    instance of __EventFilter as $FILTER
    instance of LogFileEventConsumer as $CONSUMER
    
  5. 建立 __FilterToConsumerBinding 的實例,以建立篩選和取用者類別的關聯。 這個實例會判斷當發生符合指定篩選的事件時,必須發生取用者所指定的動作。 __EventFilter__EventConsumer__FilterToConsumerBindingCreatorSID 屬性中必須有相同的個別安全性識別碼 (SID)。 如需詳細資訊,請參閱 將事件篩選器與邏輯使用者綁定

    下列範例示範如何依物件路徑識別實例,或使用別名作為對象路徑的速記表達式。

    instance of __EventFilter as $FILTER
    instance of NTEventLogEventConsumer as $CONSUMER
    

    下列範例會使用別名將篩選系結至取用者。

    instance of __FilterToConsumerBinding
    {
        Filter = $FILTER;
        Consumer = $CONSUMER;
    
    };
    

    您可以將一個篩選系結至數個取用者,這表示發生比對事件時,必須採取數個動作:或者,您可以將一個取用者系結至數個篩選條件,這表示當符合其中一個篩選條件的事件發生時,必須採取動作。

    下列動作是根據消費者和事件的情況而採取的:

    • 如果其中一個永久取用者失敗,其他要求事件的取用者將會接收到通知。
    • 如果事件被丟棄,WMI 會觸發 __EventDroppedEvent
    • 如果您訂閱此事件,它會返回丟棄的事件,而 __EventConsumer 的參考則代表失敗的取用者。
    • 如果消費者失敗,WMI 會觸發 __ConsumerFailureEvent,其中可能包含在 ErrorCodeErrorDescriptionErrorObject 屬性中的更多資訊。

    如需詳細資訊,請參閱 將事件篩選與邏輯消費者系結

下列範例顯示 NTEventLogEventConsumer 實例的 MOF。 編譯此 MOF 後,任何嘗試在登錄路徑 HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows\CurrentVersion\Run 中建立、刪除或修改值的行為,都會在來源為 “WSH” 的應用程式事件記錄中記錄一個項目。

#pragma namespace ("\\\\.\\root\\subscription")
 
instance of __EventFilter as $Filter
{
    Name = "RunKeyFilter";
    QueryLanguage = "WQL";
    Query = "Select * from RegistryTreeChangeEvent"
            " where (Hive = \"HKEY_LOCAL_MACHINE\" and "
            "KeyPath = \"Software\\\\Microsoft\\\\Windows"
            "\\\\CurrentVersion\\\\Run\")";

    // RegistryTreeChangeEvents only fire
    // in root\default namespace
    EventNamespace = "root\\default";   
};
 
instance of NTEventLogEventConsumer as $Consumer
{
    Name = "RunKeyEventlogConsumer";
    SourceName = "WSH";               
    EventID = 8;
    EventType = 2;                            // Warning
    Category = 0;
    NumberOfInsertionStrings = 1;

    // the %Hive% and %KeyPath% are properties
    // of the RegistryKeyChangeEvent instance 
    InsertionStringTemplates = {"The key %Hive%\\%RootPath% "
        "has been modified. Check if the change is intentional"};
};
 

// Bind the filter to the consumer
instance of __FilterToConsumerBinding
{
    Filter = $Filter;
    Consumer = $Consumer;
};

安全地接收事件