Bagikan melalui


Peristiwa Pemicu Layanan

Layanan dapat mendaftar untuk dimulai atau dihentikan ketika peristiwa pemicu terjadi. Ini menghilangkan kebutuhan layanan untuk memulai ketika sistem dimulai, atau agar layanan melakukan polling atau secara aktif menunggu peristiwa; layanan dapat dimulai ketika diperlukan, alih-alih memulai secara otomatis apakah ada pekerjaan yang harus dilakukan atau tidak. Contoh peristiwa pemicu yang telah ditentukan sebelumnya termasuk kedatangan perangkat dari kelas antarmuka perangkat tertentu atau ketersediaan port firewall tertentu. Layanan juga dapat mendaftar untuk peristiwa pemicu kustom yang dihasilkan oleh penyedia Pelacakan Peristiwa untuk Windows (ETW).

Windows Server 2008, Windows Vista, Windows Server 2003 dan Windows XP: Peristiwa pemicu layanan tidak didukung sampai Windows Server 2008 R2 dan Windows 7.

Pemicu terdiri dari jenis peristiwa pemicu, subjenis peristiwa pemicu, tindakan yang akan diambil sebagai respons terhadap peristiwa pemicu, dan (untuk jenis peristiwa pemicu tertentu) satu atau beberapa item data khusus pemicu. Subjenis dan item data khusus pemicu bersama-sama menentukan kondisi untuk memberi tahu layanan peristiwa. Format item data bergantung pada jenis peristiwa pemicu; item data dapat berupa data biner, string, atau multistring. String harus Unicode; String ANSI tidak didukung.

Untuk mendaftar peristiwa pemicu, layanan memanggil ChangeServiceConfig2 dengan SERVICE_CONFIG_TRIGGER_INFO dan menyediakan struktur SERVICE_TRIGGER_INFO . Struktur SERVICE_TRIGGER_INFO menunjuk ke array struktur SERVICE_TRIGGER , masing-masing menentukan satu pemicu.

Tindakan pemicu yang ditentukan diambil jika kondisi pemicu benar ketika sistem dimulai, atau jika kondisi pemicu menjadi benar saat sistem berjalan. Misalnya, jika layanan mendaftar untuk dimulai ketika perangkat tertentu tersedia, layanan dimulai ketika sistem dimulai jika perangkat sudah dicolokkan ke komputer; layanan dimulai ketika perangkat tiba jika pengguna mencolokkan perangkat saat sistem berjalan.

Jika pemicu memiliki item data khusus pemicu, tindakan pemicu diambil hanya jika item data yang menyertai peristiwa pemicu cocok dengan salah satu item data yang ditentukan layanan dengan pemicu. Pencocokan data biner dilakukan dengan perbandingan bitwise. Pencocokan string tidak peka huruf besar/kecil. Jika item data adalah multistring, semua string dalam multistring harus cocok.

Ketika layanan dimulai sebagai respons terhadap peristiwa pemicu, layanan menerima SERVICE_TRIGGER_STARTED_ARGUMENT sebagai argv[1] dalam fungsi panggilan balik ServiceMain-nya . Argv[0] selalu merupakan nama pendek layanan.

Layanan yang mendaftar untuk dimulai sebagai respons terhadap peristiwa pemicu mungkin berhenti sendiri setelah batas waktu diam ketika layanan tidak memiliki pekerjaan yang harus dilakukan. Layanan yang berhenti itu sendiri harus siap untuk menangani permintaan kontrol SERVICE_CONTROL_TRIGGEREVENT yang tiba saat layanan berhenti sendiri. SCM mengirimkan permintaan kontrol SERVICE_CONTROL_TRIGGEREVENT setiap kali peristiwa pemicu baru terjadi saat layanan dalam status berjalan. Untuk menghindari kehilangan peristiwa pemicu, layanan harus mengembalikan ERROR_SHUTDOWN_IN_PROGRESS untuk setiap permintaan kontrol SERVICE_CONTROL_TRIGGEREVENT yang tiba saat layanan beralih dari berjalan ke dihentikan. Ini menginstruksikan SCM untuk mengantre memicu peristiwa dan menunggu layanan memasuki status berhenti. SCM kemudian mengambil tindakan yang terkait dengan peristiwa pemicu antrean, seperti memulai layanan.

Ketika layanan siap untuk menangani peristiwa pemicu lagi, layanan mengatur SERVICE_ACCEPT_TRIGGEREVENT dalam masker yang diterima kontrolnya dalam panggilan ke SetServiceStatus. Ini biasanya dilakukan ketika layanan memanggil SetServiceStatus dengan SERVICE_RUNNING. SCM kemudian mengeluarkan permintaan SERVICE_CONTROL_TRIGGEREVENT untuk setiap peristiwa pemicu yang diantrekan hingga antrean kosong.

Layanan yang memiliki layanan dependen yang berjalan tidak dapat dihentikan sebagai respons terhadap peristiwa pemicu.

Permintaan trigger-start dan trigger-stop tidak dijamin dalam kondisi memori rendah.

Gunakan fungsi QueryServiceConfig2 untuk mengambil konfigurasi peristiwa pemicu layanan.

Alat SC (sc.exe) dapat digunakan untuk mengonfigurasi atau mengkueri peristiwa pemicu layanan di prompt perintah. Gunakan opsi triggerinfo untuk mengonfigurasi layanan untuk memulai atau berhenti sebagai respons terhadap peristiwa pemicu. Gunakan opsi qtriggerinfo untuk mengkueri konfigurasi pemicu layanan.

Contoh berikut meminta konfigurasi pemicu layanan W32time, yang dikonfigurasi untuk memulai saat komputer bergabung ke domain dan berhenti saat komputer meninggalkan domain.

C:\>sc qtriggerinfo w32time
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: w32time

        START SERVICE
          DOMAIN JOINED STATUS         : 1ce20aba-9851-4421-9430-1ddeb766e809 [DOMAIN JOINED]
        STOP SERVICE
          DOMAIN JOINED STATUS         : ddaf516e-58c2-4866-9574-c3b615d42ea1 [NOT DOMAIN JOINED]

Contoh berikut mengkueri konfigurasi pemicu layanan input tablet, yang dikonfigurasi untuk memulai ketika perangkat HID dengan GUID {4d1e55b2-f16f-11cf-88cb-001111000030} dan salah satu ID perangkat HID yang ditentukan tiba.

C:\>sc qtriggerinfo tabletinputservice
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: tabletinputservice

        START SERVICE
          DEVICE INTERFACE ARRIVAL     : 4d1e55b2-f16f-11cf-88cb-001111000030 [INTERFACE CLASS GUID]
            DATA                       : HID_DEVICE_UP:000D_U:0001
            DATA                       : HID_DEVICE_UP:000D_U:0002
            DATA                       : HID_DEVICE_UP:000D_U:0003
            DATA                       : HID_DEVICE_UP:000D_U:0004