Menerima Acara WMI

WMI berisi infrastruktur peristiwa yang menghasilkan pemberitahuan tentang perubahan data dan layanan WMI. Kelas peristiwa WMI 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 tentang perubahan yang dilakukan penyedia untuk menentukan peristiwa penyedia disebut peristiwa ekstrinsik. Misalnya, Penyedia Registri Sistem, Penyedia Peristiwa Manajemen Daya, dan Penyedia Win32 menentukan peristiwa mereka sendiri. Untuk informasi selengkapnya, lihat Menentukan Jenis Peristiwa yang Akan Diterima.

Contoh

Contoh kode skrip berikut adalah kueri untuk __InstanceCreationEvent intrinsik dari Win32_NTLogEvent kelas peristiwa. Anda dapat menjalankan program ini di latar belakang dan ketika ada kejadian, pesan akan muncul. Jika Anda menutup kotak dialog Menunggu acara , 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 membuat konsumen sementara dengan menggunakan panggilan ke SWbemServices.ExecNotificationQueryAsync, dan hanya menerima peristiwa 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 Mengatur 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

Konsumen Peristiwa

Anda dapat memantau atau menggunakan peristiwa menggunakan konsumen berikut saat skrip atau aplikasi sedang berjalan:

  • 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. Konsumen peristiwa sementara dianggap sementara karena hanya berfungsi ketika dimuat secara khusus oleh pengguna. Untuk informasi selengkapnya, lihat Menerima Peristiwa selama Durasi Aplikasi Anda.

  • Konsumen peristiwa permanen

    Konsumen permanen adalah objek COM yang dapat menerima peristiwa WMI setiap saat. Konsumen peristiwa permanen menggunakan sekumpulan objek dan filter persisten untuk mengambil peristiwa WMI. Seperti konsumen peristiwa sementara, Anda menyiapkan serangkaian objek dan filter WMI yang menangkap peristiwa WMI. Ketika peristiwa terjadi yang cocok dengan filter, WMI memuat konsumen peristiwa permanen dan memberi tahunya tentang peristiwa tersebut. Karena konsumen permanen diimplementasikan di repositori WMI dan merupakan file yang dapat dieksekusi yang terdaftar di WMI, konsumen peristiwa permanen beroperasi dan menerima peristiwa setelah dibuat dan bahkan setelah boot ulang sistem operasi selama WMI berjalan. Untuk informasi selengkapnya, lihat Menerima Peristiwa di Semua Waktu.

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

Aplikasi atau skrip dapat menggunakan penyedia peristiwa WMI bawaan yang memasok 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 peristiwa permanen. Untuk informasi selengkapnya, lihat Memantau dan Merespons Peristiwa dengan Konsumen Standar.

Menyediakan Peristiwa

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 Acara.

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 peristiwa Microsoft standar.
  • Kelas timer khusus.

Untuk informasi selengkapnya, lihat Menerima Peristiwa Berwakta atau Berulang. Saat Anda menulis penyedia peristiwa, pertimbangkan informasi keamanan yang diidentifikasi dalam Menyediakan Peristiwa Dengan Aman.

Disarankan agar langganan peristiwa permanen dikompilasi ke dalam namespace \root\subscription. Untuk informasi selengkapnya, lihat Menerapkan Langganan Peristiwa Permanen Lintas Namespace.

Kuota Langganan

Polling untuk peristiwa dapat menurunkan performa untuk penyedia yang mendukung kueri melalui himpunan data besar. Selain itu, setiap pengguna yang memiliki akses baca ke namespace layanan dengan penyedia dinamis dapat melakukan serangan penolakan layanan (DoS). WMI mempertahankan kuota untuk semua pengguna yang digabungkan dan untuk setiap konsumen peristiwa dalam satu instans __ArbitratorConfiguration yang terletak di namespace layanan \root. Kuota ini bersifat global daripada untuk setiap namespace layanan. Anda tidak dapat mengubah kuota.

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

Total/PerUser Kuota
TemporarySubscriptionsTotal
TemporarySubscriptionsPerUser
10.000
1\.000
PermanentSubscriptionsTotal
PermanentSubscriptionsPerUser
10.000
1\.000
PollingInstructionsTotal
PollingInstructionsPerUser
10.000
1\.000
PollingMemoryTotal
PollingMemoryPerUser
10.000.000 (0x989680) byte
5.000.000 (0x4CB40) byte

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

Menggunakan WMI