Pod kojim korisnikom su pokrenuti servisi u windows-u. Windows usluge. Šta su usluge

Načini rada

U većini slučajeva uslugama je zabranjena interakcija s konzolom ili radnom površinom korisnika (lokalnih i udaljenih), međutim, za neke servise je moguć izuzetak - interakcija s konzolom (sesija broj 0, u kojoj je korisnik prijavljen lokalno ili kada servis počne mstsc sa ključem /console).

Postoji nekoliko načina za usluge:

  • zabranjeno lansiranje;
  • ručno pokretanje (na zahtjev);
  • automatsko pokretanje kada se računar pokrene;
  • automatsko (odloženo) pokretanje (uvedeno u Windows Vista i Windows Server 2008);
  • potreban servis/driver (automatsko pokretanje i nemogućnost (za korisnika) da zaustavi uslugu).

Pozadinski način rada

Pokretanje, zaustavljanje i mijenjanje Windows servisa

Usluge i njihovi atributi se mogu promijeniti u MMC-u:

U raznim verzijama operativni sistemi Neke usluge mogu biti prisutne, a druge ne. Neke aplikacije i programi instalirani zasebno mogu kreirati i vlastite usluge.

Lista usluga operativnog sistema Microsoft Windows

Ime za prikaz Naziv usluge Funkcije Opis
DHCP klijent dhcp Registruje i ažurira IP adrese i DNS zapise za ovaj računar. Ako se ova usluga zaustavi, ovaj računar neće moći da dobije dinamičke IP adrese i izvrši DNS ažuriranja.
DNS klijent dnscache DNS klijentska usluga (dnscache) kešira DNS (sistem imena domena) imena i registruje potpuno kvalificirano ime ovaj računar. Ako je usluga zaustavljena, razlučivanje DNS imena će se nastaviti. Međutim, rezultati redova DNS imena neće biti keširani i ime računara neće biti registrovano.
KtmRm za koordinatora distribuiranih transakcija KtmRm Koordinira transakcije između MSDTC-a i Kernel Transaction Managera (KTM).
ReadyBoost EMDMgmt ReadyBoost Podrška za poboljšanje performansi sistema uz ReadyBoost tehnologiju.
Superfetch SysMain Superfetch Održava i poboljšava performanse sistema.
Windows Audio Audiosrv Audio menadžment za Windows programi. Ako se ova usluga zaustavi, audio uređaji i efekti neće raditi ispravno.
Windows Card Space idsvc Pruža siguran način za kreiranje, upravljanje i otkrivanje digitalnih identiteta.
Automatsko ažuriranje WUAUSERV Uključuje preuzimanje i instalaciju Windows ažuriranja. Ako je usluga onemogućena, nećete moći koristiti funkcije na ovom računaru. automatsko ažuriranje ili web lokaciju Windows Update.

Lista usluga koje kreiraju Microsoft aplikacije i programi

Lista usluga koje kreiraju aplikacije i programi trećih strana

vidi takođe

Lista Windows usluga

Linkovi

  • pcs.suite101.com/article.cfm/index_of_services: Indeks Windows XP usluga - Indeks usluga koje rade na Windows XP operativni sistem
  • Kako izbrisati uslugu Windows Vista ili Windows XP
  • Windows XP usluge (ruski)

Wikimedia fondacija. 2010 .

Pogledajte šta je "Windows Services" u drugim rječnicima:

    Windows SharePoint Services (WSS) besplatni dodatak to Microsoft Windows Server 2003 i 2008, koji implementira potpuno opremljenu web platformu sa podrškom za sljedeće karakteristike: Sistem upravljanja sadržajem Alati za saradnju ... ... Wikipedia

    Microsoft programer Windows OS porodica ... Wikipedia

    Microsoft Windows komponenta ... Wikipedia


Windows NT usluga (Windows NT servis) je poseban proces koji ima objedinjeni interfejs za interakciju sa operativnim sistemom. Windows sistem NT. Usluge se dijele na dvije vrste - Win32 usluge koje komuniciraju sa operativnim sistemom preko Service Control Manager-a (SCM) i drajvere koji rade preko protokola drajvera. Windows uređaji NT. U nastavku ovog članka ćemo raspravljati samo o Win32 uslugama.

Primjena usluga

Jedno od najvažnijih svojstava usluge je neinteraktivnost. Tipičan servis radi u pozadini, nevidljiv prosječnom korisniku. Zbog toga su usluge najpogodnije za implementaciju sljedećih vrsta aplikacija:

  • Serveri u arhitekturi klijent-server (na primjer, MS SQL, MS Exchange Server)
  • Mreža windows usluge NT (server, radna stanica);
  • Serverske (u smislu funkcionalnosti) komponente distribuiranih aplikacija (na primjer, razni programi za praćenje).

Osnovna svojstva usluga

Usluga se razlikuje od obične Win32 aplikacije na 3 glavna načina. Hajde da razmotrimo svaku od njih.

Prvo, to je mogućnost gracioznog zaustavljanja (suspendovanja) usluge. Korisnik ili druga aplikacija koja koristi standardne mehanizme ima mogućnost da promijeni stanje usluge - da je premjesti iz stanja pokretanja u stanje pauziranja, ili čak da zaustavi njen rad. U tom slučaju, prije promjene stanja, usluga prima posebnu obavijest, zahvaljujući kojoj može izvršiti radnje potrebne za prijelaz u novo stanje, na primjer, osloboditi zauzete resurse.

