Di bawah pengguna apa layanan dimulai di windows. Layanan Windows. Apa itu layanan

Mode pengoperasian

Dalam kebanyakan kasus, layanan dilarang berinteraksi dengan konsol atau desktop pengguna (baik lokal maupun jarak jauh), namun, untuk beberapa layanan, pengecualian dimungkinkan - interaksi dengan konsol (nomor sesi 0, di mana pengguna masuk secara lokal atau ketika layanan dimulai mstsc dengan tombol /console).

Ada beberapa mode untuk layanan:

  • dilarang diluncurkan;
  • mulai manual (berdasarkan permintaan);
  • mulai otomatis saat komputer melakukan booting;
  • mulai otomatis (tertunda) (diperkenalkan pada Windows Vista dan Windows Server 2008);
  • layanan/driver yang diperlukan (mulai otomatis dan ketidakmampuan (untuk pengguna) untuk menghentikan layanan).

Modus latar belakang

Memulai, menghentikan, dan mengubah layanan Windows

Layanan dan atributnya dapat diubah di MMC:

Dalam berbagai versi sistem operasi Beberapa layanan mungkin ada dan yang lainnya tidak. Beberapa aplikasi dan program yang diinstal secara terpisah juga dapat membuat layanannya sendiri.

Daftar layanan sistem operasi Microsoft Windows

Nama tampilan Nama layanan Fungsi Keterangan
klien DHCP dhcp Daftarkan dan perbarui alamat IP dan data DNS untuk komputer ini. Jika layanan ini dihentikan, komputer ini tidak akan dapat memperoleh alamat IP dinamis dan melakukan pembaruan DNS.
klien DNS dnscache Layanan klien DNS (dnscache) menyimpan nama DNS (Sistem Nama Domain) dan mendaftarkan nama yang sepenuhnya memenuhi syarat komputer ini. Jika layanan dihentikan, resolusi nama DNS akan dilanjutkan. Namun, hasil antrian nama DNS tidak akan di-cache dan nama komputer tidak akan didaftarkan.
KtmRm untuk koordinator transaksi terdistribusi KtmRm Mengkoordinasikan transaksi antara MSDTC dan Kernel Transaction Manager (KTM).
ReadyBoost EMDMgmt ReadyBoost Dukungan untuk meningkatkan performa sistem dengan teknologi ReadyBoost.
Superfetch SysMain Superfetch Mempertahankan dan meningkatkan kinerja sistem.
Audio Windows Audiosrv Manajemen audio untuk program Windows. Jika layanan ini dihentikan, perangkat audio dan efek tidak akan berfungsi dengan benar.
Ruang Kartu Windows idsvc Memberikan cara yang aman untuk membuat, mengelola, dan mengekspos identitas digital.
Pembaruan otomatis WUAUSERV Termasuk download dan instalasi Pembaruan Windows. Jika layanan dinonaktifkan, Anda tidak akan dapat menggunakan fitur di komputer ini. pembaruan otomatis atau situs Web Pemutakhiran Windows.

Daftar layanan yang dibuat oleh aplikasi dan program Microsoft

Daftar layanan yang dibuat oleh aplikasi dan program pihak ketiga

Lihat juga

Daftar Layanan Windows

Tautan

  • pcs.suite101.com/article.cfm/index_of_services: Indeks Layanan Windows XP - Indeks Layanan yang berjalan di Windows XP sistem operasi
  • Cara menghapus layanan Windows Vista atau Windows XP
  • Layanan Windows XP (Rusia)

Yayasan Wikimedia. 2010 .

Lihat apa itu "Layanan Windows" di kamus lain:

    Layanan Windows SharePoint (WSS) tambahan gratis ke Microsoft Windows Server 2003 dan 2008, yang mengimplementasikan platform web berfitur lengkap dengan dukungan untuk fitur-fitur berikut: Sistem manajemen konten Alat kolaborasi ... ... Wikipedia

    Pengembang Microsoft Keluarga OS Windows ... Wikipedia

    Komponen Microsoft Windows ... Wikipedia


Layanan Windows NT (layanan Windows NT) adalah proses khusus yang memiliki antarmuka terpadu untuk berinteraksi dengan sistem operasi. sistem jendela PB. Layanan dibagi menjadi dua jenis - layanan Win32 yang berinteraksi dengan sistem operasi melalui Service Control Manager (SCM), dan driver yang bekerja melalui protokol driver. perangkat Windows PB. Untuk sisa artikel ini, kami hanya akan membahas layanan Win32.

Penerapan layanan

Salah satu sifat terpenting dari suatu layanan adalah non-interaktivitas. Layanan tipikal berjalan di latar belakang, tidak terlihat oleh pengguna rata-rata. Karena itu, layanan paling cocok untuk mengimplementasikan jenis aplikasi berikut:

  • Server dalam arsitektur klien-server (misalnya, MS SQL, MS Exchange Server)
  • Jaringan layanan jendela NT (Server, Stasiun Kerja);
  • Komponen server (dalam arti fungsionalitas) dari aplikasi terdistribusi (misalnya, berbagai program pemantauan).

Properti dasar layanan

Layanan berbeda dari aplikasi Win32 biasa dalam 3 cara utama. Mari kita pertimbangkan masing-masing.

Pertama, ini adalah kemampuan untuk menghentikan (menangguhkan) layanan dengan anggun. Pengguna atau aplikasi lain yang menggunakan mekanisme standar memiliki kemampuan untuk mengubah status layanan - untuk memindahkannya dari status berjalan ke status jeda, atau bahkan menghentikan operasinya. Dalam hal ini, sebelum mengubah statusnya, layanan menerima pemberitahuan khusus, berkat itu ia dapat melakukan tindakan yang diperlukan untuk beralih ke status baru, misalnya, membebaskan sumber daya yang ditempati.

