Pod jakim użytkownikiem uruchamiane są usługi w systemie Windows. Usługi Windowsa. Czym są usługi

Tryby pracy

W większości przypadków usługi mają zakaz interakcji z konsolą lub pulpitem użytkowników (zarówno lokalnym, jak i zdalnym), jednak dla niektórych usług możliwy jest wyjątek - interakcja z konsolą (sesja numer 0, w której użytkownik jest zalogowany lokalnie lub w momencie uruchomienia usługi mstsc za pomocą klawisza /console).

Istnieje kilka trybów usług:

  • zakaz startu;
  • start ręczny (na życzenie);
  • automatyczne uruchamianie po uruchomieniu komputera;
  • automatyczny (opóźniony) start (wprowadzony w systemach Windows Vista i Windows Server 2008);
  • wymagana usługa/sterownik (automatyczne uruchomienie i brak możliwości (dla użytkownika) zatrzymania usługi).

Tryb tła

Uruchamianie, zatrzymywanie i zmiana usług Windows

Usługi i ich atrybuty można zmienić w MMC:

W różnych wersjach system operacyjny Niektóre usługi mogą być obecne, a inne nie. Niektóre aplikacje i programy instalowane oddzielnie mogą również tworzyć własne usługi.

Lista usług systemu operacyjnego Microsoft Windows

Wyświetlana nazwa Nazwa serwisu Funkcje Opis
Klient DHCP dhcp Rejestruje i aktualizuje adresy IP i rekordy DNS dla tego komputera. Jeśli ta usługa zostanie zatrzymana, ten komputer nie będzie mógł uzyskiwać dynamicznych adresów IP i przeprowadzać aktualizacji DNS.
klient DNS pamięć podręczna DNS Usługa klienta DNS (dnscache) buforuje nazwy DNS (Domain Name System) i rejestruje w pełni kwalifikowaną nazwę ten komputer. Jeśli usługa zostanie zatrzymana, rozpoznawanie nazw DNS będzie kontynuowane. Jednak wyniki kolejek nazw DNS nie zostaną zapisane w pamięci podręcznej, a nazwa komputera nie zostanie zarejestrowana.
KtmRm dla koordynatora transakcji rozproszonych KtmRm Koordynuje transakcje między MSDTC a Kernel Transaction Manager (KTM).
GotowyBoost EMDM gmt GotowyBoost Wsparcie dla poprawy wydajności systemu dzięki technologii ReadyBoost.
Superpobieranie SysMain Superpobieranie Utrzymuje i poprawia wydajność systemu.
Dźwięk Windowsa Audiosrv Zarządzanie dźwiękiem dla programy Windowsa. Jeśli ta usługa zostanie zatrzymana, urządzenia audio i efekty nie będą działać poprawnie.
Miejsce na kartę systemu Windows idsvc Zapewnia bezpieczny sposób tworzenia, zarządzania i ujawniania tożsamości cyfrowych.
Automatyczna aktualizacja WUAUSERW Obejmuje pobieranie i instalację Aktualizacje Windowsa. Jeśli usługa jest wyłączona, nie będziesz mógł korzystać z funkcji na tym komputerze. automatyczna aktualizacja lub witrynę Windows Update w sieci Web.

Lista usług tworzonych przez aplikacje i programy firmy Microsoft

Lista usług utworzonych przez aplikacje i programy innych firm

Zobacz też

Lista usług systemu Windows

Spinki do mankietów

  • pcs.suite101.com/article.cfm/index_of_services: Indeks usług systemu Windows XP — indeks usług działających w systemie Windows XP system operacyjny
  • Jak usunąć usługę Windows Vista lub Windows XP
  • Usługi systemu Windows XP (rosyjski)

Fundacja Wikimedia. 2010 .

Zobacz, co „Usługi systemu Windows” znajduje się w innych słownikach:

    Usługi Windows SharePoint Services (WSS) darmowy dodatek Do Microsoft Windows Server 2003 i 2008, który implementuje w pełni funkcjonalną platformę internetową z obsługą następujących funkcji: System zarządzania treścią Narzędzia do współpracy ... ... Wikipedia

    Microsoft Developer Rodzina systemów operacyjnych Windows ... Wikipedia

    Składnik Microsoft Windows ... Wikipedia


Usługa Windows NT (usługa Windows NT) to specjalny proces, który ma ujednolicony interfejs do interakcji z systemem operacyjnym. systemu Windows NT. Usługi dzielą się na dwa typy — usługi Win32, które wchodzą w interakcję z systemem operacyjnym za pośrednictwem Menedżera kontroli usług (SCM) oraz sterowniki działające w oparciu o protokół sterownika. Urządzenia z systemem Windows NT. W pozostałej części tego artykułu omówimy tylko usługi Win32.

Zastosowanie usług

Jedną z najważniejszych właściwości usługi jest brak interaktywności. Typowa usługa działa w tle, niewidoczna dla przeciętnego użytkownika. Z tego powodu usługi najlepiej nadają się do implementacji następujących typów aplikacji:

  • Serwery w architekturze klient-serwer (np. MS SQL, MS Exchange Server)
  • Sieć usługi okienne NT (serwer, stacja robocza);
  • Serwerowe (w sensie funkcjonalności) komponenty aplikacji rozproszonych (na przykład różne programy monitorujące).

Podstawowe właściwości usług

Usługa różni się od zwykłej aplikacji Win32 na 3 główne sposoby. Rozważmy każdy z nich.

Po pierwsze, jest to możliwość płynnego zatrzymania (zawieszenia) usługi. Użytkownik lub inna aplikacja korzystając ze standardowych mechanizmów ma możliwość zmiany stanu usługi - przeniesienia jej ze stanu uruchomionego do stanu wstrzymania, a nawet zatrzymania jej działania. W takim przypadku przed zmianą swojego stanu usługa otrzymuje specjalne powiadomienie, dzięki któremu może wykonać czynności niezbędne do przejścia do nowego stanu, np. zwolnić zajęte zasoby.

