Bagikan melalui


Menerima Pemberitahuan Peristiwa Sinkron dan Semisinkron

Gunakan SWbemServices.ExecQuery untuk meminta semua peristiwa yang ada.

Contoh kode berikut menunjukkan cara mengkueri peristiwa dalam log.

Select * from Win32_NTLogEvent

Untuk informasi selengkapnya, lihat Menentukan Jenis Peristiwa yang Akan Diterima, Menerima Pemberitahuan Peristiwa, dan WQL (SQL untuk WMI).

Panggilan default ke SWbemServices.ExecNotificationQuery menggunakan komunikasi semisinkron. Parameter iflags memiliki bendera wbemFlagForwardOnly dan wbemFlagReturnImmediately yang ditetapkan secara default. Untuk informasi selengkapnya, lihat Memanggil Metode.

Prosedur berikut menjelaskan cara menerima pemberitahuan peristiwa semisinkron menggunakan VBScript.

Untuk menerima pemberitahuan peristiwa semisinkron di VBScript

  1. Buat kueri untuk jenis peristiwa yang ingin Anda terima. Untuk informasi selengkapnya, lihat Menentukan Jenis Peristiwa yang Akan Diterima.

  2. Jika Anda meminta jenis peristiwa instans seperti __InstanceCreationEvent, tunjukkan dalam kueri jenis instans target, misalnya, Win32_LogicalDisk.

  3. Jika perlu, tentukan instans, misalnya, nama namespace saat meminta instans __NamespaceModificationEvent di masa mendatang untuk namespace tertentu.

  4. Tentukan interval polling untuk Windows Management Instrumentation (WMI) dalam kueri, seperti "WITHIN 10"—untuk melakukan polling setiap 10 detik. Untuk informasi selengkapnya, lihat Klausul WITHIN.

  5. Panggil SWbemServices.ExecNotificationQuery menggunakan kueri.

  6. Ulangi koleksi yang Anda terima.

Contoh berikut menunjukkan cara memantau penyisipan dan penghapusan disk dari drive disket pada komputer lokal. Skrip meminta instans ___InstanceModificationEvent untuk instans Win32_LogicalDisk drive floppy dan polling setiap 10 detik untuk instans baru. Skrip ini adalah contoh konsumen peristiwa sementara, dan terus berjalan sampai dihentikan di Task Manager atau sistem di-boot ulang. Untuk informasi selengkapnya, lihat Menerima Peristiwa selama Durasi Aplikasi Anda.

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

Prosedur berikut menjelaskan cara menerima pemberitahuan peristiwa semisinkron menggunakan C++.

Untuk menerima pemberitahuan peristiwa semisinkron di C++

  1. Siapkan aplikasi dengan panggilan ke fungsi CoInitializeEx dan CoInitializeSecurity .

    Karena WMI berbasis COM, memanggil CoInitializeEx dan CoInitializeSecurity adalah langkah yang diperlukan untuk aplikasi WMI. Untuk informasi selengkapnya, lihat Membuat Aplikasi atau Skrip WMI.

  2. Tentukan jenis peristiwa yang ingin Anda terima.

    WMI mendukung peristiwa intrinsik dan ekstrinsik. Peristiwa intrinsik adalah peristiwa yang telah ditentukan sebelumnya oleh WMI. Peristiwa ekstrinsik adalah peristiwa yang ditentukan oleh penyedia pihak ketiga. Untuk informasi selengkapnya, lihat Menentukan Jenis Peristiwa yang Akan Diterima.

  3. Daftar untuk menerima kelas peristiwa tertentu dengan panggilan ke metode IWbemServices::ExecNotificationQuery .

    Buat setiap kueri sangat spesifik. Tujuan pendaftaran adalah untuk mendaftar hanya menerima pemberitahuan yang diperlukan. Pemberitahuan yang tidak diperlukan pemrosesan limbah dan waktu pengiriman.

    Anda dapat merancang konsumen peristiwa untuk menerima beberapa peristiwa. Misalnya, konsumen mungkin memerlukan pemberitahuan peristiwa modifikasi instans untuk kelas peristiwa pelanggaran perangkat dan keamanan tertentu. Dalam hal ini, tugas yang dilakukan konsumen saat menerima peristiwa modifikasi instans berbeda untuk dua peristiwa tersebut. Dengan demikian, konsumen harus melakukan satu panggilan ke IWbemServices::ExecNotificationQuery untuk mendaftar untuk peristiwa modifikasi instans, dan panggilan lain ke ExecNotificationQuery untuk mendaftar untuk peristiwa pelanggaran keamanan.

    Dalam panggilan ke ExecNotificationQuery, atur parameter lFlags ke WBEM_FLAG_RETURN_IMMEDIATELY dan WBEM_FLAG_FORWARD_ONLY. Bendera WBEM_FLAG_RETURN_IMMEDIATELY meminta pemrosesan semisinkron, dan bendera WBEM_FLAG_FORWARD_ONLY meminta enumerator hanya maju. Untuk informasi selengkapnya, lihat Memanggil Metode. Fungsi ExecNotificationQuery mengembalikan penunjuk ke antarmuka IEnumWbemClassObject .

  4. Polling untuk pemberitahuan peristiwa terdaftar dengan melakukan panggilan berulang ke metode IEnumWbemClassObject::Next .

  5. Setelah selesai, lepaskan enumerator yang menunjuk ke objek IEnumWbemClassObject .

    Anda dapat merilis pointer IWbemServices yang terkait dengan pendaftaran. Merilis pointer IWbemServices menyebabkan WMI berhenti mengirimkan peristiwa kepada semua konsumen sementara terkait.