Bagikan melalui


Menerima Acara WMI

WMI berisi infrastruktur peristiwa yang menghasilkan pemberitahuan tentang perubahan data dan layanan WMI. WMI kelas peristiwa memberikan pemberitahuan saat peristiwa tertentu terjadi.

Bagian berikut dibahas dalam topik ini:

Kueri Peristiwa

Anda dapat membuat kueri semisinkron atau asinkron untuk memantau perubahan pada log peristiwa, pembuatan proses, status layanan, ketersediaan komputer atau ruang kosong drive disk, dan entitas atau peristiwa lainnya. Dalam pembuatan skrip, metode SWbemServices.ExecNotificationQuery digunakan untuk berlangganan peristiwa. Di C++, IWbemServices::ExecNotificationQuery digunakan. Untuk informasi selengkapnya, lihat Memanggil Metode.

Pemberitahuan perubahan model data WMI standar disebut peristiwa intrinsik . __InstanceCreationEvent atau __NamespaceDeletionEvent adalah contoh peristiwa intrinsik. Pemberitahuan perubahan yang dilakukan penyedia untuk mendefinisikan sebuah peristiwa penyedia disebut peristiwa ekstrinsik . Misalnya, Penyedia Registri Sistem , Penyedia Power Management Event , dan Penyedia Win32 menentukan peristiwa mereka sendiri. Untuk informasi selengkapnya, lihat Menentukan Jenis Peristiwa untuk Menerima.

Contoh

Contoh kode skrip berikut adalah kueri untuk __InstanceCreationEvent intrinsik dari kelas peristiwa Win32_NTLogEvent . Anda dapat menjalankan program ini di latar belakang dan ketika ada peristiwa, pesan akan muncul. Jika Anda menutup kotak dialog Menunggu peristiwa, program berhenti menunggu acara. Ketahuilah bahwa SeSecurityPrivilege harus diaktifkan.

Sub SINK_OnObjectReady(objObject, objAsyncContext)
    WScript.Echo (objObject.TargetInstance.Message)
End Sub

Set objWMIServices = GetObject( _
    "WinMgmts:{impersonationLevel=impersonate, (security)}") 

' Create the event sink object that receives the events
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
 
' Set up the event selection. SINK_OnObjectReady is called when
' a Win32_NTLogEvent event occurs
objWMIServices.ExecNotificationQueryAsync sink,"SELECT * FROM __InstanceCreationEvent " & "WHERE TargetInstance ISA 'Win32_NTLogEvent' "

WScript.Echo "Waiting for events"

# Define event Query
$query = "SELECT * FROM __InstanceCreationEvent 
          WHERE TargetInstance ISA 'Win32_NTLogEvent' "

<# Register for event - also specify an action that
displays the log event when the event fires.#>

Register-WmiEvent -Source Demo1 -Query $query -Action {
                Write-Host "Log Event occured"
                $global:myevent = $event
                Write-Host "EVENT MESSAGE"
                Write-Host $event.SourceEventArgs.NewEvent.TargetInstance.Message}
<# So wait #>
"Waiting for events"

Contoh kode VBScript berikut menunjukkan peristiwa ekstrinsik __RegistryValueChangeEvent yang ditentukan penyedia registri. Skrip ini membuat konsumen sementara dengan menggunakan panggilan ke SWbemServices.ExecNotificationQueryAsync, dan hanya menerima event saat skrip berjalan. Skrip berikut berjalan tanpa batas waktu sampai komputer di-boot ulang, WMI dihentikan, atau skrip dihentikan. Untuk menghentikan skrip secara manual, gunakan Task Manager untuk menghentikan proses. Untuk menghentikannya secara terprogram, gunakan metode Hentikan di kelas Win32_Process. Untuk informasi selengkapnya, lihat Pengaturan Keamanan pada Panggilan Asinkron.

strComputer = "."

Set objWMIServices=GetObject( _
    "winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default")

set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")


objWMIServices.ExecNotificationQueryAsync objSink, _
    "Select * from RegistryValueChangeEvent Where Hive = 'HKEY_LOCAL_MACHINE' and KeyPath = 'SYSTEM\\ControlSet001\\Control' and ValueName = 'CurrentUser'"

WScript.Echo "Waiting for events..."

While (True) 
     WScript.Sleep (1000)
Wend

 
WScript.Echo "Listening for Registry Change Events..." & vbCrLf 

While(True) 
    WScript.Sleep 1000 
Wend 

Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext) 
    WScript.Echo "Received Registry Value Change Event" & vbCrLf & wmiObject.GetObjectText_() 
End Sub

Pengguna Peristiwa

