Memantau dan Merespons Peristiwa dengan Konsumen Standar

Anda dapat menggunakan kelas konsumen standar yang diinstal untuk melakukan tindakan berdasarkan peristiwa dalam sistem operasi. Konsumen standar adalah kelas sederhana yang sudah terdaftar, dan mereka menentukan kelas konsumen permanen. Setiap konsumen standar mengambil tindakan tertentu setelah menerima pemberitahuan peristiwa. Misalnya, Anda dapat menentukan instans ActiveScriptEventConsumer untuk menjalankan skrip saat ruang disk kosong di komputer berbeda dari ukuran yang ditentukan.

WMI mengkompilasi konsumen standar ke dalam namespace default yang bergantung pada sistem operasi, misalnya:

  • Di Windows Server 2003, semua konsumen standar dikompilasi secara default ke dalam namespace "Root\Subscription".

Catatan

Untuk namespace dan sistem operasi default yang khusus untuk setiap kelas WMI, lihat bagian Keterangan dan Persyaratan dari setiap topik kelas.

 

Tabel berikut mencantumkan dan menjelaskan konsumen standar WMI.

Konsumen standar Deskripsi
ActiveScriptEventConsumer Menjalankan skrip saat menerima pemberitahuan peristiwa. Untuk informasi selengkapnya, lihat Menjalankan Skrip Berdasarkan Peristiwa.
LogFileEventConsumer Menulis string yang disesuaikan ke file log teks saat menerima pemberitahuan peristiwa. Untuk informasi selengkapnya, lihat Menulis ke File Log Berdasarkan Peristiwa.
NTEventLogEventConsumer Mencatat pesan tertentu ke log peristiwa Aplikasi. Untuk informasi selengkapnya, lihat Pengelogan ke Log Peristiwa NT Berdasarkan Peristiwa.
SMTPEventConsumer Mengirim pesan email dengan menggunakan SMTP setiap kali peristiwa dikirimkan ke dalamnya. Untuk informasi selengkapnya, lihat Mengirim Email Berdasarkan Peristiwa.
CommandLineEventConsumer Meluncurkan proses saat peristiwa dikirimkan ke sistem lokal. File yang dapat dieksekusi harus berada di lokasi yang aman, atau diamankan dengan daftar kontrol akses (ACL) yang kuat untuk mencegah pengguna yang tidak sah mengganti executable Anda dengan executable yang berbeda. Untuk informasi selengkapnya, lihat Menjalankan Program dari Baris Perintah Berdasarkan Peristiwa.

 

Prosedur berikut menjelaskan cara memantau dan merespons peristiwa dengan menggunakan konsumen standar. Perhatikan bahwa prosedurnya sama untuk file, skrip, atau aplikasi Managed Object Format (MOF).