Drugo, mogućnost pokretanja usluge prije registracije korisnika i, kao rezultat, mogućnost rada bez registriranog korisnika. Bilo koja usluga se može pokrenuti automatski na startu operativnog sistema i početi raditi čak i prije nego što se korisnik prijavi na sistem.

I konačno, sposobnost rada u proizvoljnom sigurnosnom kontekstu. Kontekst Windows sigurnost NT definira skup procesnih prava pristupa različitim sistemskim objektima i podacima. Za razliku od obične Win32 aplikacije, koja uvijek radi pod sigurnosnim kontekstom korisnika koji je trenutno prijavljen na sistem, sigurnosni kontekst izvršenja usluge može biti unaprijed definiran. To znači da je za uslugu moguće unaprijed definirati skup svojih prava pristupa sistemskim objektima i time ograničiti opseg njenih aktivnosti. Za usluge postoji posebna vrsta podrazumevanog bezbednosnog konteksta koji se zove Lokalni sistem. Usluga koja radi u ovom kontekstu ima prava samo na resurse lokalnog računara. Nikakve mrežne operacije se ne mogu izvoditi s lokalnim sistemskim pravima, budući da je ovaj kontekst smislen samo na lokalni računar i ne prepoznaju ga drugi računari na mreži.

Interakcija usluge sa drugim aplikacijama

Svaka aplikacija koja ima odgovarajuća prava može komunicirati sa uslugom. Interakcija, prije svega, podrazumijeva promjenu stanja servisa, odnosno njegovo prebacivanje u jedno od tri stanja - pokrenuto (Start), suspendirano (Pauza), stop, a provodi se podnošenjem SCM zahtjeva. Zahtjevi su tri vrste - poruke od servisa (popravljanje njihovih stanja), zahtjevi koji se odnose na promjenu konfiguracije servisa ili dobijanje informacija o njemu i zahtjevi aplikacija za promjenom stanja usluge.

Da biste upravljali uslugom, prvo morate dobiti njenu oznaku koristeći Win32 OpenService API funkciju. Funkcija StartService pokreće uslugu. Ako je potrebno, promjena stanja usluge se vrši pozivanjem funkcije ControlService.

Servisna baza podataka

Informacije o svakoj usluzi pohranjene su u registratoru - u ključu HKLM\SYSTEM\CurrentControlSet\Services\ServiceName. Sadrži sljedeće informacije:

  • Vrsta usluge. Označava da li ova aplikacija implementira samo jednu uslugu (isključivo) ili postoji nekoliko usluga u aplikaciji. Ekskluzivna usluga može raditi u bilo kojem sigurnosnom kontekstu. Više usluga unutar iste aplikacije može se izvoditi samo u kontekstu LocalSystem.
  • Tip lansiranja. Automatski - usluga počinje pri pokretanju sistema. Na zahtjev - Uslugu pokreće korisnik ručno. Deaktivirano - Usluga se ne može pokrenuti.
  • Ime izvršnog modula (EXE datoteka).
  • Započnite narudžbu u odnosu na druge usluge. U nekim slučajevima, ispravan rad usluge zahtijeva pokretanje jedne ili više drugih usluga. U ovom slučaju, registar sadrži informacije o uslugama koje su pokrenute prije ovog.
  • Sigurnosni kontekst izvršenja usluge ( naziv mreže i lozinku). Zadani sigurnosni kontekst je LocalSystem.

Aplikacije koje trebaju dobiti informacije o određenoj usluzi ili promijeniti određenu postavku usluge u suštini moraju promijeniti informacije u bazi podataka usluge u registru. To se može učiniti putem odgovarajućih Win32 API funkcija:

  • OpenSCManager, CreateService, OpenService, CloseServiceHandle - za kreiranje (otvaranje) usluge;
  • QueryServiceConfig, QueryServiceObjectSecurity, EnumDependentServices, EnumServicesStatus - za dobijanje informacija o servisu;
  • ChangeServiceConfig, SetServiceObjectSecurity, LockServiceDatabase, UnlockServiceDatabase, QueryServiceLockStatus - za promjenu informacija o konfiguraciji usluge.

Interni dijelovi servisa.

Da bi radila, aplikacija mora biti uređena na odgovarajući način, odnosno mora uključivati ​​određeni skup funkcija (u smislu C++) sa određenom funkcionalnošću. Razmotrimo ukratko svaki od njih.

glavna funkcija

Kao što znate, glavna funkcija je ulazna tačka bilo koje Win32 konzolne aplikacije. Kada se servis pokrene, kod za ovu funkciju prvi počinje da se izvršava. Unutar 30 sekundi od početka, glavna funkcija mora nužno pozvati StartServiceCtrlDispatcher da uspostavi vezu između aplikacije i SCM-a. Sva komunikacija između bilo koje usluge u ovoj aplikaciji i SCM-a odvija se unutar funkcije StartServiceCtrlDispatcher, koja izlazi samo kada se sve usluge u aplikaciji zaustave.

ServiceMain funkcija

Pored ulazne tačke za čitav proces, postoji i posebna ulazna tačka za svaku od usluga implementiranih u aplikaciji. Imena funkcija koje su ulazne tačke servisa (radi jednostavnosti, nazovimo ih sve isto - ServiceMain) se prosleđuju SCM-u u jednom od parametara prilikom pozivanja StartServiceCtrlDispatcher. Kada se svaki servis pokrene, kreira se posebna nit za pokretanje ServiceMain-a.