Anda dapat memantau atau mengonsumsi peristiwa menggunakan konsumen berikut saat skrip atau aplikasi sedang dijalankan.

  • Konsumen acara sementara

    konsumen sementara adalah aplikasi klien WMI yang menerima peristiwa WMI. WMI menyertakan antarmuka unik yang digunakan untuk menentukan peristiwa yang akan dikirim WMI ke aplikasi klien. Pengguna acara sementara disebut sementara karena hanya berfungsi ketika dimuat secara khusus oleh pengguna. Untuk informasi selengkapnya, lihat Menerima Peristiwa selama Durasi Aplikasi Anda.

  • Konsumen acara tetap

    konsumen permanen adalah objek COM yang dapat menerima event WMI setiap saat. Konsumen peristiwa permanen menggunakan sekumpulan objek dan filter persisten untuk menangkap peristiwa WMI. Seperti halnya konsumen sementara untuk suatu peristiwa, Anda mengatur sejumlah objek dan filter WMI yang menangkap peristiwa WMI. Ketika peristiwa terjadi yang cocok dengan filter, WMI memuat konsumen peristiwa permanen dan memberitahukan tentang peristiwa tersebut. Karena konsumen permanen diimplementasikan dalam repositori WMI dan merupakan file yang dapat dieksekusi yang terdaftar di WMI, konsumen peristiwa permanen akan tetap beroperasi dan menerima peristiwa setelah dibuat, bahkan setelah sistem operasi di-reboot, selama WMI berjalan. Untuk informasi selengkapnya, lihat Menerima Peristiwa di All Times.

Skrip atau aplikasi yang menerima peristiwa memiliki pertimbangan keamanan khusus. Untuk informasi selengkapnya, lihat Mengamankan Acara WMI.

Aplikasi atau skrip dapat menggunakan penyedia peristiwa WMI bawaan yang menyediakan kelas konsumen standar. Setiap kelas konsumen standar merespons peristiwa dengan tindakan yang berbeda dengan mengirim pesan email atau menjalankan skrip. Anda tidak perlu menulis kode penyedia untuk menggunakan kelas konsumen standar untuk membuat konsumen event permanen. Untuk informasi selengkapnya, lihat Memantau dan Merespons Peristiwa dengan Konsumen Standar.

Menyelenggarakan Acara

Penyedia peristiwa adalah komponen COM yang mengirim peristiwa ke WMI. Anda dapat membuat penyedia acara untuk mengirim peristiwa di aplikasi C++ atau C#. Sebagian besar penyedia peristiwa mengelola objek untuk WMI, misalnya, item aplikasi atau perangkat keras. Untuk informasi selengkapnya, lihat Menulis Penyedia Peristiwa.

Peristiwa berwaktu atau berulang adalah peristiwa yang terjadi pada waktu yang telah ditentukan.

WMI menyediakan cara berikut untuk membuat peristiwa berwaktu atau berulang untuk aplikasi Anda:

  • Infrastruktur acara standar Microsoft.
  • Kelas timer khusus.

Untuk informasi selengkapnya, lihat Menerima Peristiwa Terjadwal atau Berulang. Saat Anda menulis penyedia acara, pertimbangkan informasi keamanan yang disebutkan di Menyediakan Acara dengan Aman.

Disarankan agar langganan acara permanen dikompilasi ke dalam namespace \rboot\subscription. Untuk informasi selengkapnya, lihat Menerapkan Langganan Acara Permanen Lintas Namespace.

Kuota Langganan

Pemantauan kejadian dapat menurunkan kinerja bagi penyedia yang mendukung kueri atas kumpulan data yang sangat besar. Selain itu, setiap pengguna yang memiliki akses baca ke namespace yang memiliki penyedia dinamis dapat melakukan serangan penolakan layanan (DoS). WMI mempertahankan kuota untuk semua pengguna secara keseluruhan dan untuk setiap penerima kejadian dalam satu instans __ArbitratorConfiguration yang terletak di namespace \rroot. Kuota ini bersifat global, bukan diterapkan untuk setiap namespace secara individual. Anda tidak dapat mengubah kuota.

WMI saat ini memberlakukan kuota menggunakan properti __ArbitratorConfiguration. Setiap kuota memiliki versi per pengguna dan versi keseluruhan yang mencakup semua pengguna yang digabungkan, bukan per namespace. Tabel berikut mencantumkan kuota yang berlaku untuk properti __ArbitratorConfiguration.

Total/Per Pengguna Kuota
TotalLanggananSementara
LanggananSementaraPerPengguna
10.000
1,000
TotalLanggananPermanen
LanggananPermanenPerPengguna
10.000
1,000
TotalInstruksiPemungutanSuara
PetunjukPollingUntukSetiapPengguna
10.000
1,000
TotalMemoriJajakPendapat
PollingMemoryPerUser
10.000.000 (0x989680) byte
5.000.000 (0x4CB40) byte

Administrator atau pengguna dengan izin FULL_WRITE di namespace dapat memodifikasi instans singleton __ArbitratorConfiguration. WMI melacak kuota per pengguna.

Menggunakan WMI