Untuk memantau dan menanggapi peristiwa dengan konsumen standar

  1. Tentukan namespace dalam file MOF dengan menggunakan perintah prapemroseksi MOF #pragma namespace layanan. Dalam skrip atau aplikasi, tentukan namespace dalam kode yang tersambung ke WMI.

    Contoh kode MOF berikut menunjukkan cara menentukan namespace layanan root\subscription.

    #pragma namespace ("\\\\.\\root\\subscription")
    

    Sebagian besar peristiwa intrinsik dikaitkan dengan perubahan pada instans kelas di namespace root\cimv2. Namun, peristiwa registri seperti RegistryKeyChangeEvent diaktifkan di namespace root\default oleh Penyedia Registri Sistem.

    Konsumen dapat menyertakan kelas peristiwa yang terletak di namespace layanan lain dengan menentukan namespace layanan di properti EventNamespace di kueri __EventFilter untuk peristiwa. Kelas peristiwa intrinsik , seperti __InstanceOperationEvent tersedia di setiap namespace layanan.

  2. Membuat dan mengisi instans kelas konsumen standar.

    Instans ini mungkin memiliki nilai unik di properti Nama . Anda dapat memperbarui konsumen yang ada dengan menggunakan kembali nama yang sama.

    InsertionStringTemplates berisi teks yang akan disisipkan dalam peristiwa yang Anda tentukan di EventType. Anda dapat menggunakan string harfiah atau merujuk langsung ke properti . Untuk informasi selengkapnya, lihat Menggunakan Templat String Standar dan Pernyataan SELECT untuk Kueri Peristiwa.

    Gunakan sumber yang ada untuk log peristiwa yang mendukung string penyisipan tanpa teks terkait.

    Contoh kode MOF berikut menunjukkan cara menggunakan sumber WSH yang ada dan nilai EventID 8.

    instance of NTEventLogEventConsumer as $Consumer
    {
        Name = "RunKeyEventlogConsumer";
        SourceName = "WSH";               
        EventID = 8;
        // Warning                              
        EventType = 2;
        // One string supplies the entire message          
        NumberOfInsertionStrings = 1;             
        // the %Hive% and %KeyPath% are properties of
        // the RegistryKeyChangeEvent instance 
        InsertionStringTemplates = 
            {"The key %Hive%\\%RootPath% has been modified."
            "Check if the change is intentional"};
    };
    
  3. Buat instans __EventFilter dan tentukan kueri untuk peristiwa.

    Dalam contoh berikut, filter memantau kunci registri tempat program startup terdaftar. Memantau kunci registri ini mungkin penting karena program yang tidak sah dapat mendaftarkan dirinya di bawah kunci, yang menyebabkannya diluncurkan ketika komputer boot.

    instance of __EventFilter as $Filter
    {
    Name = "RunKeyFilter";
    QueryLanguage = "WQL"; 
    Query = "Select * from RegistryTreeChangeEvent"
        " where (Hive = \"HKEY_LOCAL_MACHINE\" and "
        "RootPath = \"Software\\\\Microsoft\\\\Windows"
        "\\\\CurrentVersion\\\\Run\")";
    
    // RegistryTreeChangeEvents only fire in root\default namespace
    EventNamespace = "root\\default";                       
    };
    
  4. Identifikasi peristiwa untuk memantau dan membuat kueri peristiwa.

    Anda dapat memeriksa untuk melihat apakah ada peristiwa intrinsik atau ekstrinsik yang digunakan. Misalnya, gunakan kelas RegistryTreeChangeEvent dari penyedia Registri untuk memantau perubahan pada registri sistem.

    Jika kelas tidak ada yang menjelaskan peristiwa yang perlu Anda pantau, Anda harus membuat penyedia peristiwa Anda sendiri, dan menentukan kelas peristiwa ekstrinsik baru. Untuk informasi selengkapnya, lihat Menulis Penyedia Acara.

    Dalam file MOF, Anda dapat menentukan alias untuk filter dan konsumen, yang menyediakan cara mudah untuk menggambarkan jalur instans.

    Contoh berikut menunjukkan cara menentukan alias untuk filter dan konsumen.

    instance of __EventFilter as $FILTER
    instance of LogFileEventConsumer as $CONSUMER
    
  5. Buat instans __FilterToConsumerBinding untuk mengaitkan filter dan kelas konsumen. Instans ini menentukan bahwa ketika peristiwa terjadi yang cocok dengan filter yang ditentukan, tindakan yang ditentukan oleh konsumen harus terjadi. __EventFilter, __EventConsumer, dan __FilterToConsumerBinding harus memiliki pengidentifikasi keamanan individu (SID) yang sama di properti CreatorSID . Untuk informasi selengkapnya, lihat Mengikat Filter Peristiwa dengan Konsumen Logis.

    Contoh berikut menunjukkan cara mengidentifikasi instans berdasarkan jalur objek, atau menggunakan alias sebagai ekspresi singkat untuk jalur objek.

    instance of __EventFilter as $FILTER
    instance of NTEventLogEventConsumer as $CONSUMER
    

    Contoh berikut mengikat filter ke konsumen dengan menggunakan alias.

    instance of __FilterToConsumerBinding
    {
        Filter = $FILTER;
        Consumer = $CONSUMER;
    
    };
    

    Anda dapat mengikat satu filter ke beberapa konsumen, yang menunjukkan bahwa ketika peristiwa yang cocok terjadi, beberapa tindakan harus diambil; atau Anda dapat mengikat satu konsumen ke beberapa filter, yang menunjukkan bahwa tindakan harus diambil ketika peristiwa yang cocok dengan salah satu filter terjadi.

    Tindakan berikut diambil berdasarkan kondisi konsumen dan peristiwa:

    • Jika salah satu konsumen permanen gagal, konsumen lain yang meminta acara menerima pemberitahuan.
    • Jika suatu peristiwa dihilangkan, WMI akan menembakkan __EventDroppedEvent.
    • Jika Anda berlangganan peristiwa ini, peristiwa tersebut mengembalikan peristiwa yang dihilangkan, dan referensi ke __EventConsumer mewakili konsumen yang gagal.
    • Jika konsumen gagal, WMI mengaktifkan __ConsumerFailureEvent, yang mungkin berisi informasi lebih lanjut di properti ErrorCode, ErrorDescription , dan ErrorObject .

    Untuk informasi selengkapnya, lihat Mengikat Filter Peristiwa dengan Konsumen Logis.

Contoh

Contoh berikut menunjukkan MOF untuk instans NTEventLogEventConsumer. Setelah Anda mengkompilasi MOF ini, setiap upaya untuk membuat, menghapus, atau memodifikasi nilai di jalur Registri HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows\CurrentVersion\Run mencatat entri di eventlog Aplikasi, di bawah sumber "WSH".

#pragma namespace ("\\\\.\\root\\subscription")
 
instance of __EventFilter as $Filter
{
    Name = "RunKeyFilter";
    QueryLanguage = "WQL";
    Query = "Select * from RegistryTreeChangeEvent"
            " where (Hive = \"HKEY_LOCAL_MACHINE\" and "
            "KeyPath = \"Software\\\\Microsoft\\\\Windows"
            "\\\\CurrentVersion\\\\Run\")";

    // RegistryTreeChangeEvents only fire
    // in root\default namespace
    EventNamespace = "root\\default";   
};
 
instance of NTEventLogEventConsumer as $Consumer
{
    Name = "RunKeyEventlogConsumer";
    SourceName = "WSH";               
    EventID = 8;
    EventType = 2;                            // Warning
    Category = 0;
    NumberOfInsertionStrings = 1;

    // the %Hive% and %KeyPath% are properties
    // of the RegistryKeyChangeEvent instance 
    InsertionStringTemplates = {"The key %Hive%\\%RootPath% "
        "has been modified. Check if the change is intentional"};
};
 

// Bind the filter to the consumer
instance of __FilterToConsumerBinding
{
    Filter = $Filter;
    Consumer = $Consumer;
};

Menerima Peristiwa Dengan Aman