Jednom kada preuzme kontrolu, ServiceMain prvo mora registrirati rukovatelja zahtjeva za uslugu, funkciju Handler, za svaku od usluga u aplikaciji. Nakon toga, ServiceMain obično prati neka akcija za inicijalizaciju usluge - dodjela memorije, čitanje podataka itd. Ove radnje moraju biti popraćene obavještenjima SCM-u da je usluga još uvijek u procesu pokretanja i da nije došlo do kvarova. Obavijesti se šalju pomoću poziva funkcije SetServiceStatus. Svi pozivi osim posljednjeg moraju biti SERVICE_START_PENDING, a posljednji moraju biti SERVICE_RUNNING. Učestalost poziva određuje programer usluge na osnovu sledećeg uslova: trajanje vremenskog intervala između dva susedna poziva SetServiceStatus ne sme da pređe vrednost parametra dwWaitHint koji je prosleđen SCM-u tokom prvog od dva poziva. U suprotnom, SCM će prisilno zaustaviti uslugu ako ne primi još jedno obavještenje na vrijeme. Ova metoda izbjegava situaciju servisa na početku kao rezultat pojave određenih kvarova (podsjetimo da su usluge obično neinteraktivne i mogu se pokrenuti u odsustvu korisnika). Uobičajena praksa je da nakon završetka sljedećeg koraka inicijalizacije, SCM bude obaviješten.

Funkcija rukovaoca

Kao što je gore spomenuto, Handler je prototip funkcije povratnog poziva, rukovatelja zahtjeva za uslugu, specifičnog za svaku uslugu u aplikaciji. Handler se poziva kada servis primi zahtjev (start, pauza, nastavak, zaustavljanje, poruka o trenutnom stanju) i izvrši potrebne radnje u skladu sa zahtjevom, nakon čega prijavljuje novo stanje SCM-u.

Posebno treba istaći jedan zahtjev - zahtjev koji dolazi pri gašenju sistema (Shutdown). Ovaj zahtjev signalizira potrebu da se izvrši deinicijalizacija i prekid. Microsoft tvrdi da se svakom servisu daje 20 sekundi da se isključi, nakon čega je primoran da se zaustavi. Međutim, testovi su pokazali da ovaj uslov nije uvijek ispunjen i da se usluga prisilno zaustavlja prije isteka tog vremenskog perioda.

Usluge sigurnosnog sistema

Svaka radnja na uslugama zahtijeva da aplikacija ima odgovarajuća prava. Sve aplikacije imaju prava za povezivanje na SCM, nabrajanje usluga i provjeru da li je baza podataka usluga zaključana. Samo aplikacije koje imaju administrativna prava mogu registrirati novu uslugu u sistemu ili blokirati bazu podataka usluga.

Svaka usluga ima sigurnosni deskriptor koji opisuje koji su korisnici ovlašteni za obavljanje koje operacije. Zadano:

  • Svi korisnici imaju prava SERVICE_QUERY_CONFIG, SERVICE_QUERY_STATUS, SERVICE_ENUMERATE_DEPENDENTS, SERVICE_INTERROGATE i SERVICE_USER_DEFINED_CONTROL;
  • Korisnici u grupi Power Users i LocalSystem nalogu dodatno imaju prava SERVICE_START, SERVICE_PAUSE_CONTINUE i SERVICE_STOP;
  • Korisnici u grupama Administratori i Operatori sistema imaju pravo SERVICE_ALL_ACCESS.

Usluge i interaktivnost

Podrazumevano, interaktivne usluge mogu da rade samo u bezbednosnom kontekstu LocalSystem. To je zbog posebnosti prikaza monitora u Windows NT-u, gdje, na primjer, postoji takav objekat kao što je "Desktop", za rad s kojim morate imati odgovarajuća prava pristupa, koja možda neće biti dostupna proizvoljnom račun, osim LocalSystem. Unatoč činjenici da u velikoj većini slučajeva ovo ograničenje nije značajno, međutim, ponekad postoji potreba za kreiranjem usluge koja bi prikazivala informacije na ekranu monitora i istovremeno bi radila u sigurnosnom kontekstu koji nije LocalSystem, na primjer, komponenta poslužitelja aplikacija za pokretanje aplikacija na udaljenom računalu.

Isječak koda iz . ilustruje ovu mogućnost.

U ovom fragmentu, kao odgovor na zahtjev koji je poslala klijentska strana aplikacije kao RPC posljedicu, usluga prikazuje tekstualnu poruku na ekranu monitora.

Primjer usluge (ključni isječci)

Pogledajmo primjer ključnih fragmenata C++ aplikacije koja implementira Windows NT uslugu. Radi jasnoće, nebitni dijelovi koda su izostavljeni.

glavna funkcija

Prikazan je kod za glavnu funkciju.

ServiceMain funkcija

Karakteristika koda sadržanog u ServiceMain-u je da je često nemoguće unapred predvideti vreme izvršenja operacije, posebno kada se uzme u obzir da se njeno izvršavanje odvija u operativnom sistemu sa preventivnim multitaskingom. Ako operacija traje duže od vremenskog intervala navedenog u parametru poziva SetServiceStatus, usluga neće moći poslati sljedeće obavještenje na vrijeme, što će uzrokovati da SCM zaustavi svoj rad. Primjeri potencijalnih operacija su pozivi mrežnim funkcijama s velikim vremenskim ograničenjem ili jednokratno čitanje veliki broj informacije iz sporih medija. Osim toga, ovaj pristup je potpuno neprimjenjiv pri otklanjanju grešaka u servisu, jer je izvršavanje programa u debugger-u praćeno velikim pauzama koje su potrebne programeru.