Po drugie, możliwość uruchomienia usługi przed zarejestrowaniem użytkownika, a co za tym idzie możliwość pracy w ogóle bez zarejestrowanego użytkownika. Każda usługa może zostać uruchomiona automatycznie przy starcie systemu operacyjnego i zacząć działać jeszcze przed zalogowaniem się użytkownika do systemu.

I wreszcie umiejętność pracy w dowolnym kontekście bezpieczeństwa. Kontekst Zabezpieczenia systemu Windows NT definiuje zestaw praw dostępu procesów do różnych obiektów systemowych i danych. W przeciwieństwie do zwykłej aplikacji Win32, która zawsze działa w kontekście bezpieczeństwa użytkownika aktualnie zalogowanego w systemie, kontekst bezpieczeństwa wykonania usługi może być predefiniowany. Oznacza to, że dla usługi można z góry zdefiniować zestaw jej praw dostępu do obiektów systemu i tym samym ograniczyć zakres jej działania. W przypadku usług istnieje specjalny rodzaj domyślnego kontekstu zabezpieczeń o nazwie System lokalny. Usługa działająca w tym kontekście ma uprawnienia tylko do zasobów komputera lokalnego. Żadne operacje sieciowe nie mogą być wykonywane z uprawnieniami System lokalny, ponieważ ten kontekst ma znaczenie tylko na komputer lokalny i nie jest rozpoznawany przez inne komputery w sieci.

Interakcja usługi z innymi aplikacjami

Każda aplikacja posiadająca odpowiednie uprawnienia może wchodzić w interakcję z usługą. Interakcja polega przede wszystkim na zmianie stanu usługi, czyli jej przeniesieniu do jednego z trzech stanów – uruchomionej (Start), zawieszonej (Pauza), zatrzymanej i odbywa się poprzez przesyłanie żądań SCM. Żądania dzielą się na trzy rodzaje - komunikaty z usług (naprawiające ich stany), żądania związane ze zmianą konfiguracji usługi lub uzyskaniem informacji o niej oraz żądania od aplikacji dotyczące zmiany stanu usługi.

Aby zarządzać usługą, należy najpierw uzyskać jej obsługę za pomocą funkcji Win32 OpenService API. Funkcja StartService uruchamia usługę. W razie potrzeby zmiana stanu usługi odbywa się poprzez wywołanie funkcji ControlService.

Baza usług

Informacje o każdej usłudze są przechowywane w rejestrze - w kluczu HKLM\SYSTEM\CurrentControlSet\Services\ServiceName. Zawiera następujące informacje:

  • Rodzaj usługi. Wskazuje, czy ta aplikacja implementuje tylko jedną usługę (wyłączną), czy też istnieje kilka usług w aplikacji. Ekskluzywna usługa może działać w dowolnym kontekście bezpieczeństwa. Wiele usług w tej samej aplikacji może działać tylko w kontekście LocalSystem.
  • Uruchom typ. Automatycznie — usługa uruchamia się podczas uruchamiania systemu. Na żądanie — usługa jest uruchamiana ręcznie przez użytkownika. Dezaktywowana — usługa nie może zostać uruchomiona.
  • Nazwa modułu wykonywalnego (plik EXE).
  • Rozpocznij zlecenie w odniesieniu do innych usług. W niektórych przypadkach prawidłowe działanie usługi wymaga uruchomienia jednej lub kilku innych usług. W tym przypadku rejestr zawiera informacje o usługach uruchomionych przed tą usługą.
  • Kontekst bezpieczeństwa wykonania usługi ( Nazwa sieci i hasło). Domyślnym kontekstem zabezpieczeń jest LocalSystem.

Aplikacje, które muszą uzyskać informacje o określonej usłudze lub zmienić określone ustawienia usługi, zasadniczo muszą zmienić informacje w bazie danych usługi w rejestrze. Można to zrobić za pomocą odpowiednich funkcji Win32 API:

  • OpenSCManager, CreateService, OpenService, CloseServiceHandle - do stworzenia (otwarcia) usługi;
  • QueryServiceConfig, QueryServiceObjectSecurity, EnumDependentServices, EnumServicesStatus - aby uzyskać informacje o usłudze;
  • ChangeServiceConfig, SetServiceObjectSecurity, LockServiceDatabase, UnlockServiceDatabase, QueryServiceLockStatus — aby zmienić informacje o konfiguracji usługi.

Wewnętrzne usługi.

Aby to zadziałało, aplikacja musi być odpowiednio zaaranżowana, a mianowicie musi zawierać pewien zestaw funkcji (w sensie C++) o określonej funkcjonalności. Rozważmy pokrótce każdy z nich.

główna funkcja

Jak wiesz, główną funkcją jest punkt wejścia dowolnej aplikacji konsolowej Win32. Po uruchomieniu usługi kod tej funkcji zaczyna być wykonywany jako pierwszy. W ciągu 30 sekund od startu główna funkcja musi koniecznie wywołać StartServiceCtrlDispatcher w celu nawiązania połączenia między aplikacją a SCM. Cała komunikacja między dowolną usługą w tej aplikacji a SCM odbywa się wewnątrz funkcji StartServiceCtrlDispatcher, która kończy działanie dopiero po zatrzymaniu wszystkich usług w aplikacji.

Funkcja ServiceMain