Kedua, kemampuan untuk memulai layanan sebelum mendaftarkan pengguna dan, sebagai hasilnya, kemampuan untuk bekerja sama sekali tanpa pengguna terdaftar. Layanan apa pun dapat dimulai secara otomatis di awal sistem operasi dan mulai bekerja bahkan sebelum pengguna masuk ke sistem.

Dan akhirnya, kemampuan untuk bekerja dalam konteks keamanan yang sewenang-wenang. Konteks Keamanan Windows NT mendefinisikan sekumpulan hak akses proses ke berbagai objek sistem dan data. Tidak seperti aplikasi Win32 biasa, yang selalu berjalan di bawah konteks keamanan pengguna yang saat ini masuk ke sistem, konteks keamanan eksekusi layanan dapat ditentukan sebelumnya. Ini berarti bahwa untuk suatu layanan dimungkinkan untuk menentukan sekumpulan hak aksesnya ke objek sistem terlebih dahulu dan dengan demikian membatasi ruang lingkup aktivitasnya. Untuk layanan, ada jenis konteks keamanan standar khusus yang disebut Sistem Lokal. Layanan yang berjalan dalam konteks ini hanya memiliki hak atas sumber daya komputer lokal. Tidak ada operasi jaringan yang dapat dilakukan dengan hak Sistem Lokal, karena konteks ini hanya berarti pada komputer lokal dan tidak dikenali oleh komputer lain di jaringan.

Interaksi layanan dengan aplikasi lain

Setiap aplikasi yang memiliki hak yang sesuai dapat berinteraksi dengan layanan tersebut. Interaksi, pertama-tama, menyiratkan perubahan status layanan, yaitu transfernya ke salah satu dari tiga status - berjalan (Mulai), ditangguhkan (Jeda), berhenti, dan dilakukan dengan mengirimkan permintaan SCM. Permintaan terdiri dari tiga jenis - pesan dari layanan (memperbaiki statusnya), permintaan terkait dengan mengubah konfigurasi layanan atau mendapatkan informasi tentangnya, dan permintaan dari aplikasi untuk mengubah status layanan.

Untuk mengelola layanan, Anda harus terlebih dahulu mendapatkan pegangannya menggunakan fungsi Win32 OpenService API. Fungsi StartService memulai layanan. Jika perlu, mengubah status layanan dilakukan dengan memanggil fungsi ControlService.

Basis Data Layanan

Informasi tentang setiap layanan disimpan dalam registri - di kunci HKLM\SYSTEM\CurrentControlSet\Services\ServiceName. Ini berisi informasi berikut:

  • Jenis layanan. Menunjukkan apakah aplikasi ini mengimplementasikan hanya satu layanan (eksklusif) atau apakah ada beberapa layanan di dalam aplikasi. Layanan eksklusif dapat berjalan dalam konteks keamanan apa pun. Beberapa layanan dalam aplikasi yang sama hanya dapat berjalan dalam konteks LocalSystem.
  • Jenis peluncuran. Otomatis - layanan dimulai saat startup sistem. Sesuai Permintaan - Layanan dimulai secara manual oleh pengguna. Dinonaktifkan - Layanan tidak dapat dimulai.
  • Nama modul yang dapat dieksekusi (file EXE).
  • Mulai pesanan terkait dengan layanan lain. Dalam beberapa kasus, pengoperasian layanan yang benar memerlukan satu atau beberapa layanan lain untuk dijalankan. Dalam hal ini, registri berisi informasi tentang layanan yang dimulai sebelum ini.
  • Konteks keamanan eksekusi layanan ( nama jaringan dan kata sandi). Konteks keamanan default adalah LocalSystem.

Aplikasi yang perlu mendapatkan informasi tentang layanan tertentu atau mengubah pengaturan tertentu dari suatu layanan pada dasarnya perlu mengubah informasi dalam database layanan di registri. Ini dapat dilakukan melalui fungsi API Win32 yang sesuai:

  • OpenSCManager, CreateService, OpenService, CloseServiceHandle - untuk membuat (membuka) layanan;
  • QueryServiceConfig, QueryServiceObjectSecurity, EnumDependentServices, EnumServicesStatus - untuk mendapatkan informasi tentang layanan;
  • ChangeServiceConfig, SetServiceObjectSecurity, LockServiceDatabase, UnlockServiceDatabase, QueryServiceLockStatus - untuk mengubah informasi konfigurasi layanan.

Layanan internal.

Agar dapat berfungsi, aplikasi harus diatur dengan cara yang tepat, yaitu harus menyertakan sekumpulan fungsi tertentu (dalam istilah C ++) dengan fungsionalitas tertentu. Mari kita pertimbangkan secara singkat masing-masing.

fungsi utama

Seperti yang Anda ketahui, fungsi utamanya adalah titik masuk dari aplikasi konsol Win32 mana pun. Saat layanan dimulai, kode untuk fungsi ini mulai dijalankan terlebih dahulu. Dalam 30 detik sejak awal, fungsi utama harus memanggil StartServiceCtrlDispatcher untuk membuat koneksi antara aplikasi dan SCM. Semua komunikasi antara layanan apa pun dalam aplikasi ini dan SCM berlangsung di dalam fungsi StartServiceCtrlDispatcher, yang hanya keluar jika semua layanan dalam aplikasi telah berhenti.

Fungsi LayananMain

Selain titik masuk seluruh proses, ada juga titik masuk terpisah untuk setiap layanan yang diimplementasikan dalam aplikasi. Nama fungsi yang merupakan titik masuk layanan (untuk kesederhanaan, sebut saja semuanya sama - ServiceMain) diteruskan ke SCM di salah satu parameter saat memanggil StartServiceCtrlDispatcher. Saat setiap layanan dimulai, utas terpisah dibuat untuk menjalankan ServiceMain.