Da bi se prevazišao ovaj problem, sve interakcije sa SCM-om treba da se obavljaju u posebnoj niti, nezavisno od akcija koje se dešavaju tokom faze inicijalizacije.

B prikazuje algoritam za ispravno pokretanje servisa koristeći pomoćnu nit.

Funkcija rukovaoca

B prikazuje kod za funkciju Handler i pomoćne niti. Za zahtjeve "Stop" i "Shutdown" koristi se algoritam za graciozno zaustavljanje usluge, sličan onom koji se koristi prilikom pokretanja usluge, s jedinom razlikom što se parametar SERVICE_STOP_PENDING prosljeđuje SetserviceStatus umjesto parametra SERVICE_START_PENDING, a SERVICE_STOPPED umjesto SERVICE_RUNNING.

U idealnom slučaju, upiti "Pauziraj" i "Nastavi" bi također trebali koristiti ovaj pristup. Radoznali čitatelj može ga lako implementirati na osnovu ovih primjera.

Zaključak

U zaključku, želio bih napomenuti da se prelaskom na Windows NT 2000 razvoj usluga nije promijenio. Usluge su i dalje važan dio softvera na Windows platformi, dajući programerima puno posla.


// Funkcija slična MessageBox Win32 API int ServerMessageBox(RPC_BINDING_HANDLE h, LPSTR lpszText, LPSTR lpszTitle, UINT fuStyle) ( DWORD dwThreadId; HWINSTA hwinstaSave; HWINSTA hwinstaSave; HDESK hwinstaSave; HDESK hwinstaSave; HDESK rezultat u HDESK; objekti " i "Desktop". GetDesktopWindow(); hwinstaSave = GetProcessWindowStation(); dwThreadId = GetCurrentThreadId(); hdeskSave = GetThreadDesktop(dwThreadId); // Promijenite sigurnosni kontekst u onaj // koji ima RPC klijent koji poziva // i dobiti pristup korisniku // objektima "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); urn0; ) SetThreadDesktop(hdeskUser); // Prikaz normalnog okvira za tekst. rezultat = MessageBox(NULL, lpszText, lpszTitle, fuStyle); // Vraćanje sačuvanih objekata // "Prozorska stanica" i "Desktop". SetThreadDesktop(hdeskSave); SetProcessWindowStation(hwinstaSave); CloseDesktop(hdeskUser); CloseWindowStation(hwinstaUser); vratiti rezultat; ) void main() ( SERVICE_TABLE_ENTRY steTable = ( (SERVICENAME, ServiceMain), (NULL, NULL) ); // Uspostavite vezu sa SCM. Unutar ove funkcije // zahtjevi se primaju i šalju. StartServiceCtrlDispatcher(steTable); ) void Winapi servicemaina (DWORD DWARGC, LPSTR * PSARGV) (// Odmah registrirajte upravljač za zahtjev. HSS = RegisterServicectLrhandler (servis.dwCheckPoints = 0; sstatus.dwccoport = 0; sstatus.dwccoport | servisu_accept_pause_continue; sstatserus.dwservinSpecificexitCode = 0; SSTATESRUS. dwServiceSpecificExitCode = 0; sStatus.dwServiceSpecificExitCode = 0; sStatus.dwServiceSpecificExitCode = 0; ; sStatus.dwWaitHint = 0; sStatus.dwWin32ExitHint = 0; sStatus.dwWin32ExitHint = 0; sStatus.dwWin32ExitCode je pozvana inicijalna funkcija Inicijalno ERROR, // To osigurava da je funkcija To NO ERROR; sistem ne // isprazni uslugu tokom procesa inicijalizacije, pokreće se nit koja svake sekunde javlja da je usluga u procesu inicijalizacije. // Kreira se događaj za sinkronizaciju niti. // Nakon toga, radnička nit je pokrenuta, za Za sinkronizaciju koji // se također kreira događaj. hSendStartPending = CreateEvent(NULL, TRUE, FALSE, NULL); HANDLE hSendStartThread; DWORD dwThreadId; hSendStartThread = CreateThread(NULL, 0, SendStartPending, NULL, 0, &dwThreadId); //Sva inicijalizacija servisa se vrši ovdje. 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; SetServiceStatus(hSS, &sStatus); ) // Funkcija niti koja svake sekunde šalje obavijesti SCM-u // da je proces inicijalizacije u toku. Funkcija završava // kada se postavi događaj hSendStartPending //. DWORD WINAPI SendStartPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_START_PENDING; sStatus.dwWaitHint = 2000; // "Sleep" 1 sekundu. Ako nakon 1 sekunde, događaj nije završio // hS prelazak u P signalizirano stanje ( // inicijalizacija usluge nije završila), šaljemo još jednu obavijest, // postavljajući maksimalni vremenski interval // na 2 sekunde, kako bismo imali marginu vremena prije // sljedeće obavijesti. while (true) ( SetServiceStatus(hSS, &sStatus); sStatus .dwCheckPoint++;if(WaitForSingleObject(hSendStartPending, 1000)!=WAIT_TIMEOUT) break; ) sStatus.dwCheckPoint = 0; funkcija vraća 0; ) // Funkcija. Čitanje podataka, // dodjela memorije, itd. void InitService() ( ... ) // Funkcija koja sadrži kod usluge. DWORD WINAPI ServiceFunc(LPVOID) ( while (true) ( ​​if (!bPause) ( // Ovo sadrži kod koji obično // izvodi neku vrstu cikličke operacije... ) if (WaitForSingleObject(hWork, 1000)!=WAIT_TIMEOUT ) break; ) return 0; ) // Rukovalac zahtjeva od SCM-a void WINAPI ServiceHandler(DWORD dwCode) ( switch (dwCode) ( case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_SHUTDOWN: ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_10ERROR,top Create) TRUE, FALSE, NULL); hSendStopThread = CreateThread(NULL, 0, SendStopPending, NULL, 0, & dwThreadId); SetEvent(hWork); if (WaitForSingleObject(hServiceThread, 1000) !=SWAIT_READ (Terminal)hTh00); ) SetEvent(hSendStopPending); CloseHandle(hServiceThread); CloseHandle(hWork); if(WaitForSingleObject(hSendStopThread, 2000) != WAIT_OBJECT_0) ( TerminateThread(hSendStopThread), CloseHandle(hWork); 0); ServiceStatus(hSS, &sStatus); break; slučaj SERVICE_CONTROL_PAUSE: bPauza = istina; sStatus.dwCurrentState = SERVICE_PAUSED; SetServiceStatus(hSS, &sStatus); break; slučaj SERVICE_CONTROL_CONTINUE: bPauza = istina; sStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hSS, &sStatus); break; case SERVICE_CONTROL_INTERROGATE: SetServiceStatus(hSS, &sStatus); break; default: SetServiceStatus(hSS, &sStatus); break; ) ) // Thread funkcija slična SendStartPending // za zaustavljanje usluge. DWORD WINAPI SendStopPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_STOP_PENDING; sStatus.dwWaitHint = 2000; dok (true) (SetServiceStatus(SetServiceStatus(status.StatusStatus)++); =WAIT_TIMEOUT) prekid; ) sStatus.dwCheckPoint = 0; povratak 0; )

