Memantau Peristiwa
Administrator sistem dapat menggunakan WMI untuk memantau peristiwa di jaringan. Contohnya:
- Layanan berhenti secara tak terduga.
- Server menjadi tidak tersedia.
- Drive disk terisi hingga kapasitas 80%.
- Peristiwa keamanan dilaporkan ke Log Peristiwa NT.
WMI mendukung deteksi peristiwa dan pengiriman kepada konsumen peristiwa karena beberapa penyedia WMI adalah penyedia peristiwa. Untuk informasi selengkapnya, lihat Menerima Peristiwa WMI.
Konsumen peristiwa adalah aplikasi atau skrip yang meminta pemberitahuan peristiwa, lalu melakukan tugas saat peristiwa tertentu terjadi. Anda dapat membuat skrip pemantauan peristiwa atau aplikasi yang memantau sementara saat peristiwa terjadi. WMI juga menyediakan satu set penyedia peristiwa permanen yang telah diinstal sebelumnya dan kelas konsumen permanen yang memungkinkan Anda memantau peristiwa secara permanen. Untuk informasi selengkapnya, lihat Memantau dan Merespons Peristiwa dengan Konsumen Standar.
Bagian berikut dibahas dalam topik ini:
Menggunakan Konsumen Peristiwa Sementara
Konsumen peristiwa sementara adalah skrip atau aplikasi yang mengembalikan peristiwa yang cocok dengan kueri atau filter peristiwa. Kueri peristiwa sementara biasanya menggunakan IWbemServices::ExecNotificationQuery dalam aplikasi C++ atau SWbemServices.ExecNotificationQuery dalam skrip dan Visual Basic.
Kueri peristiwa meminta instans kelas peristiwa yang menentukan jenis peristiwa tertentu, seperti Win32_ProcessTrace atau RegistryKeyChangeEvent.
Contoh kode VBScript berikut meminta pemberitahuan saat instans Win32_ProcessTrace dibuat. Instans kelas ini dihasilkan ketika proses dimulai atau dihentikan.
Untuk menjalankan skrip, salin ke file bernama event.vbs dan gunakan baris perintah berikut: cscript event.vbs. Anda dapat melihat output dari skrip dengan memulai Notepad.exe atau proses lainnya. Skrip berhenti setelah lima proses dimulai atau dihentikan.
Skrip ini memanggil SWbemServices.ExecNotificationQuery, yang merupakan versi semisinkron dari metode ini. Lihat skrip berikutnya untuk contoh menyiapkan langganan peristiwa sementara asinkron dengan memanggil SWbemServices.ExecNotificationQueryAsync. Untuk informasi selengkapnya, lihat Memanggil Metode. Skrip memanggil SWbemEventSource.NextEvent untuk mendapatkan dan memproses setiap peristiwa saat tiba. Simpan skrip dalam file dengan ekstensi .vbs dan jalankan skrip pada baris perintah menggunakan 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
Konsumen peristiwa sementara harus dimulai secara manual dan tidak boleh bertahan di seluruh mulai ulang WMI atau menghidupkan ulang sistem operasi. Konsumen peristiwa sementara hanya dapat memproses peristiwa saat sedang berjalan.
Prosedur berikut menjelaskan cara membuat konsumen peristiwa sementara.
Untuk membuat konsumen peristiwa sementara
Tentukan bahasa pemrograman mana yang akan digunakan.
Bahasa pemrograman menentukan API yang akan digunakan.
- Untuk bahasa pemrograman C++, gunakan COM API untuk WMI.
- Untuk Visual Basic atau bahasa pembuatan skrip, gunakan Scripting API untuk WMI.
Mulai mengkoding aplikasi konsumen peristiwa sementara dengan cara yang sama seperti Anda memulai aplikasi WMI.
Langkah-langkah pertama pengkodan tergantung pada bahasa pemrograman. Biasanya, Anda masuk ke WMI dan menyiapkan pengaturan keamanan. Untuk informasi selengkapnya, lihat Membuat Aplikasi atau Skrip WMI.
Tentukan kueri peristiwa yang ingin Anda gunakan.
Untuk mendapatkan beberapa jenis data performa, Anda mungkin perlu menggunakan kelas yang disediakan oleh penyedia berperforma tinggi. Untuk informasi selengkapnya, lihat Memantau Data Performa, Menentukan Jenis Peristiwa yang Akan Diterima, dan Mengkueri dengan WQL.
Putuskan untuk melakukan panggilan asinkron atau panggilan semisinkron, dan pilih metode API.
Panggilan asinkron memungkinkan Anda menghindari overhead polling untuk data. Namun, panggilan semisinkron memberikan performa serupa dengan keamanan yang lebih besar. Untuk informasi selengkapnya, lihat Memanggil Metode.
Buat panggilan metode asinkron atau semisinkron dan sertakan kueri peristiwa sebagai parameter strQuery .
Untuk aplikasi C++, panggil metode berikut:
Untuk skrip, panggil metode berikut:
Tulis kode untuk memproses objek peristiwa yang dikembalikan.
Untuk kueri peristiwa asinkron, masukkan kode ke dalam berbagai metode atau peristiwa sink objek. Untuk kueri peristiwa semisinkron, setiap objek dikembalikan saat WMI mendapatkannya, sehingga kode harus berada di perulangan yang menangani setiap objek.
Contoh kode skrip berikut adalah versi asinkron dari skrip Win32_ProcessTrace . Karena operasi asinkron segera kembali, kotak dialog membuat skrip tetap aktif saat menunggu peristiwa.
Daripada memanggil SWbemEventSource.NextEvent untuk menerima setiap peristiwa, skrip memiliki penanganan aktivitas untuk peristiwa 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
Catatan
Panggilan balik asinkron seperti panggilan balik yang ditangani oleh SINK_OnObjectReady
subroutine, memungkinkan pengguna yang tidak terpahami untuk memberikan data ke sink. Untuk keamanan yang lebih baik, gunakan komunikasi semisinkron atau komunikasi sinkron. Untuk informasi selengkapnya, lihat topik berikut:
Menggunakan Konsumen Peristiwa Permanen
Konsumen peristiwa permanen berjalan sampai pendaftarannya dibatalkan secara eksplisit, lalu dimulai ketika WMI atau sistem dimulai ulang.
Konsumen peristiwa permanen adalah kombinasi kelas WMI, filter, dan objek COM pada sistem.
Daftar berikut mengidentifikasi bagian yang diperlukan untuk membuat konsumen peristiwa permanen:
- Objek COM yang berisi kode yang mengimplementasikan konsumen permanen.
- Kelas konsumen permanen baru.
- Instans kelas konsumen permanen.
- Filter yang berisi kueri untuk peristiwa.
- Tautan antara konsumen dan filter.
Untuk informasi selengkapnya, lihat Menerima Peristiwa Setiap Saat.
WMI memasok beberapa konsumen permanen. Kelas konsumen dan objek COM yang berisi kode telah diinstal sebelumnya. Misalnya, Anda dapat membuat dan mengonfigurasi instans kelas ActiveScriptEventConsumer untuk menjalankan skrip saat peristiwa terjadi. Untuk informasi selengkapnya, lihat Memantau dan Merespons Peristiwa dengan Konsumen Standar. Untuk contoh penggunaan ActiveScriptEventConsumer, lihat Menjalankan Skrip Berdasarkan Peristiwa.
Prosedur berikut menjelaskan cara membuat konsumen peristiwa permanen.
Untuk membuat konsumen peristiwa permanen
Daftarkan penyedia peristiwa dengan namespace layanan yang Anda gunakan.
Beberapa penyedia peristiwa hanya dapat menggunakan namespace layanan tertentu. Misalnya, __InstanceCreationEvent adalah peristiwa intrinsik yang didukung oleh penyedia Win32 dan terdaftar secara default dengan namespace \root\cimv2.
Catatan
Anda dapat menggunakan properti EventNamespacedari __EventFilter yang digunakan dalam pendaftaran untuk membuat langganan lintas namespace layanan. Untuk informasi selengkapnya, lihat Menerapkan Langganan Peristiwa Permanen Lintas Namespace.
Daftarkan penyedia konsumen peristiwa dengan namespace tempat kelas peristiwa berada.
WMI menggunakan penyedia konsumen peristiwa untuk menemukan konsumen peristiwa yang permanen. Konsumen peristiwa permanen adalah aplikasi yang dimulai WMI ketika suatu peristiwa diterima. Untuk mendaftarkan konsumen peristiwa, penyedia membuat instans __EventConsumerProviderRegistration.
Buat instans kelas yang mewakili konsumen peristiwa permanen yang ingin Anda gunakan.
Kelas konsumen peristiwa berasal dari __EventConsumer kelas. Atur properti yang diperlukan instans konsumen peristiwa.
Daftarkan konsumen dengan COM dengan menggunakan utilitas regsvr32 .
Buat instans __EventFilter kelas filter peristiwa.
Atur bidang yang diperlukan untuk instans filter peristiwa. Bidang yang diperlukan untuk __EventFilter adalah Nama, QueryLanguage, dan Kueri. Properti Nama dapat berupa nama unik apa pun untuk instans kelas ini. Properti QueryLanguage selalu diatur ke "WQL". Properti Kueri adalah string yang berisi kueri peristiwa. Peristiwa dihasilkan saat kueri konsumen peristiwa permanen gagal. Sumber peristiwa adalah WinMgmt, ID peristiwa adalah 10, dan jenis peristiwanya adalah Kesalahan.
Buat instans kelas __FilterToConsumerBinding untuk mengaitkan konsumen peristiwa logis dengan filter peristiwa.
WMI menggunakan asosiasi untuk menemukan konsumen peristiwa yang terkait dengan peristiwa yang cocok dengan kriteria yang ditentukan dalam filter peristiwa. WMI menggunakan penyedia konsumen peristiwa untuk menemukan aplikasi konsumen peristiwa permanen untuk memulai.