Bagikan melalui


Layanan Interaktif

Biasanya, layanan adalah aplikasi konsol yang dirancang untuk berjalan tanpa pengawas tanpa antarmuka pengguna grafis (GUI). Namun, beberapa layanan mungkin memerlukan interaksi sesekali dengan pengguna. Halaman ini membahas cara terbaik untuk berinteraksi dengan pengguna dari layanan.

Penting

Layanan tidak dapat berinteraksi langsung dengan pengguna pada Windows Vista. Oleh karena itu, teknik yang disebutkan di bagian berjudul Menggunakan Layanan Interaktif tidak boleh digunakan dalam kode baru.

 

Berinteraksi dengan Pengguna dari Layanan Secara Tidak Langsung

Anda dapat menggunakan teknik berikut untuk berinteraksi dengan pengguna dari layanan di semua versi Windows yang didukung:

  • Tampilkan kotak dialog dalam sesi pengguna menggunakan fungsi WTSSendMessage .

  • Buat aplikasi GUI tersembunyi terpisah dan gunakan fungsi CreateProcessAsUser untuk menjalankan aplikasi dalam konteks pengguna interaktif. Rancang aplikasi GUI untuk berkomunikasi dengan layanan melalui beberapa metode komunikasi antarpemrosana (IPC), misalnya, pipa bernama. Layanan berkomunikasi dengan aplikasi GUI untuk memberi tahu kapan harus menampilkan GUI. Aplikasi mengkomunikasikan hasil interaksi pengguna kembali ke layanan sehingga layanan dapat mengambil tindakan yang sesuai. Perhatikan bahwa IPC dapat mengekspos antarmuka layanan Anda melalui jaringan kecuali Anda menggunakan daftar kontrol akses (ACL) yang sesuai.

    Jika layanan ini berjalan pada sistem multipengguna, tambahkan aplikasi ke kunci berikut sehingga dijalankan di setiap sesi: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Jika aplikasi menggunakan pipa bernama untuk IPC, server dapat membedakan antara beberapa proses pengguna dengan memberi setiap pipa nama unik berdasarkan ID sesi.

Teknik berikut ini juga tersedia untuk Windows Server 2003 dan Windows XP:

  • Tampilkan kotak pesan dengan memanggil fungsi MessageBox dengan MB_SERVICE_NOTIFICATION. Ini direkomendasikan untuk menampilkan pesan status sederhana. Jangan panggil MessageBox selama inisialisasi layanan atau dari rutinitas HandlerEx , kecuali Anda memanggilnya dari utas terpisah, sehingga Anda kembali ke SCM secara tepat waktu.

Menggunakan Layanan Interaktif

Secara default, layanan menggunakan stasiun jendela noninteraktif dan tidak dapat berinteraksi dengan pengguna. Namun, layanan interaktif dapat menampilkan antarmuka pengguna dan menerima input pengguna.

Perhatian

Layanan yang berjalan dalam konteks keamanan yang ditingkatkan, seperti akun LocalSystem, tidak boleh membuat jendela di desktop interaktif karena aplikasi lain yang berjalan di desktop interaktif dapat berinteraksi dengan jendela ini. Ini mengekspos layanan ke aplikasi apa pun yang dijalankan pengguna yang masuk. Selain itu, layanan yang berjalan sebagai LocalSystem tidak boleh mengakses desktop interaktif dengan memanggil fungsi OpenWindowStation atau GetThreadDesktop .

 

Untuk membuat layanan interaktif, lakukan hal berikut saat memanggil fungsi CreateService :

  1. Tentukan NULL untuk parameter lpServiceStartName untuk menjalankan layanan dalam konteks akun LocalSystem.
  2. Tentukan bendera SERVICE_INTERACTIVE_PROCESS .

Untuk menentukan apakah layanan berjalan sebagai layanan interaktif, panggil fungsi GetProcessWindowStation untuk mengambil handel ke stasiun jendela, dan fungsi GetUserObjectInformation untuk menguji apakah stasiun jendela memiliki atribut WSF_VISIBLE .

Namun, perhatikan bahwa kunci registri berikut berisi nilai, NoInteractiveServices, yang mengontrol efek SERVICE_INTERACTIVE_PROCESS:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

Nilai NoInteractiveServices default ke 1, yang berarti bahwa tidak ada layanan yang diizinkan untuk berjalan secara interaktif, terlepas dari apakah telah SERVICE_INTERACTIVE_PROCESS. Ketika NoInteractiveServices diatur ke 0, layanan dengan SERVICE_INTERACTIVE_PROCESS diizinkan untuk berjalan secara interaktif.

Windows 7, Windows Server 2008 R2, Windows XP, dan Windows Server 2003: Nilai NoInteractiveServices default ke 0, yang berarti bahwa layanan dengan SERVICE_INTERACTIVE_PROCESS diizinkan untuk berjalan secara interaktif. Ketika NoInteractiveServices diatur ke nilai bukan nol, tidak ada layanan yang dimulai setelahnya diizinkan untuk berjalan secara interaktif, terlepas dari apakah telah SERVICE_INTERACTIVE_PROCESS.

Penting

Semua layanan berjalan di Layanan Terminal sesi 0. Oleh karena itu, jika layanan interaktif menampilkan antarmuka pengguna, itu hanya terlihat oleh pengguna yang terhubung ke sesi 0. Karena tidak ada cara untuk menjamin bahwa pengguna interaktif terhubung ke sesi 0, jangan mengonfigurasi layanan untuk berjalan sebagai layanan interaktif di bawah Layanan Terminal atau pada sistem yang mendukung peralihan pengguna cepat (peralihan pengguna cepat diimplementasikan menggunakan Layanan Terminal).