Kako pokrenuti aplikaciju kao Windows uslugu

Da li je moguće pokrenuti klijentsku aplikaciju kao uslugu? U jednom od njih opisao sam kako da kreirate Windows servis koristeći obične OS alate. Međutim, neće svaka konzolna aplikacija moći da radi kao servis, a programi sa grafičkim interfejsom u principu ne mogu raditi na ovaj način. Ali još uvijek postoji mogućnost pokretanja aplikacije kao usluge, a program s originalnim imenom pomoći će nam u tome. Menadžer usluga bez sisanja.

NSSM je besplatan softver With open source i podržava sve Microsoft operativne sisteme od Windows 2000 do Windows 8. NSSM ne zahtijeva instalaciju, samo ga preuzmite i raspakujte. Distribucijski komplet uključuje verzije za 32-bitni i 64-bitni OS. Program možete preuzeti sa stranice nssm.cc, trenutno je najnovija stabilna verzija 2.21.1 koju ću ja koristiti.

Da bismo demonstrirali mogućnosti NSSM-a, pokušajmo pokrenuti Windows Notepad kao servis na Windows 8.1.

Kreirajte uslugu

Za kreiranje usluge pod nazivom notepad pokrenite komandnu konzolu, idite u fasciklu sa raspakovanim NSSM-om (za 64-bitni Windows) i unesite komandu nssm install notepad , koja otvara prozor NSSM grafičkog instalacijskog programa. Da biste kreirali servis, dovoljno je u polju Putanja navesti putanju do izvršne datoteke i kliknuti na dugme "Instaliraj uslugu". Dodatno, u polju Opcije možete odrediti ključeve potrebne za pokretanje usluge.

Također, u fazi kreiranja nove usluge, možete odrediti neke dodatne parametre.

Kartica Shutdown navodi metode isključivanja i vremenska ograničenja koja se koriste tokom normalnog isključivanja ili isključivanja aplikacije u nuždi. Kada NSSM primi naredbu za zaustavljanje (npr. kada se aplikacija završi), pokušava zaustaviti kontroliranu aplikaciju na normalan način. Ako aplikacija ne odgovori, tada NSSM može prisilno prekinuti sve procese i podprocese ove aplikacije.

Ukupno postoje četiri koraka za gašenje aplikacije i oni će se prema zadanim postavkama koristiti ovim redoslijedom:

U prvom koraku, NSSM pokušava generirati i poslati događaj ctrl+c. Ova metoda dobro radi za konzolne aplikacije ili skripte, ali ne i za grafičke aplikacije;
NSSM zatim detektuje sve prozore koje je kreirala aplikacija i šalje im WM_CLOSE poruku da prisili aplikaciju da izađe;
U trećem koraku, NSSM procjenjuje sve niti koje je kreirala aplikacija i šalje im WM_QUIT poruku, koja će biti primljena ako aplikacija ima red poruka niti;
I kao posljednje sredstvo, NSSM može pozvati metodu TerminateProcess() i prinudno prekinuti aplikaciju.

Moguće je onemogućiti neke ili čak sve metode, međutim, za različite aplikacije različite metode rade, a za ispravno gašenje aplikacije preporuča se ostaviti sve kako jeste.