Oprócz ogólnoprocesowego punktu wejścia istnieje również osobny punkt wejścia dla każdej z usług zaimplementowanych w aplikacji. Nazwy funkcji będących punktami wejścia usług (dla uproszczenia nazwijmy je wszystkie tak samo - ServiceMain) są przekazywane do SCM w jednym z parametrów przy wywołaniu StartServiceCtrlDispatcher. Po uruchomieniu każdej usługi tworzony jest osobny wątek do uruchamiania ServiceMain.

Po uzyskaniu kontroli ServiceMain musi najpierw zarejestrować funkcję obsługi żądania usługi, funkcję Handler dla każdej usługi w aplikacji. Po tym ServiceMain zwykle następuje akcja inicjująca usługę - przydzielanie pamięci, odczytywanie danych itp. Czynnościom tym musi towarzyszyć powiadomienie do SCM, że usługa jest nadal w trakcie uruchamiania i nie wystąpiły żadne awarie. Powiadomienia wysyłane są za pomocą wywołań funkcji SetServiceStatus. Wszystkie oprócz ostatniego wywołania muszą mieć numer SERVICE_START_PENDING, a ostatni musi mieć numer SERVICE_RUNNING. Częstotliwość wywołań jest ustalana przez wykonawcę usługi na podstawie następującego warunku: długość odstępu czasowego pomiędzy dwoma sąsiednimi wywołaniami SetServiceStatus nie może przekroczyć wartości parametru dwWaitHint przekazanej do SCM podczas pierwszego z dwóch wywołań. W przeciwnym razie SCM siłą zatrzyma usługę, jeśli nie otrzyma kolejnego powiadomienia na czas. Metoda ta pozwala uniknąć sytuacji, w której serwis startuje w wyniku wystąpienia pewnych awarii (przypomnijmy, że serwisy są zazwyczaj nieinteraktywne i mogą być uruchamiane pod nieobecność użytkownika). Zwykła praktyka polega na tym, że po zakończeniu następnego kroku inicjalizacji SCM jest powiadamiany.

Funkcja obsługi

Jak wspomniano powyżej, Handler jest prototypem funkcji wywołania zwrotnego, obsługi żądania usługi, specyficznej dla każdej usługi w aplikacji. Handler jest wywoływany, gdy usługa otrzymuje żądanie (start, pauza, wznowienie, stop, komunikat o bieżącym stanie) i wykonuje niezbędne działania zgodnie z żądaniem, po czym zgłasza nowy stan do SCM.

W szczególności należy zwrócić uwagę na jedno żądanie - żądanie, które pojawia się podczas zamykania systemu (Shutdown). Żądanie to sygnalizuje potrzebę wykonania deinicjalizacji i zakończenia. Microsoft twierdzi, że każda usługa ma 20 sekund na wyłączenie, po czym jest zmuszona do zatrzymania. Testy wykazały jednak, że warunek ten nie zawsze jest spełniony i usługa zostaje wymuszona przed upływem tego czasu.

System bezpieczeństwa usług

Wszelkie działania na usługach wymagają, aby aplikacja posiadała odpowiednie uprawnienia. Wszystkie aplikacje mają uprawnienia do łączenia się z SCM, wyliczania usług i sprawdzania, czy baza danych usług jest zablokowana. Tylko aplikacje posiadające uprawnienia administracyjne mogą zarejestrować nową usługę w systemie lub zablokować bazę usług.

Każda usługa ma deskryptor bezpieczeństwa, który opisuje, którzy użytkownicy są upoważnieni do wykonywania której operacji. Domyślny:

  • Wszyscy użytkownicy mają uprawnienia SERVICE_QUERY_CONFIG, SERVICE_QUERY_STATUS, SERVICE_ENUMERATE_DEPENDENTS, SERVICE_INTERROGATE i SERVICE_USER_DEFINED_CONTROL;
  • Użytkownicy z grupy Power Users i konto LocalSystem mają dodatkowo uprawnienia SERVICE_START, SERVICE_PAUSE_CONTINUE i SERVICE_STOP;
  • Użytkownicy z grup Administratorzy i Operatorzy systemu mają uprawnienie SERVICE_ALL_ACCESS.

Usługi i interaktywność

Domyślnie usługi interaktywne mogą działać tylko w kontekście zabezpieczeń LocalSystem. Wynika to ze specyfiki wyświetlania monitora w systemie Windows NT, gdzie na przykład istnieje taki obiekt jak „Pulpit”, do pracy z którym trzeba mieć odpowiednie prawa dostępu, które mogą nie być dostępne dla dowolnego konto, inny niż LocalSystem. Pomimo tego, że w zdecydowanej większości przypadków ograniczenie to nie jest znaczące, to jednak czasami zachodzi potrzeba stworzenia usługi, która wyświetlałaby informacje na ekranie monitora i jednocześnie działałaby w innym kontekście bezpieczeństwa niż LocalSystem, na przykład składnik serwera aplikacji do uruchamiania aplikacji na komputerze zdalnym.

Fragment kodu z . ilustruje tę możliwość.

We fragmencie tym, w odpowiedzi na żądanie wysłane przez stronę kliencką aplikacji w wyniku RPC, usługa wyświetla komunikat tekstowy na ekranie monitora.

Przykład usługi (fragmenty klucza)

Przyjrzyjmy się przykładowi fragmentów klucza aplikacji C++, która implementuje usługę Windows NT. Dla jasności pominięto nieistotne części kodu.

główna funkcja

Pokazano kod głównej funkcji.

Funkcja ServiceMain