Setelah memegang kendali, ServiceMain pertama-tama harus mendaftarkan penangan permintaan layanan, fungsi Handler, untuk setiap layanan dalam aplikasi. Setelah itu, ServiceMain biasanya diikuti oleh beberapa tindakan untuk menginisialisasi layanan - mengalokasikan memori, membaca data, dll. Tindakan ini harus disertai dengan pemberitahuan kepada SCM bahwa layanan masih dalam proses dimulai dan tidak ada kegagalan yang terjadi. Notifikasi dikirim menggunakan panggilan ke fungsi SetServiceStatus. Semua kecuali panggilan terbaru harus SERVICE_START_PENDING dan panggilan terbaru harus SERVICE_RUNNING. Frekuensi panggilan ditentukan oleh pengembang layanan berdasarkan kondisi berikut: durasi interval waktu antara dua panggilan yang berdekatan ke SetServiceStatus tidak boleh melebihi nilai parameter dwWaitHint yang diteruskan ke SCM selama panggilan pertama dari dua panggilan. Jika tidak, SCM akan menghentikan layanan secara paksa jika tidak menerima pemberitahuan lain tepat waktu. Metode ini menghindari situasi layanan di awal sebagai akibat dari terjadinya kegagalan tertentu (ingat bahwa layanan biasanya non-interaktif dan dapat dimulai tanpa adanya pengguna). Praktik yang biasa dilakukan adalah setelah selesainya langkah inisialisasi berikutnya, SCM akan diberi tahu.

Fungsi penangan

Seperti disebutkan di atas, Handler adalah prototipe dari fungsi panggilan balik, penangan permintaan layanan, khusus untuk setiap layanan dalam aplikasi. Handler dipanggil saat layanan menerima permintaan (mulai, jeda, lanjutkan, hentikan, pesan status saat ini) dan melakukan tindakan yang diperlukan sesuai dengan permintaan, setelah itu melaporkan status baru ke SCM.

Satu permintaan khususnya harus diperhatikan - permintaan yang datang saat sistem dimatikan (Shutdown). Permintaan ini menandakan kebutuhan untuk melakukan deinisialisasi dan keluar. Microsoft mengklaim bahwa setiap layanan diberikan waktu 20 detik untuk dimatikan, setelah itu terpaksa dihentikan. Namun, pengujian menunjukkan bahwa kondisi ini tidak selalu terpenuhi dan layanan dihentikan secara paksa sebelum jangka waktu tersebut berakhir.

Sistem keamanan layanan

Tindakan apa pun pada layanan memerlukan aplikasi untuk memiliki hak yang sesuai. Semua aplikasi memiliki hak untuk terhubung ke SCM, menghitung layanan, dan memeriksa apakah basis data layanan dikunci. Hanya aplikasi yang memiliki hak administratif yang dapat mendaftarkan layanan baru di sistem atau memblokir basis data layanan.

Setiap layanan memiliki deskriptor keamanan yang menjelaskan pengguna mana yang diizinkan untuk melakukan operasi mana. Bawaan:

  • Semua pengguna memiliki hak SERVICE_QUERY_CONFIG, SERVICE_QUERY_STATUS, SERVICE_ENUMERATE_DEPENDENTS, SERVICE_INTERROGATE, dan SERVICE_USER_DEFINED_CONTROL;
  • Pengguna di grup Power Users dan akun LocalSystem juga memiliki hak SERVICE_START, SERVICE_PAUSE_CONTINUE, dan SERVICE_STOP;
  • Pengguna di grup Administrator dan Operator Sistem memiliki hak SERVICE_ALL_ACCESS.

Layanan dan interaktivitas

Secara default, layanan interaktif hanya dapat dijalankan dalam konteks keamanan Sistem Lokal. Ini karena kekhasan menampilkan monitor di Windows NT, di mana, misalnya, ada objek seperti "Desktop", untuk bekerja dengannya Anda harus memiliki hak akses yang sesuai, yang mungkin tidak tersedia untuk sembarang Akun, selain LocalSystem. Terlepas dari kenyataan bahwa dalam sebagian besar kasus, pembatasan ini tidak signifikan, namun terkadang ada kebutuhan untuk membuat layanan yang akan menampilkan informasi di layar monitor dan pada saat yang sama berjalan dalam konteks keamanan selain Sistem Lokal, misalnya, komponen server aplikasi untuk menjalankan aplikasi di komputer jarak jauh.

Cuplikan kode dari . menggambarkan kemungkinan ini.

Dalam fragmen ini, sebagai tanggapan atas permintaan yang dikirim oleh sisi klien aplikasi sebagai konsekuensi RPC, layanan menampilkan pesan teks di layar monitor.

Contoh layanan (cuplikan kunci)

Mari kita lihat contoh fragmen kunci aplikasi C++ yang mengimplementasikan layanan Windows NT. Untuk kejelasan, bagian kode yang tidak penting dihilangkan.

fungsi utama

Ditampilkan adalah kode untuk fungsi utama.

Fungsi LayananMain

Fitur dari kode yang terdapat di ServiceMain adalah seringkali tidak mungkin untuk memprediksi waktu eksekusi suatu operasi sebelumnya, terutama jika Anda menganggap bahwa eksekusinya terjadi di sistem operasi dengan multitasking preemptive. Jika operasi berlangsung lebih lama dari interval waktu yang ditentukan dalam parameter panggilan SetServiceStatus, layanan tidak akan dapat mengirimkan pemberitahuan berikutnya tepat waktu, menyebabkan SCM menghentikan operasinya. Contoh operasi potensial adalah panggilan ke fungsi jaringan dengan waktu tunggu yang lama atau pembacaan satu kali jumlah yang besar informasi dari media lambat. Selain itu, pendekatan ini sama sekali tidak dapat diterapkan saat men-debug layanan, karena eksekusi program di debugger disertai dengan jeda besar yang diperlukan untuk pengembang.

Untuk mengatasi masalah ini, semua interaksi dengan SCM harus dilakukan dalam thread terpisah, terlepas dari tindakan yang terjadi selama fase inisialisasi.

