共用方式為


監視事件

系統管理員可以使用 WMI 來監視網路上的事件。 例如:

  • 服務意外停止。
  • 伺服器變得無法使用。
  • 磁碟驅動器的容量達到80%%。
  • 安全性事件會回報給NT事件記錄檔。

WMI 支援事件偵測和傳遞至事件取用者,因為某些 WMI 提供者是事件提供者。 如需詳細資訊,請參閱 接收 WMI 事件

事件取用者 是要求事件通知的應用程式或腳本,然後在發生特定事件時執行工作。 您可以建立事件監視文本或應用程式,以在事件發生時暫時監視。 WMI 也提供一組預安裝永久事件提供者和永久取用者類別,讓您能夠永久監視事件。 如需更多資訊,請參閱 使用標準消費者監控和回應事件

本主題將討論下列各節:

使用暫時事件消費者

臨時事件處理者是回傳符合事件查詢或篩選的事件的腳本或應用程式。 暫存事件查詢通常會在 C++ 應用程式中使用 IWbemServices::ExecNotificationQuery,或在腳本和 Visual Basic 中使用 SWbemServices.ExecNotificationQuery

事件查詢會要求事件類別的實例,指定特定類型的事件,例如 Win32_ProcessTraceRegistryKeyChangeEvent

下列 VBScript 程式代碼範例會在建立 Win32_ProcessTrace 實例時要求通知。 當進程啟動或停止時,就會產生這個類別的實例。

若要執行腳本,請將它複製到名為 event.vbs 的檔案,並使用下列命令行:cscript event.vbs。 您可以藉由啟動 Notepad.exe 或任何其他進程,來查看腳本的輸出。 腳本會在五個進程啟動或停止之後停止。

此腳本會呼叫 SWbemServices.ExecNotificationQuery,這是方法的 半異步 版本。 如需設定異步暫存事件訂閱的範例,請參閱下一個腳本,方法是呼叫 SWbemServices.ExecNotificationQueryAsync。 如需詳細資訊,請參閱 呼叫 方法。 腳本會呼叫 SWbemEventSource.NextEvent,以在每個事件到達的時候取得並處理它。 將腳本儲存在擴展名為 .vbs 的檔案中,並使用 CScript 在命令行上執行腳本:cscript file.vbs

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" _
    & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_ProcessTrace")

Wscript.Echo "Waiting for events ..."
i = 0
Do Until i=5
    Set objReceivedEvent = objEvents.NextEvent
    'report an event
    Wscript.Echo "Win32_ProcessTrace event occurred" & VBNewLine _
        & "Process Name = " _
            & objReceivedEvent.ProcessName & VBNewLine _
        & "Process ID = " _
            & objReceivedEvent.Processid & VBNewLine _
        & "Session ID = " & objReceivedEvent.SessionID 
i = i+ 1
Loop

暫時事件消費者必須手動啟動,且不得在WMI重新啟動或作業系統重新啟動之間持續。 暫存事件取用者只能在執行時處理事件。

下列程序說明如何建立臨時事件使用者。

建立暫時事件取用者

  1. 決定要使用的程式設計語言。

    程式設計語言會決定要使用的 API。

    • 針對C++程式設計語言,請使用適用於 WMI COM API。
    • 針對 Visual Basic 或腳本語言,請使用適用於 WMI 腳本 API。
  2. 開始撰寫暫存事件取用者應用程式程式代碼,就像您啟動WMI 應用程式一樣。

    程式代碼撰寫的第一個步驟取決於程式設計語言。 一般而言,您會登入 WMI 並設定安全性設定。 如需詳細資訊,請參閱 建立 WMI 應用程式或文稿

  3. 定義您想要使用的事件查詢。

    若要取得某些類型的效能數據,您可能需要使用高效能提供者所提供的類別。 如需詳細資訊,請參閱 監視效能數據判斷要接收的事件類型,以及使用 WQL 進行查詢。

  4. 決定進行異步呼叫或半異步呼叫,然後選擇 API 方法。

    異步呼叫可以讓您避免資料輪詢的額外負擔。 不過,半同步呼叫可提供更高的安全性效能。 如需詳細資訊,請參閱 呼叫 方法

  5. 進行異步或半異步方法呼叫,並包含事件查詢作為 strQuery 參數。

    針對C++應用程式,請呼叫下列方法:

    針對腳本,呼叫下列方法:

  6. 撰寫程式代碼來處理傳回的事件物件。

    針對異步事件查詢,請將程式代碼放入物件接收的各種方法或事件中。 對於半同步事件查詢,每個物件都會在WMI取得時傳回,因此程式碼應該放在每個物件處理的迴圈中。