Cechą kodu zawartego w ServiceMain jest to, że często nie da się z góry przewidzieć czasu wykonania operacji, zwłaszcza biorąc pod uwagę, że jej wykonanie odbywa się w systemie operacyjnym z wielozadaniowością z wywłaszczaniem. Jeżeli operacja trwa dłużej niż przedział czasu określony w parametrze wywołania SetServiceStatus, usługa nie będzie mogła wysłać kolejnego powiadomienia na czas, co spowoduje zatrzymanie działania SCM. Przykładami potencjalnych operacji są wywołania funkcji sieciowych z dużymi limitami czasu lub jednorazowym odczytem duża liczba informacje z wolnych mediów. Ponadto takie podejście jest całkowicie nie do zastosowania podczas debugowania usługi, ponieważ wykonywaniu programu w debugerze towarzyszą duże przerwy, które są niezbędne dla programisty.

Aby przezwyciężyć ten problem, wszystkie interakcje z SCM powinny być wykonywane w osobnym wątku, niezależnie od działań, które mają miejsce podczas fazy inicjalizacji.

B pokazuje algorytm poprawnego uruchomienia usługi z wykorzystaniem wątku pomocniczego.

Funkcja obsługi

B pokazuje kod funkcji Handler i wątków pomocniczych. Dla żądań „Stop” i „Shutdown” stosowany jest algorytm płynnego zatrzymania usługi, podobny do tego stosowanego przy uruchamianiu usługi, z tą różnicą, że parametr SERVICE_STOP_PENDING jest przekazywany do SetserviceStatus zamiast parametru SERVICE_START_PENDING, a SERVICE_STOPPED zamiast SERVICE_RUNNING.

Idealnie byłoby, gdyby zapytania „Wstrzymaj” i „Kontynuuj” również korzystały z tego podejścia. Dociekliwy czytelnik może łatwo wdrożyć go na podstawie tych przykładów.

Wniosek

Podsumowując, chciałbym zauważyć, że wraz z przejściem na Windows NT 2000 rozwój usług nie uległ zmianie. Usługi nadal stanowią ważną część oprogramowania na platformie Windows, dając programistom dużo pracy.


// Funkcja podobna do 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; int result; // Zapisz bieżącą "Stację okienną" obiekty " i "Desktop". GetDesktopWindow(); hwinstaSave = GetProcessWindowStation(); dwThreadId = GetCurrentThreadId(); hdeskSave = GetThreadDesktop(dwThreadId); // Zmień kontekst zabezpieczeń na ten, który ma // wywołujący klient RPC // i uzyskaj dostęp do użytkownika // obiektów „Window station” i „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); return 0; ) SetThreadDesktop(hdeskUser); // Wyświetlenie normalnego pola tekstowego. wynik = MessageBox(NULL, lpszText, lpszTitle, fuStyle); // Przywróć zapisane obiekty // „Stacja okienna” i „Pulpit”. SetThreadDesktop(hdeskSave); SetProcessWindowStation(hwinstaSave); CloseDesktop(hdeskUser); CloseWindowStation(hwinstaUser); zwróć wynik; ) void main() ( SERVICE_TABLE_ENTRY steTable = ( (SERVICENAME, ServiceMain), (NULL, NULL) ); // Nawiąż połączenie z SCM. Wewnątrz tej funkcji // żądania są odbierane i wysyłane. StartServiceCtrlDispatcher(steTable); ) void WINAPI ServiceMain (DWORD dwArgc, LPSTR *psArgv) ( // Natychmiast zarejestruj procedurę obsługi żądania. hSS = RegisterServiceCtrlHandler(SERVICENAME, ServiceHandler); sStatus.dwCheckPoint = 0; sStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; sStatServiceSpecatSERVus.dw dwServiceSpecificExitCode = 0; sStatus.dwServiceSpecificExitCode = 0; sStatus.dwServiceSpecificExitCode = 0; ; sStatus.dwWaitHint = 0; sStatus.dwWin32ExitCode = NOERROR; // Aby zainicjować usługę, wywoływana jest funkcja InitService(); // Aby upewnić się, że system nie zwalnia usługi podczas procesu inicjalizacji, uruchamiany jest wątek, który co // sekundę zgłasza, że ​​usługa jest w trakcie inicjalizacji. // Tworzone jest zdarzenie synchronizujące wątek. // Następnie uruchamiany jest wątek roboczy, // tworzone jest również zdarzenie w celu jego synchronizacji. hSendStartPending = CreateEvent(NULL, PRAWDA, FAŁSZ, NULL); UCHWYT hWyślijStartWątek; DWORD dwIdentyfikator wątku; hSendStartThread = CreateThread(NULL, 0, SendStartPending, NULL, 0, &dwThreadId); //Cała inicjalizacja usługi odbywa się tutaj. InitService(); SetEvent(hSendStartPending); if(WaitForSingleObject(hSendStartThread, 2000) != WAIT_OBJECT_0) ( TerminateThread(hSendStartThread, 0); ) CloseHandle(hSendStartPending); CloseHandle(hSendStartThread); hWork = CreateEvent(NULL, PRAWDA, FAŁSZ, NULL); hServiceThread = CreateThread(NULL, 0, ServiceFunc, 0, 0, &dwThreadId); sStatus.dwCurrentState = USŁUGA_URUCHOMIONA; SetServiceStatus(hSS, &sStatus); ) // Funkcja wątku, która co sekundę wysyła powiadomienia do SCM // o trwającym procesie inicjalizacji. Funkcja kończy się // po ustawieniu zdarzenia hSendStartPending //. DWORD WINAPI SendStartPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_START_PENDING; sStatus.dwWaitHint = 2000; // „Sleep” przez 1 sekundę. Jeśli po 1 sekundzie // zdarzenie hSendStartPending nie przeszło // do zasygnalizowany stan ( // inicjalizacja usługi nie została zakończona), wysyłamy kolejne powiadomienie, // ustawiając maksymalny przedział czasu // na 2 sekundy, aby mieć margines czasu przed // kolejnym powiadomieniem. while (true) ( SetServiceStatus(hSS, &sStatus);sStatus .dwCheckPoint++;if(WaitForSingleObject(hSendStartPending, 1000)!=OCZEKAJ_TIMEOUT) break; ) sStatus.dwCheckPoint = 0; return 0; ) // Funkcja inicjująca usługę. Odczytywanie danych, // przydzielanie pamięci itp. void InitService() ( ... ) // Funkcja zawierająca kod serwisowy. DWORD WINAPI ServiceFunc(LPVOID) ( while (true) ( ​​if (!bPause) ( // Zawiera kod, który zazwyczaj // wykonuje jakąś cykliczną operację... ) if (WaitForSingleObject(hWork, 1000)!=CZAS_OCZEKIWANIA ) break; ) return 0; ) // Program obsługi żądania z SCM void 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, PRAWDA, FAŁSZ, 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_SSSTOPPED; , &sStan); przerwa; przypadek SERVICE_CONTROL_PAUSE: bPause = true; sStatus.dwCurrentState = USŁUGA_WSTRZYMANA; SetServiceStatus(hSS, &sStatus); przerwa; przypadek SERVICE_CONTROL_CONTINUE: bPause = true; sStatus.dwCurrentState = USŁUGA_URUCHOMIONA; SetServiceStatus(hSS, &sStatus); przerwa; przypadek SERVICE_CONTROL_INTERROGATE: SetServiceStatus(hSS, &sStatus); przerwa; domyślnie: SetServiceStatus(hSS, &sStatus); przerwa; ) ) // Funkcja wątku podobna do SendStartPending // do zatrzymania usługi. DWORD WINAPI SendStopPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_STOP_PENDING; sStatus.dwWaitHint = 2000; while (true) ( ​​SetServiceStatus(hSS, &sStatus); sStatus.dwCheckPoint++; if(WaitPP(h0Sendle),SendingObject ! = CZAS_OCZEKIWANIA) przerwa; ) sStatus.dwCheckPoint = 0; zwróć 0; )