B menunjukkan algoritme untuk memulai layanan dengan benar menggunakan utas tambahan.

Fungsi penangan

B menunjukkan kode untuk fungsi Handler dan utas pembantu. Untuk permintaan "Stop" dan "Shutdown", algoritme untuk menghentikan layanan dengan lancar digunakan, serupa dengan yang digunakan saat memulai layanan, dengan satu-satunya perbedaan adalah bahwa parameter SERVICE_STOP_PENDING diteruskan ke SetserviceStatus alih-alih parameter SERVICE_START_PENDING, dan SERVICE_STOPPED bukannya SERVICE_RUNNING.

Idealnya, kueri "Jeda" dan "Lanjutkan" juga harus menggunakan pendekatan ini. Pembaca yang ingin tahu dapat dengan mudah menerapkannya berdasarkan contoh-contoh ini.

Kesimpulan

Sebagai kesimpulan, saya ingin mencatat bahwa dengan transisi ke Windows NT 2000, pengembangan layanan tidak berubah. Layanan terus menjadi bagian penting dari perangkat lunak pada platform Windows, memberi pengembang banyak pekerjaan yang harus dilakukan.


// Fungsi yang mirip dengan MessageBox Win32 API int ServerMessageBox(RPC_BINDING_HANDLE h, LPSTR lpszText, LPSTR lpszTitle, UINT fuStyle) ( DWORD dwThreadId; HWINSTA hwinstaSave; HDESK hdeskSave; HWINSTA hwinstaUser; HDESK hdeskUser; hasil int; // Simpan "Stasiun jendela" saat ini objek " dan "Desktop". GetDesktopWindow(); hwinstaSave = GetProcessWindowStation(); dwThreadId = GetCurrentThreadId(); hdeskSave = GetThreadDesktop(dwThreadId); // Ubah konteks keamanan ke // yang dimiliki klien RPC panggilan // dan mendapatkan akses ke pengguna // objek "Stasiun jendela" dan "Desktop". RpcImpersonateClient(h); hwinstaUser = OpenWindowStation("WinSta0", FALSE, MAXIMUM_ALLOWED); if (hwinstaUser == NULL) ( RpcRevertToSelf(); return 0; ) SetProcessWindowStation( hwinstaUser); hdeskUser = OpenDesktop("Default", 0, FALSE, MAXIMUM_ALLOWED); RpcRevertToSelf(); if (hdeskUser == NULL) ( SetProcessWindowStation(hwinstaSave); CloseWindowStation(hwinstaUser); ret guci0; ) SetThreadDesktop(hdeskUser); // Menampilkan kotak teks normal. hasil = MessageBox(NULL, lpszText, lpszTitle, fuStyle); // Pulihkan objek yang disimpan // "Stasiun jendela" dan "Desktop". SetThreadDesktop(hdeskSave); SetProcessWindowStation(hwinstaSave); TutupDesktop(hdeskUser); CloseWindowStation(hwinstaUser); mengembalikan hasil; ) void main() ( SERVICE_TABLE_ENTRY steTable = ( (SERVICENAME, ServiceMain), (NULL, NULL) ); // Membangun koneksi ke SCM. Di dalam fungsi ini // permintaan diterima dan dikirim. StartServiceCtrlDispatcher(steTable); ) batal WINAPI ServiceMain (DWORD dwArgc, LPSTR *psArgv) ( // Segera daftarkan penangan permintaan. hSS = RegisterServiceCtrlHandler(SERVICENAME, ServiceHandler); sStatus.dwCheckPoint = 0; sStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; sStatSERVus. dwServiceSpecificExitCode = 0; sStatus.dwServiceSpecificExitCode = 0; sStatus.dwServiceSpecificExitCode = 0; ; sStatus.dwWaitHint = 0; sStatus.dwWin32ExitCode = NOERROR; // Untuk menginisialisasi layanan, fungsi InitService() dipanggil; // Untuk memastikan bahwa layanan sistem tidak // membongkar layanan selama proses inisialisasi, utas dimulai yang melaporkan setiap // detik bahwa layanan sedang dalam proses inisialisasi. // Sebuah acara dibuat untuk menyinkronkan utas. // Setelah itu, utas pekerja dimulai, untuk Untuk menyinkronkan // acara mana yang juga dibuat. hSendStartPending = CreateEvent(NULL, TRUE, FALSE, NULL); HANDLE hSendStartThread; DWORD dwThreadId; hSendStartThread = BuatUtas(NULL, 0, SendStartPending, NULL, 0, &dwThreadId); //Semua inisialisasi layanan dilakukan di sini. InitService(); SetEvent(hSendStartPending); if(WaitForSingleObject(hSendStartThread, 2000) != WAIT_OBJECT_0) ( TerminateThread(hSendStartThread, 0); ) CloseHandle(hSendStartPending); CloseHandle(hSendStartThread); hWork = CreateEvent(NULL, TRUE, FALSE, NULL); hServiceThread = CreateThread(NULL, 0, ServiceFunc, 0, 0, &dwThreadId); sStatus.dwCurrentState = SERVICE_RUNNING; SetLayananStatus(hSS, &sStatus); ) // Fungsi utas yang mengirimkan pemberitahuan ke SCM setiap detik // bahwa proses inisialisasi sedang berlangsung. Fungsi berakhir // saat event hSendStartPending // disetel. DWORD WINAPI SendStartPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_START_PENDING; sStatus.dwWaitHint = 2000; // "Tidur" selama 1 detik. Jika setelah 1 detik // event hSendStartPending belum // dialihkan ke keadaan bersinyal ( // inisialisasi layanan belum berakhir), kami mengirim pemberitahuan lain, // menyetel interval waktu maksimum // menjadi 2 detik, agar memiliki margin waktu sebelum // pemberitahuan berikutnya. while (true) ( ​SetServiceStatus(hSS, &sStatus); sStatus .dwCheckPoint++;if(WaitForSingleObject(hSendStartPending, 1000)!=WAIT_TIMEOUT) break; ) sStatus.dwCheckPoint = 0; return 0; ) // Fungsi yang menginisialisasi layanan. Membaca data, // mengalokasikan memori, dll. void InitService() ( ... ) // Fungsi yang berisi kode layanan. DWORD WINAPI ServiceFunc(LPVOID) ( while (true) ( ​​​​if (!bPause) ( // Ini berisi kode yang biasanya // melakukan semacam operasi siklik... ) if (WaitForSingleObject(hWork, 1000)!=WAIT_TIMEOUT ) break; ) return 0; ) // Handler permintaan dari SCM batal WINAPI ServiceHandler(DWORD dwCode) ( switch (dwCode) ( case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_SHUTDOWN: ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 0, 1000); hSendStopPending = CreateEvent(NULL, BENAR, SALAH, NULL); hSendStopThread = CreateThread(NULL, 0, SendStopPending, NULL, 0, & dwThreadId); SetEvent(hWork); if (WaitForSingleObject(hServiceThread, 1000) != WAIT_OBJECT_0) ( TerminateThread(hServiceThread, 0); ) SetEvent(hSendStopPending); CloseHandle(hServiceThread); CloseHandle(hWork); if(WaitForSingleObject(hSendStopThread, 2000) != WAIT_OBJECT_0) ( TerminateThread(hSendStopThread, 0); ) CloseHandle(hSendStopPending); sStatus.dwCurrentState = SERVICE_STOPPED; StatusLayanan(hSS, &sStatus); merusak; kasus SERVICE_CONTROL_PAUSE: bPause = true; sStatus.dwCurrentState = SERVICE_PAUSED; SetLayananStatus(hSS, &sStatus); merusak; kasus SERVICE_CONTROL_CONTINUE: bPause = true; sStatus.dwCurrentState = SERVICE_RUNNING; SetLayananStatus(hSS, &sStatus); merusak; kasus SERVICE_CONTROL_INTERROGATE: SetServiceStatus(hSS, &sStatus); merusak; default: SetServiceStatus(hSS, &sStatus); merusak; ) ) // Fungsi utas mirip dengan SendStartPending // untuk menghentikan layanan. DWORD WINAPI SendStopPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_STOP_PENDING; sStatus.dwWaitHint = 2000; while (true) ( ​​​​SetServiceStatus(hSS, &sStatus); sStatus.dwCheckPoint++; if(WaitForSingleStopPending(hSendStopPending0), ! =WAIT_TIMEOUT) istirahat; ) sStatus.dwCheckPoint = 0; kembali 0; )

