Windows Service – wprowadzenie

Usługa Windows – proces wykonywany wewnątrz środowiska systemowego Windows, przeznaczony do specjalnych funkcji i niewymagający interakcji z użytkownikiem komputera. Proces taki nazywany jest też serwisem Windows. Usługa zwykle jest uruchamiana podczas startu (ładowania) systemu operacyjnego i działa tak długo, jak długo system jest czynny.

Tyle z wiki. Warto wejść w link i przeczytać pozostałe informacje.

W dzisiejszej części wykonamy banalny serwis windowsowy.

W naszym Visual Studio wybieramy kolejno File -> New -> Project i wybieramy projekt serwisu windowsowego zgodnie z poniższym schematem:

Windows Service Project start

Create Windows Service Project

Otrzymamy projekt z klasą Service1.cs (ja osobiście zmieniam jej nazwę bo mnie ta drażni), który zawiera w sobie m.in. dwie nadpisane metody:

OnStart (logika wykonywana po uruchomieniu serwisu) i OnStop (logika wykonana przy zamykaniu serwisu).
Naszym zadaniem jest wykonanie jakiegoś ciekawego kodu w tych miejscach i nie tylko w tych 🙂
Co możemy zrobić? Wszystko!
Wysyłać powiadomienia na Skype, mail, SMS.
Wykonywać operacje na bazie danych.
Sprawdzać dostępność jakiś usług. itp.itd…

My przykładowo w OnStart umiejścimy logikę odpowiedzialną za wysyłanie maila, oczywiście drogi czytelniku, możesz zmodyfikować kod i np. utworzyć Timer, który co określony interwał będzie odpytywał zadany adres sieci Web o jakieś dane (i dopiero po pobraniu tych danych wysyłać maila). Tutaj nie będziemy implementować jakiegoś wyszukanego problemu.

Dodajmy poniższy kod do OnStart:

MailMessage message = new MailMessage();
message.From = new MailAddress("Jakiś adres email", "Wyświetlana nazwa");
message.To.Add(new MailAddress("mail, na który zostanie wysłana wiadomość"));
message.Subject = "Tytuł wiadomości";
message.Body = "Treść wiadomości";

SmtpClient smtp = new SmtpClient("adres smtp naszej poczty");
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential("email", "hasło");
smtp.EnableSsl = true;
smtp.Port = 587; //Taki jest dla WP
smtp.Send(message);

Tyle wystarczy by wystartować serwis, więc dajemy! Zmieniamy z Debug na Release i wciskamy F5 i co?
I gówno… 🙂
Otrzymamy komunikat:

--------------------------- Błąd uruchomienia usługi systemu Windows --------------------------- Nie można uruchomić usługi z wiersza polecenia lub z debugera. Usługa systemu Windows musi być najpierw zainstalowana (przy użyciu pliku installutil.exe), a następnie uruchomiona za pomocą Eksploratora serwera, Narzędzi administracyjnych usług systemu Windows lub polecenia NET START. --------------------------- OK    ---------------------------

Błąd uruchomienia usługi systemu windows

Otóż tak jest, iż nie uruchomimy ani nie zdebugujemy (w domyślnej konfiguracji) naszego serwisu. Debugowanie serwisu pokażę w następnym wpisie.

Teraz przejdźmy do rejestracji serwisu.

Na maszynie, na której chcemy zarejestrować nasz serwis otwieramy Wiersz polecenia (cmd) jako administrator i wpisujemy:

sc create MyFirstService binPath= "ścieżka do zbudowanego przez nas serwisu" DisplayName= "Mój pierwszy serwis" start= auto

To wszystko, mamy już gotowy serwis, który będzie uruchamiał się automatycznie. Inne możliwości konfiguracji pod linkiem.
W kolejnej części pokaże jak można debugować usługę sieciową.

 

Poniżej jeszcze najprzydatniejsze polecenia (uruchamianie z CMD jako admin):
sc queryex NazwaUsługi – zwraca informacje o usłudze w tym jej numer PID
taskkill /f /pid NR_PID – ubija serwis, którego nie można zatrzymać – bardzo przydatne polecenie.