Jak uruchomić aplikację jako usługę systemu Windows

Czy można uruchomić aplikację kliencką jako usługę? W jednym z nich opisałem, jak stworzyć usługę Windows przy użyciu zwykłych narzędzi systemu operacyjnego. Jednak nie każda aplikacja konsolowa będzie mogła działać jako usługa, a programy z interfejsem graficznym w zasadzie nie mogą działać w ten sposób. Ale nadal istnieje możliwość uruchomienia aplikacji jako usługi, a program o oryginalnej nazwie nam w tym pomoże. Niessący kierownik serwisu.

NSSM jest bezpłatny oprogramowanie Z otwarte źródło i obsługuje wszystkie systemy operacyjne Microsoft od Windows 2000 do Windows 8. NSSM nie wymaga instalacji, wystarczy go pobrać i rozpakować. Zestaw dystrybucyjny zawiera wersje dla 32-bitowego i 64-bitowego systemu operacyjnego. Program można pobrać ze strony nssm.cc, w tej chwili najnowsza stabilna wersja to 2.21.1, z której będę korzystał.

Aby zademonstrować możliwości NSSM, spróbujmy uruchomić Notatnik Windowsa jako usługa w systemie Windows 8.1.

Utwórz usługę

Aby utworzyć usługę o nazwie notatnik uruchom konsolę poleceń, przejdź do folderu z rozpakowanym NSSM (dla Windows 64-bit) i wpisz komendę nssm install notepad, która otworzy okno graficznego instalatora NSSM. Aby utworzyć usługę, wystarczy podać w polu Ścieżka ścieżkę do pliku wykonywalnego i kliknąć przycisk „Zainstaluj usługę”. Dodatkowo w polu Opcje możesz określić klucze wymagane do uruchomienia usługi.

Również na etapie tworzenia nowej usługi możesz określić dodatkowe parametry.

Karta Zamykanie zawiera listę metod zamykania i limitów czasu używanych podczas normalnego lub awaryjnego zamykania aplikacji. Gdy NSSM otrzyma polecenie zatrzymania (np. gdy aplikacja zakończy działanie), próbuje zatrzymać kontrolowaną aplikację w normalny sposób. Jeśli aplikacja nie odpowiada, NSSM może wymusić zakończenie wszystkich procesów i podprocesów tej aplikacji.

W sumie istnieją cztery kroki zamykania aplikacji i domyślnie będą one używane w następującej kolejności:

W pierwszym kroku NSSM próbuje wygenerować i wysłać zdarzenie ctrl+c. Ta metoda działa dobrze w przypadku aplikacji konsolowych lub skryptów, ale nie w przypadku aplikacji graficznych;
Następnie NSSM wykrywa wszystkie okna utworzone przez aplikację i wysyła do nich komunikat WM_CLOSE, aby wymusić zamknięcie aplikacji;
W trzecim kroku NSSM ocenia wszystkie wątki utworzone przez aplikację i wysyła do nich komunikat WM_QUIT, który zostanie odebrany, jeśli aplikacja posiada kolejkę komunikatów wątków;
W ostateczności NSSM może wywołać metodę TerminateProcess(), wymuszając zakończenie działania aplikacji.

Możliwe jest jednak wyłączenie niektórych lub nawet wszystkich metod różne aplikacje działają różne metody, a dla prawidłowego zamknięcia aplikacji zaleca się pozostawienie wszystkiego bez zmian.

Domyślnie w przypadku awarii usługi NSSM próbuje ją ponownie uruchomić. W zakładce „Akcje wyjścia” możesz zmienić automatyczną akcję w przypadku nieprawidłowego zamknięcia aplikacji, a także ustawić opóźnienie przed automatycznym ponownym uruchomieniem aplikacji.