Cara Menjalankan Aplikasi sebagai Layanan Windows

Apakah mungkin menjalankan aplikasi klien sebagai layanan? Di salah satunya, saya menjelaskan cara membuat layanan Windows menggunakan alat OS biasa. Namun, tidak semua aplikasi konsol dapat dijalankan sebagai layanan, dan program dengan antarmuka grafis, pada prinsipnya, tidak dapat bekerja dengan cara ini. Namun masih ada peluang untuk menjalankan aplikasi sebagai layanan, dan program dengan nama aslinya akan membantu kami dalam hal ini. Manajer Layanan Non-Mengisap.

NSSM gratis perangkat lunak Dengan sumber terbuka dan mendukung semua sistem operasi Microsoft dari Windows 2000 hingga Windows 8. NSSM tidak memerlukan instalasi, cukup unduh dan bongkar. Kit distribusi mencakup versi untuk OS 32-bit dan 64-bit. Anda bisa mendapatkan program dari situs nssm.cc, saat ini versi stabil terbaru adalah 2.21.1 yang akan saya gunakan.

Untuk mendemonstrasikan kemampuan NSSM, mari kita coba jalankan Notepad Windows sebagai layanan pada Windows 8.1.

Buat layanan

Untuk membuat layanan bernama notepad luncurkan konsol perintah, buka folder dengan NSSM yang sudah dibongkar (untuk Windows 64-bit) dan masukkan perintah nssm install notepad , yang membuka jendela penginstal grafis NSSM. Untuk membuat layanan, cukup menentukan jalur ke file yang dapat dieksekusi di bidang Jalur dan klik tombol "Instal layanan". Selain itu, di bidang Opsi, Anda dapat menentukan kunci yang diperlukan untuk memulai layanan.

Selain itu, pada tahap membuat layanan baru, Anda dapat menentukan beberapa parameter tambahan.

Tab Shutdown mencantumkan metode shutdown dan waktu tunggu yang digunakan selama shutdown normal atau shutdown darurat aplikasi. Saat NSSM menerima perintah stop (misalnya saat aplikasi berhenti), NSSM mencoba menghentikan aplikasi yang dikontrol dengan cara biasa. Jika aplikasi tidak merespon, maka NSSM dapat menghentikan paksa semua proses dan sub-proses dari aplikasi ini.

Ada total empat langkah penonaktifan aplikasi, dan secara default mereka akan digunakan dalam urutan ini:

Pada langkah pertama, NSSM mencoba membuat dan mengirimkan suatu peristiwa ctrl+c. Metode ini bekerja dengan baik untuk aplikasi atau skrip konsol, tetapi tidak untuk aplikasi grafis;
NSSM kemudian mendeteksi semua jendela yang dibuat oleh aplikasi dan mengirimkan pesan WM_CLOSE kepada mereka untuk memaksa aplikasi keluar;
Pada langkah ketiga, NSSM mengevaluasi semua utas yang dibuat oleh aplikasi dan mengirimkan pesan WM_QUIT kepada mereka, yang akan diterima jika aplikasi memiliki antrean pesan utas;
Dan sebagai upaya terakhir, NSSM dapat memanggil metode TerminateProcess(), menghentikan aplikasi secara paksa.

