Share via


接收同步和半同步事件通知

使用 SWbemServices.ExecQuery 來要求所有現有的事件。

下列程式碼範例示範如何查詢記錄檔中的事件。

Select * from Win32_NTLogEvent

如需詳細資訊,請參閱 判斷要接收的事件種類接收事件通知,以及 WMI 的 WQL (SQL)

SWbemServices.ExecNotificationQuery的預設呼叫會使用半同步通訊。 iflags參數預設會設定wbemFlagForwardOnlywbemFlagReturnImmediately旗標。 如需詳細資訊,請參閱 呼叫方法

下列程式描述如何使用 VBScript 接收半同步事件通知。

在 VBScript 中接收半同步事件通知

  1. 針對您想要接收的事件種類建立查詢。 如需詳細資訊,請參閱 判斷要接收的事件種類

  2. 如果您要求實例類型的事件,例如 __InstanceCreationEvent,請在查詢中指出目標實例的類型,例如 Win32_LogicalDisk

  3. 如有必要,請指定 實例,例如,要求特定命名空間 的未來__NamespaceModificationEvent 實例時,命名空間的名稱。

  4. 在查詢中指定 Windows Management Instrumentation (WMI) 的輪詢間隔,例如「WITHIN 10」,每隔 10 秒輪詢一次。 如需詳細資訊,請參閱 WITHIN 子句

  5. 使用查詢呼叫 SWbemServices.ExecNotificationQuery

  6. 迴圈查看您收到的集合。

下列範例示範如何監視從本機電腦上的磁片磁碟機插入和移除磁片。 腳本會針對磁片磁碟機Win32_LogicalDisk實例要求 ___InstanceModificationEvent實例,並每隔 10 秒輪詢一次新的實例。 此腳本是暫存事件取用者的範例,會繼續執行,直到在工作管理員中停止或系統重新開機為止。 如需詳細資訊,請參閱 接收應用程式持續時間的事件

Const FLOPPY_DISK = 2
Set colMonitoredDisks = GetObject("Winmgmts:").ExecNotificationQuery _
    ("Select * from __InstanceModificationEvent within 10 WHERE " _
        & "TargetInstance ISA 'Win32_LogicalDisk'")
i = 0
Do While i = 0
    Set strDiskChange = colMonitoredDisks.NextEvent
    If strDiskChange.TargetInstance.DriveType = FLOPPY_DISK Then
        If strDiskChange.TargetInstance.Size > 0 Then
            Wscript.Echo "A disk has been inserted" & _
                " into the floppy drive."
    Else
            Wscript.Echo "A disk has been removed" & _
                " from the floppy drive."
        End If
    End If
Loop

下列程式描述如何使用 C++ 接收半同步事件通知。

若要在 C++ 中接收半同步事件通知

  1. 使用 對 CoInitializeExCoInitializeSecurity 函式的呼叫來設定應用程式。

    因為 WMI 是以 COM 為基礎,所以呼叫 CoInitializeExCoInitializeSecurity 是 WMI 應用程式的必要步驟。 如需詳細資訊,請參閱 建立 WMI 應用程式或腳本

  2. 決定您想要接收的事件種類。

    WMI 支援內建和外來事件。 內部事件是由 WMI 預先定義的事件。 extrinsic 事件是由協力廠商提供者所定義的事件。 如需詳細資訊,請參閱 判斷要接收的事件種類

  3. 註冊以接收具有 IWbemServices::ExecNotificationQuery 方法呼叫的特定事件類別。

    讓每個查詢都非常明確。 註冊的目標是只註冊以接收必要的通知。 不需要浪費處理和傳遞時間的通知。

    您可以設計事件取用者來接收多個事件。 例如,取用者可能需要通知特定類別的裝置和安全性違規事件實例修改事件。 在此情況下,取用者在接收實例修改事件時所執行的工作會針對這兩個事件而不同。 因此,取用者應該呼叫 IWbemServices::ExecNotificationQuery 來註冊實例修改事件,另一個呼叫 ExecNotificationQuery 以註冊安全性違規事件。

    對 ExecNotificationQuery的呼叫中,將 lFlags 參數設定為 WBEM_FLAG_RETURN_IMMEDIATELYWBEM_FLAG_FORWARD_ONLYWBEM_FLAG_RETURN_IMMEDIATELY旗標會要求半同步處理,而WBEM_FLAG_FORWARD_ONLY旗標要求順向列舉值。 如需詳細資訊,請參閱 呼叫方法ExecNotificationQuery 函式會傳回IEnumWbemClassObject介面的指標。

  4. IEnumWbemClassObject::Next 方法進行重複呼叫,以輪詢已註冊的事件通知。

  5. 完成後,釋放指向 IEnumWbemClassObject 物件的列舉值。

    您可以釋放與註冊相關聯的 IWbemServices 指標。 釋放 IWbemServices 指標會導致 WMI 停止將事件傳遞給所有相關聯的暫存取用者。