W zakładce „Wejście/Wyjście (I/O)” można ustawić przekierowanie wejścia/wyjścia aplikacji do określonego pliku.

Na karcie „Środowisko” możesz ustawić nowe zmienne środowiskowe dla usługi lub nadpisać istniejące.

Możesz także nie używać powłoki graficznej i natychmiast utworzyć usługę w konsoli za pomocą następującego polecenia:

nssm zainstaluj notatnik ″C:\Windows\system32\notepad.exe″

Zarządzanie usługami

Po utworzeniu usługi za pomocą NSSM przejdź do przystawki Usługi i znajdź usługę notatnika. Jak widać, z wyglądu nie różni się niczym od innych usług, możemy ją również uruchomić, zatrzymać czy zmienić tryb startu. Należy jednak pamiętać, że nssm.exe jest wymieniony jako plik wykonywalny.

A jeśli przejdziesz do Menedżera zadań, zobaczymy następujący obraz: NSSM działa jako proces główny (nadrzędny), usługa notatnika działa jako proces podrzędny, a aplikacja Notatnik jest już uruchomiona w tym procesie podrzędnym.

Usuwanie usługi

Aby usunąć usługę, wprowadź polecenie nssm remove notepad i potwierdź jej usunięcie. A wpisując nssm usuń notatnik potwierdź , możesz obejść się bez potwierdzenia.

Interaktywne uruchamianie usługi

Główna różnica niestandardowa aplikacja z usługi polega na tym, że po uruchomieniu aplikacja może wymagać dodatkowych działań ze strony użytkownika, aby kontynuować pracę - na przykład kliknięcia przycisku lub wpisania polecenia. Aby to zrobić, trzeba uzyskać do niego dostęp, co jak się okazuje nie jest takie proste.

Aby uruchomić usługę w trybie interaktywnym, należy otworzyć jej właściwości w przystawce Usługi i na karcie „Logowanie” zaznaczyć pole wyboru „Zezwól na interakcję z pulpitem”.

I wtedy zaczynają się cuda 🙂 Usługa uruchomiona w trybie interaktywnym otwiera się w izolowanej sesji (sesja 0). Dostęp do tej sesji może uzyskać tylko usługa wykrywania usług interaktywnych (ui0detect), która monitoruje uruchamianie usług interaktywnych na komputerze i generuje alert. W Windows 7\Server 2008 ta usługa jest domyślnie włączona, ale w Windows 8\Server 2012 jest wyłączona i nie pojawia się w przystawce graficznej Usługi (przynajmniej ja jej tam nie znalazłem). Co więcej, jeśli znajdziesz tę tajemniczą usługę i spróbujesz ją uruchomić, otrzymasz komunikat o błędzie.

Ale faktem jest, że aby go uruchomić, musisz zezwolić na uruchomienie usług interaktywnych na komputerze. Dlatego otwieramy edytor rejestru, znajdujemy w sekcji HKLM\System\CurrentControlSet\Control\Windows parametr DWORD o nazwie Brak usług interaktywnych i ustawić jego wartość na 0 .

Następnie otwieramy konsolę PowerShell i uruchamiamy usługę wykrywania za pomocą polecenia:

Start-Service -Nazwa ui0detect

Po upewnieniu się, że usługa wykrywania jest uruchomiona, ponownie uruchamiamy usługę notatnika i otrzymujemy to okno. Wybierz „Wyświetl wiadomość”

i przejdź do sesji zerowej, w której działa nasza aplikacja. Następnie wykonujemy z nim niezbędne czynności i wracamy.

Takie ciekawe rozwiązanie do uruchamiania aplikacji jako usług Windows. Nie najładniejsza, ale całkiem wierna swojej nazwie 🙂

Ostatnia aktualizacja: 31.10.2015

Usługi są jednym z najważniejszych składników systemu operacyjnego Windows. W rzeczywistości są to osobne aplikacje, które nie mają interfejsu graficznego i które wykonują różne zadania w tle. Usługi mogą być uruchamiane przy starcie systemu operacyjnego lub w dowolnym innym momencie pracy użytkownika. Typowym przykładem usług są różne serwery internetowe, które nasłuchują w tle na określonym porcie w poszukiwaniu połączeń, a jeśli istnieją połączenia, wchodzą z nimi w interakcję. Mogą to być również różne pomocnicze usługi aktualizacyjne dla innych zainstalowane programy które kontaktują się z serwerem, aby sprawdzić, czy istnieje nowa wersja Aplikacje. Ogólnie możemy otworzyć panel usług i zobaczyć na własne oczy wszystkie zainstalowane i uruchomione usługi:

Przyjrzyjmy się, jak tworzyć własne usługi w języku C#. Jako zadanie do realizacji wybierzemy monitorowanie zmian w określonym folderze w systemie plików. Teraz utwórzmy usługę, aby ją uruchomić.

Najpierw utwórzmy nowy projekt, który będzie typu Windows Service . Nazwijmy projekt FileWatcherService:

Następnie Visual Studio generuje projekt, który zawiera wszystko, czego potrzebujesz. Chociaż w zasadzie nie musimy wybierać tego konkretnego typu projektu, możemy stworzyć projekt biblioteki klas, a następnie zdefiniować w nim wszystkie wymagane klasy.

Nowy projekt wygląda więc tak:

Istnieje również plik Program.cs oraz sam węzeł usługi Service1.cs.

Usługa reprezentuje normalną aplikację, ale nie uruchamia się sama. Wszystkie połączenia i dostęp do niego przechodzą przez Service Control Manager (SCM). Gdy usługa jest uruchamiana automatycznie podczas uruchamiania systemu lub ręcznie, SCM wywołuje metodę Main w klasie Program:

Klasa statyczna Program ( static void Main() ( ServiceBase ServicesToRun; ServicesToRun = new ServiceBase ( new Service1() ); ServiceBase.Run(ServicesToRun); ) )

Metoda Main jest domyślnie zdefiniowana do uruchamiania wielu usług jednocześnie, które są zdefiniowane w tablicy ServicesToRun. Jednak domyślnie projekt zawiera tylko jedną usługę, Service1. Samo uruchomienie odbywa się za pomocą metody Run: ServiceBase.Run(ServicesToRun) .

Sama usługa, która ma zostać uruchomiona, jest reprezentowana przez węzeł Service1.cs. Jednak nie jest to tak naprawdę prosty plik kodu. Jeśli otworzymy ten węzeł, zobaczymy plik projektanta usług Service1.Designer.cs oraz znajdującą się w nim klasę Service1.

Klasa Service1 faktycznie reprezentuje usługę. Domyślnie ma następujący kod:

Korzystanie z systemu; przy użyciu System.Collections.Generic; przy użyciu System.ComponentModel; przy użyciu System.Data; za pomocą System.Diagnostics; przy użyciu System.Linq; przy użyciu System.ServiceProcess; przy użyciu System.Text; przy użyciu System.Threading.Tasks; namespace FileWatcherService ( publiczna klasa częściowa Service1: ServiceBase ( public Service1() ( InitializeComponent(); ) chronione nadpisanie void OnStart(string args) ( ) chronione nadpisanie void OnStop() ( ) ) )

Klasa usługi musi dziedziczyć z klasy bazowej ServiceBase. Klasa ta definiuje szereg metod, z których najważniejsze to metoda OnStart() uruchamiająca akcje wykonywane przez usługę oraz metoda OnStop(), która zatrzymuje usługę.

Po wywołaniu przez SCM metody Main i zarejestrowaniu usługi jest ona wywoływana bezpośrednio przez uruchomienie metody OnStart.

W konsoli usług lub przez wiersz poleceń wysyłamy polecenie zatrzymania usługi, następnie SCM wywołuje metodę OnStop, aby ją zatrzymać.

Oprócz tych dwóch metod w klasie usług można zastąpić kilka innych metod klasy bazowej ServiceBase:

    OnPause : wywoływana, gdy usługa jest wstrzymana

    OnContinue : Wywoływana, gdy usługa jest wznawiana po jej zawieszeniu

    OnShutdown : Wywoływana, gdy system Windows jest zamykany

    OnPowerEvent : wywoływane, gdy zmienia się tryb zasilania

    OnCustomCommand : Wywoływana, gdy usługa otrzymuje niestandardowe polecenie z Service Control Manager (SCM)

Konstruktor klasy Service1 wywołuje metodę InitializeComponent(), która jest zdefiniowana w pliku projektanta Service1.Designer.cs:

Przestrzeń nazw FileWatcherService ( klasa częściowa Service1 ( private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) ( if (disposing && (components != null)) ( components.Dispose(); ) base.Dispose(disposing ); ) private void InitializeComponent() ( components = new System.ComponentModel.Container(); this.ServiceName = "Service1"; ) ) )

Jedyną rzeczą, na którą należy zwrócić uwagę, jest ustawienie nazwy usługi (właściwość ServiceName):

This.ServiceName = "Usługa1";

Jest to nazwa, która będzie wyświetlana w konsoli usług po zainstalowaniu usługi. Możemy to zmienić lub zostawić tak, jak jest.

Teraz zmieńmy kod serwisowy w następujący sposób:

Korzystanie z systemu; przy użyciu System.ServiceProcess; przy użyciu System.IO; przy użyciu System.Threading; namespace FileWatcherService ( publiczna klasa częściowa Service1: ServiceBase ( Logger logger; public Service1() ( InitializeComponent(); this.CanStop = true; this.CanPauseAndContinue = true; this.AutoLog = true; ) chronione nadpisanie void OnStart(string arguments) ( logger = nowy Logger(); wątek loggerThread = nowy wątek(nowy ThreadStart(logger.Start)); loggerThread.Start(); ) chronione nadpisanie void OnStop() ( logger.Stop(); Thread.Sleep(1000); ) ) class Logger ( FileSystemWatcher obserwator; obiekt obj = nowy obiekt(); bool włączony = prawda; public Logger() ( obserwator = nowy FileSystemWatcher("D:\\Temp"); watcher.Deleted += Watcher_Deleted; watcher.Created + = 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; enable = false; ) // zmień nazwę plików private void Watcher_Renamed(object sender, RenamedEventArgs e) ( string fileEvent = "zmieniono nazwę na " + e.FullPath; ciąg Ścieżka do pliku = e.StaraPełnaŚcieżka; RecordEntry(fileEvent, filePath); ) // zmiana plików private void Watcher_Changed(object sender, FileSystemEventArgs e) ( string fileEvent = "zmieniony"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // tworzenie plików private void Watcher_Created(object sender, FileSystemEventArgs e) ( string fileEvent = "created"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // usuń pliki private void Watcher_Deleted(object sender, FileSystemEventArgs e) ( string fileEvent = "usunięto"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) private void RecordEntry(string fileEvent, string filePath) ( lock (obj) ( using (StreamWriter writer = new StreamWriter("D:\\templog.txt", true)) ( writer.WriteLine(String.Format("(0) file(1) was(2)", DateTime.Now.ToString("dd/MM/rrrr hh:mm:ss"), filePath, fileEvent)); writer. Spłukać(); ) ) ) ) )

Kluczową klasą zawierającą całą funkcjonalność jest klasa Logger. Za pomocą obiektu FileSystemWatcher będzie monitorować zmiany w folderze D://Temp. Metoda Start() określa, że ​​będziemy obserwować zmiany za pośrednictwem obiektu FileSystemWatcher. I cała praca pójdzie tak długo, jak długo włączona zmienna boolowska ma wartość true . A metoda Stop() pozwoli ci zakończyć klasę.

Zdarzenia FileSystemWatcher umożliwiają monitorowanie wszystkich zmian w obserwowanym folderze. Spowoduje to zarejestrowanie zmian w pliku templog.txt. Aby uniknąć wyścigu zasobów o plik templog.txt, w którym zapisywane są zmiany, procedura zapisu jest blokowana przez kod pośredniczący lock(obj).

W rezultacie po utworzeniu, zmodyfikowaniu, zmianie nazwy i usunięciu plik dziennika będzie zawierał coś takiego:

07/30/2015 12:15:40 PM plik D:\Temp\New Text Document.txt został utworzony 07/30/2015 12:15:46 PM plik D:\Temp\New Text Document.txt została zmieniona na D:\Temp\hello.txt 07/30/2015 12:15:55 PM plik D:\Temp\hello.txt został zmodyfikowany 07/30/2015 12:15:55 PM plik D:\Temp\ hello.txt został zmodyfikowany 07/30/2015 12:16:01 plik D: \Temp\hello.txt został usunięty

W samej klasie usługi Service1 w konstruktorze ustawia się szereg opcji:

This.CanStop = true; // usługa może zostać zatrzymana this.CanPauseAndContinue = true; // usługa może zostać wstrzymana, a następnie wznowiona this.AutoLog = true; // usługa może zapisywać do dziennika

W metodzie OnStart() wywoływany jest nowy wątek w celu uruchomienia obiektu Logger:

Chronione nadpisanie void OnStart(string args) ( logger = new Logger(); Wątek loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); )

Nowy wątek jest potrzebny, ponieważ bieżący wątek przetwarza tylko polecenia SCM i musi jak najszybciej powrócić z metody OnStart.

Po odebraniu z SCM polecenia zatrzymania usługi uruchamiana jest metoda OnStop, która wywołuje metodę logger.Stop(). Dodatkowe opóźnienie pozwoli na zatrzymanie wątku rejestratora:

Zabezpieczone nadpisanie void OnStop() ( logger.Stop(); Thread.Sleep(1000); )

Sama klasa obsługi to jednak za mało. Musimy również utworzyć instalator usługi.

Lub pulpit użytkowników (zarówno lokalnych jak i zdalnych), jednak dla niektórych usług możliwy jest wyjątek - interakcja z konsolą (sesja numer 0, w której użytkownik jest zalogowany lokalnie lub w momencie uruchomienia usługi mstsc za pomocą klawisza /console).

Istnieje kilka trybów usług:

  • zakaz startu;
  • start ręczny (na życzenie);
  • automatyczne uruchamianie po uruchomieniu komputera;
  • automatyczny (opóźniony) start (wprowadzony w systemach Windows Vista i Windows Server 2008);
  • wymagana usługa/sterownik (automatyczne uruchomienie i brak możliwości (dla użytkownika) zatrzymania usługi).

Tryb tła

Uruchamianie, zatrzymywanie i zmiana usług Windows

Usługi i ich atrybuty można zmienić w MMC:

Różne wersje systemów operacyjnych mogą oferować niektóre usługi, a inne nie. Niektóre aplikacje i programy instalowane oddzielnie mogą również tworzyć własne usługi.

Lista usług systemu operacyjnego Microsoft Windows

Wyświetlana nazwa Nazwa serwisu Funkcje Opis
Klient DHCP dhcp Rejestruje i aktualizuje adresy IP i rekordy DNS dla tego komputera. Jeśli ta usługa zostanie zatrzymana, ten komputer nie będzie mógł uzyskiwać dynamicznych adresów IP i przeprowadzać aktualizacji DNS.
klient DNS pamięć podręczna DNS Usługa klienta DNS (dnscache) buforuje nazwy DNS (Domain Name System) i rejestruje w pełni kwalifikowaną nazwę tego komputera. Jeśli usługa zostanie zatrzymana, rozpoznawanie nazw DNS będzie kontynuowane. Jednak wyniki kolejek nazw DNS nie zostaną zapisane w pamięci podręcznej, a nazwa komputera nie zostanie zarejestrowana.
KtmRm dla koordynatora transakcji rozproszonych KtmRm Koordynuje transakcje między MSDTC a Kernel Transaction Manager (KTM).
GotowyBoost EMDM gmt GotowyBoost Wsparcie dla poprawy wydajności systemu dzięki technologii ReadyBoost.
Superpobieranie SysMain Superpobieranie Utrzymuje i poprawia wydajność systemu.
Dźwięk Windowsa Audiosrv Zarządzanie narzędziami audio dla programów Windows. Jeśli ta usługa zostanie zatrzymana, urządzenia audio i efekty nie będą działać poprawnie.
Miejsce na kartę systemu Windows idsvc Zapewnia bezpieczny sposób tworzenia, zarządzania i ujawniania tożsamości cyfrowych.
Automatyczna aktualizacja WUAUSERW Obejmuje pobieranie i instalowanie aktualizacji systemu Windows. Jeśli usługa jest wyłączona, ten komputer nie będzie mógł korzystać z automatycznych aktualizacji ani z witryny Windows Update w sieci Web.
Zdalne wywołanie procedury (RPC) RpcSs Zapewnia mapowanie między punktami końcowymi i innymi usługami RPC.

Lista usług tworzonych przez aplikacje i programy firmy Microsoft

Przykłady usług tworzonych przez aplikacje i programy stron trzecich

Wyświetlana nazwa Nazwa serwisu Funkcje Opis
Serwer HTTP ESET EhttpSrv ochrona antywirusowa Składnik serwera HTTP ESET