Dimungkinkan untuk menonaktifkan beberapa atau bahkan semua metode, untuk aplikasi yang berbeda metode yang berbeda berfungsi, dan untuk mematikan aplikasi dengan benar, disarankan untuk membiarkan semuanya apa adanya.

Secara default, saat layanan mogok, NSSM mencoba memulai ulang. Pada tab "Keluar dari tindakan", Anda dapat mengubah tindakan otomatis jika aplikasi dimatikan secara tidak normal, serta menyetel penundaan sebelum aplikasi dimulai ulang secara otomatis.

Pada tab "Input / Output (I / O)", Anda dapat mengatur pengalihan input / output aplikasi ke file yang ditentukan.

Pada tab "Lingkungan", Anda dapat menyetel variabel lingkungan baru untuk layanan, atau mengganti yang sudah ada.

Anda juga tidak dapat menggunakan shell grafis dan segera membuat layanan di konsol dengan perintah berikut:

nssm instal notepad ″C:\Windows\system32\notepad.exe″

Manajemen Pelayanan

Setelah membuat layanan menggunakan NSSM, buka snap-in Layanan dan temukan layanan notepad. Seperti yang Anda lihat, tampilannya tidak berbeda dengan layanan lain, kami juga dapat memulainya, menghentikannya, atau mengubah mode mulai. Perhatikan, bagaimanapun, bahwa nssm.exe terdaftar sebagai yang dapat dieksekusi.

Dan jika Anda masuk ke Task Manager, kita akan melihat gambar berikut: NSSM berjalan sebagai proses utama (induk), layanan notepad berjalan sebagai proses anaknya, dan aplikasi Notepad sudah berjalan dalam proses anak ini.

Menghapus layanan

Untuk menghapus layanan, masukkan perintah nssm remove notepad dan konfirmasikan penghapusannya. Dan dengan mengetik nssm remove notepad confirm , Anda dapat melakukannya tanpa konfirmasi.

Memulai Layanan Secara Interaktif

Perbedaan utama aplikasi kustom dari layanan adalah setelah diluncurkan, aplikasi mungkin memerlukan tindakan tambahan dari pihak pengguna untuk terus bekerja - misalnya, klik tombol atau masukkan perintah. Untuk melakukan ini, Anda perlu mendapatkan akses ke sana, yang ternyata tidak mudah dilakukan.

Untuk memulai layanan dalam mode interaktif, Anda perlu membuka propertinya di snap-in Layanan dan pada tab "Masuk", centang kotak "Izinkan interaksi dengan desktop".

Dan kemudian keajaiban dimulai 🙂 Layanan yang diluncurkan dalam mode interaktif terbuka dalam sesi terisolasi (sesi 0). Sesi ini hanya dapat diakses oleh Layanan Deteksi Layanan Interaktif (ui0detect), yang memantau dimulainya layanan interaktif di komputer dan mengeluarkan peringatan. Di Windows 7\Server 2008 layanan ini diaktifkan secara default, tetapi di Windows 8\Server 2012 dinonaktifkan dan tidak muncul di snap-in grafis Layanan (setidaknya saya tidak menemukannya di sana). Selain itu, jika Anda menemukan layanan misterius ini dan mencoba memulainya, Anda akan menerima pesan kesalahan.

Tetapi faktanya adalah untuk menjalankannya, Anda harus mengizinkan peluncuran layanan interaktif di komputer. Oleh karena itu, kami membuka editor registri, temukan di bagian HKLM\System\CurrentControlSet\Control\Windows parameter DWORD dengan nama Tidak Ada Layanan Interaktif dan atur nilainya menjadi 0 .

Kemudian kami membuka konsol PowerShell dan memulai layanan penemuan dengan perintah:

Mulai-Layanan -Nama ui0detect

Setelah memastikan bahwa layanan penemuan sedang berjalan, kami memulai kembali layanan notepad, dan kami mendapatkan jendela ini. Pilih "Lihat Pesan"

dan masuk ke sesi nol di mana aplikasi kita berjalan. Kemudian kami melakukan tindakan yang diperlukan dengannya dan kembali.

Solusi yang sangat menarik untuk menjalankan aplikasi sebagai layanan Windows. Bukan yang tercantik, tapi cukup sesuai dengan namanya 🙂

Pembaruan terakhir: 31.10.2015

Layanan adalah salah satu komponen terpenting dari sistem operasi Windows. Faktanya, ini adalah aplikasi terpisah yang tidak memiliki antarmuka grafis dan melakukan berbagai tugas di latar belakang. Layanan dapat dimulai pada awal sistem operasi, atau pada waktu lain selama pekerjaan pengguna. Contoh umum layanan adalah berbagai server web yang mendengarkan di latar belakang pada port tertentu untuk koneksi, dan jika ada koneksi, maka berinteraksi dengannya. Bisa juga berbagai layanan pembaruan tambahan untuk lainnya program yang diinstal yang menghubungi server untuk melihat apakah ada versi baru aplikasi. Secara umum, kita dapat membuka panel layanan dan melihat sendiri semua layanan yang terinstal dan berjalan:

Mari kita lihat cara membuat layanan Anda sendiri di C#. Sebagai tugas yang akan dilaksanakan, kami akan memilih untuk memantau perubahan pada folder tertentu di sistem file. Sekarang mari buat layanan untuk menjalankannya.

Pertama, mari buat proyek baru, yang akan bertipe Windows Service . Beri nama proyek FileWatcherService:

Setelah itu, Visual Studio menghasilkan proyek yang memiliki semua yang Anda butuhkan. Meskipun pada prinsipnya kita tidak harus memilih jenis proyek khusus ini, kita dapat membuat proyek pustaka kelas dan kemudian menentukan semua kelas yang diperlukan di dalamnya.

Jadi proyek baru terlihat seperti ini:

Ada juga file Program.cs dan ada service node Service1.cs itu sendiri.

Layanan mewakili aplikasi normal, tetapi tidak dimulai dengan sendirinya. Semua panggilan dan akses ke sana melalui Service Control Manager (SCM). Saat layanan dimulai secara otomatis saat startup sistem atau secara manual, SCM memanggil metode Utama di kelas Program:

Program kelas statis ( static void Main() ( ServiceBase ServicesToRun; ServicesToRun = ServiceBase baru ( Service1() baru ); ServiceBase.Run(ServicesToRun); ) )

Metode Utama ditentukan secara default untuk menjalankan beberapa layanan sekaligus, yang ditentukan dalam larik ServicesToRun. Namun, secara default, proyek hanya berisi satu layanan, Service1. Peluncuran itu sendiri dilakukan dengan menggunakan metode Run: ServiceBase.Run(ServicesToRun) .

Layanan itu sendiri akan dimulai diwakili oleh node Service1.cs. Namun, ini sebenarnya bukan file kode sederhana. Jika kita membuka node ini, kita akan melihat file service designer Service1.Designer.cs dan class Service1 di dalamnya.

Kelas Service1 sebenarnya mewakili layanan. Secara default memiliki kode berikut:

Menggunakan Sistem; menggunakan System.Collections.Generic; menggunakan System.ComponentModel; menggunakan Sistem.Data; menggunakan System.Diagnostics; menggunakan System.Linq; menggunakan Sistem.LayananProses; menggunakan Sistem.Teks; menggunakan System.Threading.Tasks; namespace FileWatcherService ( public partial class Service1: ServiceBase ( public Service1() ( InitializeComponent(); ) terlindung override void OnStart(string args) ( ) terproteksi override void OnStop() ( ) ) )

Kelas layanan harus mewarisi dari kelas dasar ServiceBase. Kelas ini mendefinisikan sejumlah metode, yang terpenting adalah metode OnStart(), yang memulai tindakan yang dilakukan oleh layanan, dan metode OnStop(), yang menghentikan layanan.

Setelah SCM memanggil metode Utama dan mendaftarkan layanan, SCM dipanggil langsung dengan menjalankan metode OnStart.

Saat berada di konsol layanan atau melalui garis komando kami mengirim perintah untuk menghentikan layanan, kemudian SCM memanggil metode OnStop untuk menghentikannya.

Selain kedua metode ini di kelas layanan, Anda dapat mengganti beberapa metode lainnya dari kelas dasar ServiceBase:

    OnPause : dipanggil saat layanan dijeda

    OnContinue : Dipanggil saat layanan dilanjutkan setelah ditangguhkan

    OnShutdown : Dipanggil saat Windows dimatikan

    OnPowerEvent : dipanggil saat mode daya berubah

    OnCustomCommand : Dipanggil saat layanan menerima perintah khusus dari Service Control Manager (SCM)

Konstruktor kelas Service1 memanggil metode InitializeComponent() , yang didefinisikan dalam file desainer Service1.Designer.cs :

Namespace FileWatcherService ( kelas parsial Service1 ( komponen System.ComponentModel.IContainer pribadi = null; protected override void Dispose(bool pembuangan) ( if (disposing && (components != null)) ( components.Dispose(); ) base.Dispose(disposing ); ) private void InitializeComponent() ( komponen = new System.ComponentModel.Container(); this.ServiceName = "Service1"; ) ) )

Satu-satunya hal yang perlu diperhatikan di dalamnya adalah menyetel nama layanan (properti ServiceName):

This.ServiceName = "Layanan1";

Ini adalah nama yang akan ditampilkan di konsol layanan setelah layanan diinstal. Kita bisa mengubahnya, atau kita bisa membiarkannya apa adanya.

Sekarang mari kita ubah kode layanan sebagai berikut:

Menggunakan Sistem; menggunakan Sistem.ProsesLayanan; menggunakan Sistem.IO; menggunakan System.Threading; namespace FileWatcherService ( public partial class Service1: ServiceBase ( Logger logger; public Service1() ( InitializeComponent(); this.CanStop = true; this.CanPauseAndContinue = true; this.AutoLog = true; ) protected override void OnStart(string args) ( logger = new Logger(); Thread loggerThread = Thread baru(ThreadStart baru(logger.Start)); loggerThread.Start(); ) dilindungi override void OnStop() ( logger.Stop(); Thread.Sleep(1000); ) ) class Logger ( Pengamat FileSystemWatcher; objek obj = objek baru(); bool diaktifkan = true; Logger publik() ( Pengamat = FileSystemWatcher baru("D:\\Temp"); Pengamat.Dihapus += Pengamat_Dihapus; Pengamat.Dibuat + = Watcher_Created; watcher.Changed += Watcher_Changed; watcher.Renamed += Watcher_Renamed; ) public void Start() ( watcher.EnableRaisingEvents = true; while(enabled) ( Thread.Sleep(1000); ) ) public void Stop() ( watcher.EnableRaisingEvents = false; diaktifkan = false; ) // mengganti nama file pribadi e void Watcher_Renamed(pengirim objek, RenamedEventArgs e) ( string fileEvent = "berganti nama menjadi " + e.FullPath; string filePath = e.OldFullPath; RecordEntry(fileEvent, filePath); ) // mengubah file private void Watcher_Changed(pengirim objek, FileSystemEventArgs e) ( string fileEvent = "berubah"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // membuat file private void Watcher_Created(pengirim objek, FileSystemEventArgs e) ( string fileEvent = "dibuat"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // hapus file private void Watcher_Deleted(pengirim objek, FileSystemEventArgs e) ( string fileEvent = "dihapus"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) private void RecordEntry(string fileEvent, string filePath) ( lock (obj) ( menggunakan (StreamWriter writer = new StreamWriter("D:\\templog.txt", true)) ( writer.WriteLine(String.Format("(0) file(1) was(2)", DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"), filePath, fileEvent)); penulis. Siram(); ) ) ) ) )

Kelas kunci yang merangkum semua fungsionalitas adalah kelas Logger. Menggunakan objek FileSystemWatcher, itu akan memantau perubahan di folder D://Temp. Metode Start() menetapkan bahwa kita akan mengamati perubahan melalui objek FileSystemWatcher. Dan semua pekerjaan akan berjalan selama variabel boolean yang diaktifkan adalah true . Dan metode Stop() akan memungkinkan Anda untuk mengakhiri kelas.

Acara FileSystemWatcher memungkinkan Anda memantau semua perubahan di folder yang diawasi. Ini akan mencatat perubahan pada file templog.txt. Untuk menghindari perlombaan sumber daya untuk file templog.txt di mana perubahan ditulis, prosedur penulisan diblokir oleh rintisan lock(obj).

Akibatnya, setelah membuat, memodifikasi, mengganti nama, dan menghapus file log akan berisi sesuatu seperti:

Pada 07/30/2015 12:15:40 PM file D:\Temp\New Text Document.txt dibuat pada 07/30/2015 12:15:46 PM file D:\Temp\New Text Document.txt diubah namanya menjadi D:\Temp\hello.txt 30/07/2015 12:15:55 File PM D:\Temp\hello.txt telah dimodifikasi 30/07/2015 12:15:55 File PM D:\Temp\ hello.txt telah dimodifikasi 30/07/2015 12:16:01 File PM D: \Temp\hello.txt telah dihapus

Di kelas layanan Service1 itu sendiri, sejumlah opsi diatur di konstruktor:

This.CanStop = true; // layanan dapat dihentikan this.CanPauseAndContinue = true; // layanan dapat dijeda dan kemudian dilanjutkan ini.AutoLog = true; // layanan dapat menulis ke log

Dalam metode OnStart(), utas baru dipanggil untuk memulai objek Logger:

Dilindungi override void OnStart(string args) ( logger = Logger baru(); Thread loggerThread = Thread baru(ThreadStart baru(logger.Start)); loggerThread.Start(); )

Utas baru diperlukan karena utas saat ini hanya memproses perintah SCM dan harus kembali dari metode OnStart secepat mungkin.

Saat perintah diterima dari SCM untuk menghentikan layanan, metode OnStop diaktifkan, yang memanggil metode logger.Stop(). Penundaan ekstra akan memungkinkan utas logger berhenti:

Dilindungi override void OnStop() ( logger.Stop(); Thread.Sleep(1000); )

Namun, kelas layanan itu sendiri tidak cukup. Kita juga perlu membuat penginstal layanan.

Atau desktop pengguna (baik lokal maupun jarak jauh), namun, untuk beberapa layanan, pengecualian dimungkinkan - interaksi dengan konsol (nomor sesi 0, di mana pengguna masuk secara lokal atau saat layanan dimulai mstsc dengan tombol /console).

Ada beberapa mode untuk layanan:

  • dilarang diluncurkan;
  • mulai manual (berdasarkan permintaan);
  • mulai otomatis saat komputer melakukan booting;
  • mulai otomatis (tertunda) (diperkenalkan pada Windows Vista dan Windows Server 2008);
  • layanan/driver yang diperlukan (mulai otomatis dan ketidakmampuan (untuk pengguna) untuk menghentikan layanan).

Modus latar belakang

Memulai, menghentikan, dan mengubah layanan Windows

Layanan dan atributnya dapat diubah di MMC:

Versi berbeda dari sistem operasi mungkin memiliki beberapa layanan dan bukan yang lain. Beberapa aplikasi dan program yang diinstal secara terpisah juga dapat membuat layanannya sendiri.

Daftar layanan sistem operasi Microsoft Windows

Nama tampilan Nama layanan Fungsi Keterangan
klien DHCP dhcp Daftarkan dan perbarui alamat IP dan data DNS untuk komputer ini. Jika layanan ini dihentikan, komputer ini tidak akan dapat memperoleh alamat IP dinamis dan melakukan pembaruan DNS.
klien DNS dnscache Layanan DNS Client (dnscache) menyimpan nama Domain Name System (DNS) dan mendaftarkan nama komputer ini yang sepenuhnya memenuhi syarat. Jika layanan dihentikan, resolusi nama DNS akan dilanjutkan. Namun, hasil antrian nama DNS tidak akan di-cache dan nama komputer tidak akan didaftarkan.
KtmRm untuk koordinator transaksi terdistribusi KtmRm Mengkoordinasikan transaksi antara MSDTC dan Kernel Transaction Manager (KTM).
ReadyBoost EMDMgmt ReadyBoost Dukungan untuk meningkatkan performa sistem dengan teknologi ReadyBoost.
Superfetch SysMain Superfetch Mempertahankan dan meningkatkan kinerja sistem.
Audio Windows Audiosrv Mengelola alat audio untuk program Windows. Jika layanan ini dihentikan, perangkat audio dan efek tidak akan berfungsi dengan benar.
Ruang Kartu Windows idsvc Memberikan cara yang aman untuk membuat, mengelola, dan mengekspos identitas digital.
Pembaruan otomatis WUAUSERV Termasuk mengunduh dan menginstal pembaruan Windows. Jika layanan dinonaktifkan, komputer ini tidak akan dapat menggunakan pembaruan otomatis atau situs Web Pembaruan Windows.
Panggilan Prosedur Jarak Jauh (RPC) RpcSs Menyediakan pemetaan antara titik akhir dan layanan RPC lainnya.

Daftar layanan yang dibuat oleh aplikasi dan program Microsoft

Contoh Layanan yang Dibuat oleh Aplikasi dan Program Pihak Ketiga

Nama tampilan Nama layanan Fungsi Keterangan
Server HTTP ESET EhttpSrv perlindungan antivirus Komponen Server HTTP ESET