下列腳本程式代碼範例是 Win32_ProcessTrace 腳本的異步版本。 因為非同步操作會立即返回,所以在等候事件時,對話框會讓腳本保持活躍。

與其叫用 SWbemEventSource.NextEvent 來接收每個事件,腳本選擇使用具有 SWbemSink OnObjectReady 事件的事件處理程式。

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & _
    strComputer & "\root\CIMV2") 
Set EventSink = WScript.CreateObject( _
    "WbemScripting.SWbemSink","SINK_")

objWMIservice.ExecNotificationQueryAsync EventSink, _
    "SELECT * FROM Win32_ProcessTrace WITHIN 10"
WScript.Echo "Waiting for events..."

i = 0
While (True)
    Wscript.Sleep(1000)
Wend

Sub SINK_OnObjectReady(objObject, objAsyncContext)
    Wscript.Echo "Win32_ProcessTrace event has occurred."
    i = i+1
    If i = 3 Then WScript.Quit 0 
End Sub

注意

異步回呼,例如由 SINK_OnObjectReady 子程式處理的回呼,允許未經驗證的使用者將數據提供給匯流排。 為了獲得更好的安全性,請使用半同步通訊或同步通訊。 如需詳細資訊,請參閱下列主題:

 

使用永久事件消費者

永久事件取用者會執行,直到其註冊明確取消為止,然後在 WMI 或系統重新啟動時啟動。

永久事件取用者是系統上 WMI 類別、篩選和 COM 物件的組合。

下列清單會識別建立永久事件取用者所需的元件:

  • COM物件,包含實作永久取用者的程序代碼。
  • 新的永久消費者類別。
  • 永久使用者類別的實例。
  • 包含事件查詢的過濾器。
  • 消費者與篩選器之間的連結。

如需詳細資訊,請參閱 隨時接收事件

WMI 提供數個永久使用者。 已預安裝包含程式代碼的取用者類別和 COM 物件。 例如,您可以建立及設定 ActiveScriptEventConsumer 類別的實例,以在事件發生時執行腳本。 如需詳細資訊,請參閱 標準消費者監視和回應事件。 如需使用 ActiveScriptEventConsumer的範例,請參閱 根據事件執行腳本。

下列程序說明如何建立永久事件接受者。

建立永久事件消費者

  1. 向您使用的命名空間註冊事件提供者

    某些事件提供者只能使用特定命名空間。 例如,__InstanceCreationEventWin32 提供者 支援的內建事件,且預設會向 \root\cimv2 命名空間註冊。

    注意事項

    您可以使用註冊中用來建立跨命名空間訂閲的 __EventFilterEventNamespace 屬性。 如需詳細資訊,請參閱 實作跨命名空間永久事件訂閱

     

  2. 將事件取用者提供者 註冊到事件類別所在的命名空間中。

    WMI 會使用事件消費者提供者來尋找永久的事件消費者。 永久事件取用者是接收事件時 WMI 啟動的應用程式。 若要註冊事件消費者,提供者會建立 __EventConsumerProviderRegistration實例。

  3. 建立 類別的實例,代表您想要使用的永久事件取用者。

    事件取用者類別衍生自 類別 __EventConsumer。 設定事件消費者實例所需的屬性。

  4. 使用 regsvr32 公用程式向 COM 註冊消費者。

  5. __EventFilter建立事件篩選類別的實例。

    設定事件篩選實例的必要欄位。 __EventFilter 的必要欄位為 NameQueryLanguageQueryName 屬性可以是這個類別實例的任何唯一名稱。 QueryLanguage 屬性一律設定為 “WQL”。 Query 屬性是包含事件查詢的字串。 當永久事件取用者的查詢失敗時,就會產生事件。 事件的來源為 WinMgmt、事件標識碼為 10,而事件類型為 Error。

  6. 建立 __FilterToConsumerBinding 類別的實例,以將邏輯事件取用者與事件篩選產生關聯。

    WMI 會使用關聯來尋找與事件相關聯的事件取用者,該事件符合事件篩選中指定的準則。 WMI 會使用事件取用者提供者來尋找要啟動的永久事件取用者應用程式。