Podrazumevano, kada se usluga sruši, NSSM pokušava da je ponovo pokrene. Na kartici "Izlazne radnje" možete promijeniti automatsku akciju u slučaju neuobičajenog isključivanja aplikacije, kao i postaviti odgodu prije nego što se aplikacija automatski ponovo pokrene.

Na kartici "Input / Output (I / O)" možete postaviti preusmjeravanje ulaza / izlaza aplikacije na navedenu datoteku.

Na kartici "Okruženje" možete postaviti nove varijable okruženja za uslugu ili nadjačati postojeće.

Također ne možete koristiti grafičku ljusku i odmah kreirati servis u konzoli sa sljedećom naredbom:

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

Upravljanje uslugama

Nakon kreiranja usluge pomoću NSSM-a, idite na dodatak Services i pronađite uslugu notepad. Kao što vidite, po izgledu se ne razlikuje od ostalih servisa, možemo ga pokrenuti, zaustaviti ili promijeniti način pokretanja. Imajte na umu, međutim, da je nssm.exe naveden kao izvršni.

A ako odete u Task Manager, vidjet ćemo sljedeću sliku: NSSM se pokreće kao glavni (nadređeni) proces, servis notepad radi kao njegov podređeni proces, a aplikacija Notepad već radi u ovom podređenom procesu.

Uklanjanje usluge

Da biste uklonili uslugu, unesite naredbu nssm remove notepad i potvrdite njeno uklanjanje. A ako upišete nssm remove notepad confirm , možete učiniti bez potvrde.

Interaktivno pokretanje usluge

Glavna razlika prilagođena aplikacija od servisa je da nakon pokretanja aplikacija može zahtijevati dodatne radnje od strane korisnika kako bi nastavio s radom - na primjer, kliknuti na dugme ili uneti komandu. Da biste to učinili, morate mu pristupiti, što, kako se ispostavilo, nije tako lako učiniti.

Da biste pokrenuli uslugu u interaktivnom režimu, potrebno je da otvorite njena svojstva u dodatku Usluge i na kartici „Prijava“ potvrdite izbor u polju za potvrdu „Dozvoli interakciju sa radnom površinom“.

I tada počinju čuda 🙂 Servis pokrenut u interaktivnom načinu otvara se u izoliranoj sesiji (sesija 0). Ovoj sesiji može pristupiti samo Usluga otkrivanja interaktivnih usluga (ui0detect), koja prati početak interaktivnih usluga na računaru i izdaje upozorenje. U Windows 7\Server 2008 ova usluga je podrazumevano omogućena, ali u Windows 8\Server 2012 je onemogućena i ne pojavljuje se u grafičkom dodatku za usluge (barem je nisam tamo našao). Štaviše, ako pronađete ovu misterioznu uslugu i pokušate je pokrenuti, dobit ćete poruku o grešci.

Ali činjenica je da da biste ga pokrenuli, morate dozvoliti pokretanje interaktivnih usluga na računaru. Stoga otvaramo uređivač registra, pronalazimo u odjeljku HKLM\System\CurrentControlSet\Control\Windows parametar DWORD s imenom Nema interaktivnih usluga i postavite njegovu vrijednost na 0 .

Zatim otvaramo PowerShell konzolu i pokrećemo uslugu otkrivanja naredbom:

Start-Service -Naziv ui0detect

Nakon što se uvjerimo da je usluga otkrivanja pokrenuta, ponovo pokrećemo uslugu notepad i dobivamo ovaj prozor. Odaberite "Prikaži poruku"

i ući u nultu sesiju u kojoj radi naša aplikacija. Zatim s njim izvodimo potrebne radnje i vraćamo se nazad.

Tako zanimljivo rješenje za pokretanje aplikacija kao što su Windows servisi. Nije najljepša, ali sasvim vjerna svom imenu 🙂

Posljednje ažuriranje: 31.10.2015

Usluge su jedna od najvažnijih komponenti Windows operativnog sistema. U stvari, radi se o zasebnim aplikacijama koje nemaju grafičko sučelje i koje obavljaju različite zadatke u pozadini. Servisi se mogu pokrenuti na početku rada operativnog sistema, ili u bilo koje drugo vrijeme u toku rada korisnika. Uobičajeni primjer usluga su razni web serveri koji u pozadini slušaju konekcije na određenom portu, a ako postoje veze, onda komuniciraju s njima. To također mogu biti razne pomoćne usluge ažuriranja za druge instalirane programe koji kontaktiraju server da vide da li postoji nova verzija aplikacije. Općenito, možemo otvoriti servisni panel i sami se uvjeriti u sve instalirane i pokrenute servise:

Pogledajmo kako da kreirate sopstvene usluge u C#. Kao zadatak koji treba implementirati, izabraćemo praćenje promjena u određenom folderu u sistemu datoteka. Sada kreirajmo servis da ga pokrenemo.

Prvo, napravimo novi projekat, koji će biti tipa Windows Service. Nazovimo projekat FileWatcherService:

Nakon toga, Visual Studio generiše projekat koji ima sve što vam je potrebno. Iako u principu ne moramo da biramo ovu vrstu projekta, mogli bismo da kreiramo projekat biblioteke klasa i onda u njemu definišemo sve potrebne klase.

Dakle, novi projekat izgleda ovako:

Tu je i datoteka Program.cs i sam servisni čvor Service1.cs.

Servis predstavlja normalnu aplikaciju, ali se ne pokreće sam. Svi pozivi i pristup njemu prolaze kroz Service Control Manager (SCM). Kada se servis pokrene automatski pri pokretanju sistema ili ručno, SCM poziva glavni metod u klasi Program:

Program statičke klase ( static void Main() ( ServiceBase ServicesToRun; ServicesToRun = new ServiceBase (novi Service1() ); ServiceBase.Run(ServicesToRun); )

Glavni metod je prema zadanim postavkama definiran za pokretanje više usluga odjednom, koje su definirane u nizu ServicesToRun. Međutim, prema zadanim postavkama, projekt sadrži samo jednu uslugu, Service1. Samo pokretanje se izvodi pomoću metode Run: ServiceBase.Run(ServicesToRun) .

Sama usluga koju treba pokrenuti je predstavljena čvorom Service1.cs. Međutim, ovo zapravo nije jednostavan kodni fajl. Ako otvorimo ovaj čvor, vidjet ćemo Service1.Designer.cs fajl dizajnera usluge i klasu Service1 u njemu.

Klasa Service1 zapravo predstavlja uslugu. Podrazumevano ima sljedeći kod:

Korišćenje sistema; koristeći System.Collections.Generic; koristeći System.ComponentModel; koristeći System.Data; koristeći System.Diagnostics; koristeći System.Linq; koristeći System.ServiceProcess; koristeći System.Text; koristeći System.Threading.Tasks; imenski prostor FileWatcherService (javna parcijalna klasa Service1: ServiceBase (javna usluga1() ( InitializeComponent(); ) zaštićeno nadjačavanje void OnStart(string args) () zaštićeno nadjačavanje void OnStop() ())

Servisna klasa mora naslijediti osnovnu klasu ServiceBase. Ova klasa definira brojne metode, od kojih su najvažnije OnStart() metoda, koja pokreće radnje koje obavlja usluga, i OnStop() metoda, koja zaustavlja uslugu.

Nakon što SCM pozove glavni metod i registruje uslugu, poziva se direktno pokretanjem metode OnStart.

Kada je u servisnoj konzoli ili putem komandna linijašaljemo naredbu za zaustavljanje usluge, a zatim SCM poziva metodu OnStop da je zaustavi.

Pored ove dvije metode u servisnoj klasi, možete nadjačati još nekoliko metoda osnovne klase ServiceBase:

    OnPause : poziva se kada je usluga pauzirana

    OnContinue : Poziva se kada se usluga nastavi nakon što je obustavljena

    OnShutdown : Poziva se kada se Windows isključi

    OnPowerEvent : poziva se kada se promijeni način napajanja

    OnCustomCommand : Poziva se kada usluga primi prilagođenu komandu od Service Control Manager-a (SCM)

Konstruktor klase Service1 poziva metodu InitializeComponent() koja je definirana u datoteci dizajnera Service1.Designer.cs:

Imenski prostor FileWatcherService ( djelomična klasa Service1 (privatne komponente System.ComponentModel.IContainer = null; zaštićeno nadjačavanje void Dispose(bool disposing) (if (odlaganje && (komponente != null)) (komponente.Dispose(); ) base.Dispose(odlaganje ); ) private void InitializeComponent() ( komponente = novi System.ComponentModel.Container(); this.ServiceName = "Service1"; ) ) )

Jedina stvar koju treba napomenuti u njemu je postavljanje naziva usluge (osobinaServiceName):

This.ServiceName = "Service1";

Ovo je ime koje će biti prikazano na konzoli usluga nakon što se usluga instalira. Možemo to promijeniti, ili možemo ostaviti kako jeste.

Sada promijenimo šifru usluge na sljedeći način:

Korišćenje sistema; koristeći System.ServiceProcess; koristeći System.IO; koristeći System.Threading; imenski prostor FileWatcherService ( javna djelomična klasa Service1: ServiceBase ( Logger logger; public Service1() ( InitializeComponent(); this.CanStop = true; this.CanPauseAndContinue = true; this.AutoLog = true; ) zaštićeno nadjačavanje void OnStart (string args) ( logger = new Logger(); Thread loggerThread = nova Thread(new ThreadStart(logger.Start)); loggerThread.Start(); ) zaštićeno nadjačavanje void OnStop() (logger.Stop(); Thread.Sleep(1000); ) ) class Logger ( FileSystemWatcher watcher; object obj = new object(); bool enabled = true; public Logger() ( watcher = new 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; enabled = false; ) // preimenovanje privatnih datoteka e void Watcher_Renamed(object sender, RenamedEventArgs e) ( string fileEvent = "preimenovan u " + e.FullPath; string filePath = e.OldFullPath; RecordEntry(fileEvent, filePath); ) // mijenjanje datoteka private void Watcher_Changed(object sender, FileSystemEventArgs e) ( string fileEvent = "promijenjen"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // kreiranje datoteka private void Watcher_Created(object sender, FileSyste e) ( string fileEvent = "kreirano"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // brisanje privatnih datoteka void Watcher_Deleted(object sender, FileSystemEventArgs e) ( string fileEvent = "izbrisan"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) private void RecordEntry(string fileEvent, string filePath) (zaključavanje (obj) (koristeći (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)); pisac. Flush(); ) ) ) ) )

Ključna klasa koja obuhvata svu funkcionalnost je klasa Logger. Koristeći FileSystemWatcher objekat, on će pratiti promjene u folderu D://Temp. Metoda Start() navodi da ćemo pratiti promjene kroz FileSystemWatcher objekat. I sav posao će ići sve dok je omogućena logička varijabla istinita. Metoda Stop() će vam omogućiti da prekinete klasu.

Događaji FileSystemWatcher vam omogućavaju da nadgledate sve promjene u fascikli koju gledate. Ovo će zabilježiti promjene u datoteci templog.txt. Da bi se izbjegla trka resursa za datoteku templog.txt u koju su upisane promjene, postupak pisanja je blokiran lock(obj) stubom.

Kao rezultat toga, nakon kreiranja, modifikacije, preimenovanja i brisanja log fajl će sadržavati nešto poput:

Dana 30.07.2015 12:15:40, datoteka D:\Temp\New Text Document.txt je kreirana 30.07.2015. 12:15:46 PM datoteka D:\Temp\New Text Document.txt je preimenovan u D:\Temp\hello.txt 30.07.2015. 12:15:55 PM fajl D:\Temp\hello.txt je izmijenjen 30.07.2015. 12:15:55 PM fajl D:\Temp\ hello.txt je izmijenjen 30.07.2015. 12:16:01 PM fajl D: \Temp\hello.txt je uklonjen

U samoj servisnoj klasi Service1, određeni broj opcija je postavljen u konstruktoru:

This.CanStop = istina; // usluga se može zaustaviti this.CanPauseAndContinue = true; // usluga se može pauzirati, a zatim nastaviti this.AutoLog = true; // servis može pisati u dnevnik

U metodi OnStart(), nova nit se poziva za pokretanje objekta Logger:

Zaštićeno nadjačavanje void OnStart(string args) (logger = new Logger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); )

Nova nit je potrebna jer trenutna nit samo obrađuje SCM komande i mora se vratiti iz OnStart metode što je prije moguće.

Kada se od SCM-a primi naredba za zaustavljanje usluge, aktivira se metod OnStop, koji poziva metodu logger.Stop(). Dodatno kašnjenje će omogućiti da se nit dnevnika zaustavi:

Zaštićeno nadjačavanje void OnStop() (logger.Stop(); Thread.Sleep(1000); )

Međutim, sama klasa usluge nije dovoljna. Također moramo kreirati instalater servisa.

Ili radnu površinu korisnika (lokalnih i udaljenih), međutim, za neke servise je moguć izuzetak - interakcija sa konzolom (sesija broj 0, u kojoj je korisnik prijavljen lokalno ili kada se servis pokrene mstsc sa ključem /console).

Postoji nekoliko načina za usluge:

  • zabranjeno lansiranje;
  • ručno pokretanje (na zahtjev);
  • automatsko pokretanje kada se računar pokrene;
  • automatsko (odloženo) pokretanje (uvedeno u Windows Vista i Windows Server 2008);
  • potreban servis/driver (automatsko pokretanje i nemogućnost (za korisnika) da zaustavi uslugu).

Pozadinski način rada

Pokretanje, zaustavljanje i mijenjanje Windows servisa

Usluge i njihovi atributi se mogu promijeniti u MMC-u:

Različite verzije operativnih sistema mogu imati neke usluge, a druge ne. Neke aplikacije i programi instalirani zasebno mogu kreirati i vlastite usluge.

Lista usluga operativnog sistema Microsoft Windows

Ime za prikaz Naziv usluge Funkcije Opis
DHCP klijent dhcp Registruje i ažurira IP adrese i DNS zapise za ovaj računar. Ako se ova usluga zaustavi, ovaj računar neće moći da dobije dinamičke IP adrese i izvrši DNS ažuriranja.
DNS klijent dnscache Usluga DNS klijenta (dnscache) kešira imena sistema imena domena (DNS) i registruje potpuno kvalificirano ime ovog računara. Ako je usluga zaustavljena, razlučivanje DNS imena će se nastaviti. Međutim, rezultati redova DNS imena neće biti keširani i ime računara neće biti registrovano.
KtmRm za koordinatora distribuiranih transakcija KtmRm Koordinira transakcije između MSDTC-a i Kernel Transaction Managera (KTM).
ReadyBoost EMDMgmt ReadyBoost Podrška za poboljšanje performansi sistema uz ReadyBoost tehnologiju.
Superfetch SysMain Superfetch Održava i poboljšava performanse sistema.
Windows Audio Audiosrv Upravljanje audio alatima za Windows programe. Ako se ova usluga zaustavi, audio uređaji i efekti neće raditi ispravno.
Windows Card Space idsvc Pruža siguran način za kreiranje, upravljanje i otkrivanje digitalnih identiteta.
Automatsko ažuriranje WUAUSERV Uključuje preuzimanje i instaliranje Windows ažuriranja. Ako je usluga onemogućena, ovaj računar neće moći da koristi automatska ažuriranja ili veb lokaciju Windows Update.
Poziv na daljinu (RPC) RpcSs Pruža mapiranje između krajnjih tačaka i drugih RPC usluga.

Lista usluga koje kreiraju Microsoft aplikacije i programi

Primjeri usluga koje su kreirale aplikacije i programi trećih strana

Ime za prikaz Naziv usluge Funkcije Opis
ESET HTTP server EhttpSrv antivirusna zaštita Komponenta ESET HTTP servera