使用標準取用者監視和回應事件
您可以使用已安裝的 標準使用者類別,根據作業系統中的事件執行動作。 標準消費者是已註冊的簡單類別,並定義了永久性消費者類別。 每個標準取用者在收到事件通知之後都會採取特定動作。 例如,您可以定義 ActiveScriptEventConsumer 實例,以在電腦上的可用磁碟空間與指定的大小不同時執行腳本。
WMI 會將標準消費者編譯成相依於作業系統的預設命名空間,例如:
- 在 Windows Server 2003 中,所有標準取用者預設都會編譯為 “Root\Subscription” 命名空間。
注意
如需每個 WMI 類別特定的預設命名空間和作業系統,請參閱每個類別主題中的備註和需求節。
下表列出並描述 WMI 標準取用者。
標準消費者 | 描述 |
---|---|
ActiveScriptEventConsumer | 在收到事件通知時執行腳本。 如需詳細資訊,請參閱根據事件 執行腳本。 |
LogFileEventConsumer | 在收到事件通知時,將自定義字串寫入文字檔。 如需詳細資訊,請參閱 根據事件寫入記錄檔。 |
NTEventLogEventConsumer | 將特定訊息記錄至應用程式事件記錄檔。 如需更多資訊,請參閱 將事件記錄到 NT 事件記錄檔。 |
SMTPEventConsumer | 每次事件被傳遞時,都會通過SMTP發送電子郵件訊息。 如需詳細資訊,請參閱 根據事件傳送電子郵件。 |
CommandLineEventConsumer | 當事件傳遞至本機系統時,啟動進程。 可執行文件必須位於安全的位置,或使用強式訪問控制清單 (ACL) 保護,以防止未經授權的使用者以不同的可執行檔取代可執行檔。 如需詳細資訊,請參閱根據事件從命令行執行程式。 |
以下步驟說明如何使用標準消費者來監視和回應事件。 注意,Managed 物件格式 (MOF) 檔案、腳本或應用程式的程序是相同的。
使用標準消費者監視和回應事件
使用MOF預處理器命令 #pragma 命名空間指定MOF檔案中的命名空間。 在腳本或應用程式中,在連線至 WMI 的程式代碼中指定 命名空間。
下列MOF程式代碼範例示範如何指定 root\subscription 命名空間。
#pragma namespace ("\\\\.\\root\\subscription")
大部分 內部事件 與 root\cimv2 命名空間中類別實例的變更相關聯。 不過,系統登錄提供者會在 root\default 命名空間中引發登錄事件,例如 RegistryKeyChangeEvent。
取用者可以在事件 __EventFilter 查詢中指定 EventNamespace 屬性中的命名空間,以包含位於其他命名空間的事件類別。 內建事件 類別,例如 __InstanceOperationEvent 可在每個命名空間中使用。
建立並初始化標準消費者類別的實例。
這個實例在 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"}; };
建立 __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"; };
識別要監視和建立事件查詢的事件。
您可以檢查是否有內部或外部事件正在使用。 例如,使用登錄提供者的 RegistryTreeChangeEvent 類別來監視系統登錄的變更。
如果類別不存在描述您需要監視的事件,您必須建立自己的事件提供者,並定義新的外部事件類別。 如需詳細資訊,請參閱 撰寫事件提供者。
在MOF檔案中,您可以為篩選和取用者定義 別名,以提供簡單的方法來描述實例路徑。
下列範例示範如何為篩選和取用者定義 別名。
instance of __EventFilter as $FILTER instance of LogFileEventConsumer as $CONSUMER
建立 __FilterToConsumerBinding 的實例,以建立篩選和取用者類別的關聯。 這個實例會判斷當發生符合指定篩選的事件時,必須發生取用者所指定的動作。 __EventFilter、__EventConsumer和 __FilterToConsumerBinding 在 CreatorSID 屬性中必須有相同的個別安全性識別碼 (SID)。 如需詳細資訊,請參閱 將事件篩選器與邏輯使用者綁定。
下列範例示範如何依物件路徑識別實例,或使用別名作為對象路徑的速記表達式。
instance of __EventFilter as $FILTER instance of NTEventLogEventConsumer as $CONSUMER
下列範例會使用別名將篩選系結至取用者。
instance of __FilterToConsumerBinding { Filter = $FILTER; Consumer = $CONSUMER; };
您可以將一個篩選系結至數個取用者,這表示發生比對事件時,必須採取數個動作:或者,您可以將一個取用者系結至數個篩選條件,這表示當符合其中一個篩選條件的事件發生時,必須採取動作。
下列動作是根據消費者和事件的情況而採取的:
- 如果其中一個永久取用者失敗,其他要求事件的取用者將會接收到通知。
- 如果事件被丟棄,WMI 會觸發 __EventDroppedEvent。
- 如果您訂閱此事件,它會返回丟棄的事件,而 __EventConsumer 的參考則代表失敗的取用者。
- 如果消費者失敗,WMI 會觸發 __ConsumerFailureEvent,其中可能包含在 ErrorCode、ErrorDescription 和 ErrorObject 屬性中的更多資訊。
如需詳細資訊,請參閱 將事件篩選與邏輯消費者系結。
例
下列範例顯示 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;
};
相關主題