Minkä käyttäjän alla palvelut toimivat Windowsissa? Windows-palvelut. Mitä palvelut ovat

Toimintatilat

Useimmissa tapauksissa palveluita ei saa olla vuorovaikutuksessa käyttäjien konsolin tai työpöydän kanssa (sekä paikallisten että etäkäyttöisten), mutta joidenkin palveluiden kohdalla poikkeus on mahdollinen - vuorovaikutus konsolin kanssa (istuntonumero 0, johon käyttäjä on rekisteröity paikallisesti tai kun palvelu alkaa mstsc/console-kytkimellä).

Palveluille on useita tiloja:

  • laukaisu kielletty;
  • manuaalinen käynnistys (pyynnöstä);
  • automaattinen käynnistys, kun tietokone käynnistyy;
  • automaattinen (viivästetty) käynnistys (otettu käyttöön Windows Vistassa ja Windows Server 2008:ssa);
  • pakollinen huolto/ajuri (automaattinen käynnistys ja kyvyttömyys (käyttäjälle) pysäyttää palvelu).

Taustatila

Käynnistä, pysäytä ja muuta Windows-palveluita

Palveluita ja niiden ominaisuuksia voidaan muuttaa MMC:ssä:

Eri versioissa käyttöjärjestelmät Jotkut palvelut voivat olla olemassa ja toiset puuttuvat. Jotkut erikseen asennettavat sovellukset ja ohjelmat voivat myös luoda omia palvelujaan.

Luettelo Microsoft Windows -käyttöjärjestelmäpalveluista

Näyttönimi Palvelun nimi Toiminnot Kuvaus
DHCP asiakas Dhcp Rekisteröi ja päivittää tämän tietokoneen IP-osoitteet ja DNS-tietueet. Jos tämä palvelu pysäytetään, tämä tietokone ei pysty hankkimaan dynaamisia IP-osoitteita ja suorittamaan DNS-päivityksiä.
DNS-asiakas Dnscache DNS-asiakaspalvelu (dnscache) tallentaa DNS-nimiä (Domain Name System) välimuistiin ja rekisteröi täydellisen nimen tästä tietokoneesta. Jos palvelu pysäytetään, DNS-nimen selvittäminen jatkuu. DNS-nimijonojen tuloksia ei kuitenkaan tallenneta välimuistiin eikä tietokoneen nimeä rekisteröidä.
KtmRm hajautetun tapahtuman koordinaattorille KtmRm Koordinoi tapahtumia MSDTC:n ja Kernel Transaction Managerin (KTM) välillä.
ReadyBoost EMDMgmt ReadyBoost Tuki järjestelmän suorituskyvyn parantamiseen ReadyBoost-tekniikan avulla.
Superfetch SysMain Superfetch Ylläpitää ja parantaa järjestelmän suorituskykyä.
Windows Audio Audiosrv Äänityökalujen hallinta Windows-ohjelmat. Jos tämä palvelu pysäytetään, äänilaitteet ja tehosteet eivät toimi oikein.
Windows CardSpace idsvc Tarjoaa turvallisen mahdollisuuden luoda, hallita ja paljastaa digitaalisia identiteettejä.
Automaattinen päivitys WUAUSERV Sisältää latauksen ja asennuksen Windows-päivitykset. Jos palvelu on poistettu käytöstä, et voi käyttää tämän tietokoneen ominaisuuksia. automaattinen päivitys tai Windows Update -sivustolta.

Luettelo Microsoftin sovellusten ja ohjelmien luomista palveluista

Luettelo muiden valmistajien sovellusten ja ohjelmien luomista palveluista

Katso myös

Luettelo Windows-palveluista

Linkit

  • pcs.suite101.com/article.cfm/index_of_services: Windows XP:n palveluiden hakemisto – Windows XP:ssä käytettävien palveluiden hakemisto käyttöjärjestelmä
  • Kuinka poistaa palvelu sisään Windows Vista tai Windows XP
  • Windows XP -palvelut (venäläinen)

Wikimedia Foundation. 2010.

Katso, mitä "Windows Services" on muissa sanakirjoissa:

    Windows SharePoint Services (WSS) ilmainen lisäosa Vastaanottaja Microsoft Windows Server 2003 ja 2008, toteuttavat täysin varustellun verkkoalustan, joka tukee seuraavia ominaisuuksia: Sisällönhallintajärjestelmä Yhteistyötyökalut... ... Wikipedia

    Kehittäjä Microsoft Windows OS -perhe ... Wikipedia

    Microsoft Windows -komponentti ... Wikipedia


Windows NT -palvelu on erityinen prosessi, jolla on yhtenäinen käyttöliittymä vuorovaikutukseen käyttöjärjestelmän kanssa Windows-järjestelmä N.T. Palvelut on jaettu kahteen tyyppiin - Win32-palveluihin, jotka ovat vuorovaikutuksessa käyttöjärjestelmän kanssa Service Control Managerin (SCM) kautta, ja ajureihin, jotka toimivat ohjainprotokollaa käyttäen. Windows-laitteet N.T. Keskustelemme vain Win32-palveluista myöhemmin tässä artikkelissa.

Palvelujen soveltaminen

Yksi palvelun tärkeimmistä ominaisuuksista on ei-vuorovaikutteisuus. Tyypillinen palvelu toimii taustalla tavallisen käyttäjän huomaamatta. Tämän vuoksi palvelut soveltuvat parhaiten seuraavantyyppisten sovellusten toteuttamiseen:

  • Palvelimet asiakas-palvelin-arkkitehtuurissa (esimerkiksi MS SQL, MS Exchange Server)
  • Verkko Windows-palvelut NT (palvelin, työasema);
  • Palvelin (toiminnallisuuden suhteen) hajautettujen sovellusten komponentit (esim. kaikenlaiset valvontaohjelmat).

Palvelujen perusominaisuudet

Palvelu erottuu tavallisesta Win32-sovelluksesta 3 pääominaisuudella. Katsotaanpa jokaista niistä.

Ensinnäkin palvelu on mahdollista pysäyttää (keskeyttää) oikein. Käyttäjällä tai muulla vakiomekanismeja käyttävällä sovelluksella on mahdollisuus muuttaa palvelun tilaa - siirtää sitä käynnissä olevasta tilasta keskeytettyyn tilaan tai jopa pysäyttää sen. Tässä tapauksessa palvelu saa ennen tilan muuttamista erityisen ilmoituksen, jonka ansiosta se voi suorittaa uuteen tilaan siirtymiseen tarvittavat toimenpiteet, esimerkiksi vapauttaa varatut resurssit.

Toiseksi mahdollisuus käynnistää palvelu ennen käyttäjän rekisteröintiä ja sen seurauksena kyky työskennellä ilman rekisteröityä käyttäjää. Mikä tahansa palvelu voidaan käynnistää automaattisesti käyttöjärjestelmän käynnistyessä ja alkaa toimia jo ennen kuin käyttäjä kirjautuu järjestelmään.

Ja lopuksi kyky työskennellä mielivaltaisessa turvallisuusympäristössä. Konteksti Windowsin suojaus NT määrittelee joukon prosessin käyttöoikeuksia erilaisiin järjestelmäobjekteihin ja tietoihin. Toisin kuin tyypillinen Win32-sovellus, joka toimii aina järjestelmään kirjautuneen käyttäjän suojauskontekstissa, palvelulle sen suorituksen suojauskonteksti voidaan määrittää etukäteen. Tämä tarkoittaa, että palvelulla voi olla omat käyttöoikeudet järjestelmäobjekteihin määritelty etukäteen ja siten rajoittaa sen toimintojen laajuutta. Palveluille on olemassa erityinen oletussuojauskonteksti nimeltä Local System. Tässä yhteydessä suoritettavalla palvelulla on oikeudet vain paikallisen tietokoneen resursseihin. Paikallisen järjestelmän oikeuksilla ei voi suorittaa verkkotoimintoja, koska tässä kontekstissa on vain järkeä paikallinen tietokone ja muut verkon tietokoneet eivät tunnista sitä.

Palvelun vuorovaikutus muiden sovellusten kanssa

Mikä tahansa sovellus, jolla on asianmukaiset oikeudet, voi olla vuorovaikutuksessa palvelun kanssa. Vuorovaikutukseen kuuluu ensinnäkin palvelun tilan muuttaminen, eli sen siirtäminen johonkin kolmesta tilasta - käynnissä (Käynnistä), keskeytetty (Tauko), pysäytys ja se suoritetaan lähettämällä SCM-pyyntöjä. Pyyntöjä on kolmea tyyppiä - palveluilta tulevat viestit (niiden tilojen korjaamisesta), palvelun konfiguraation muuttamiseen tai siitä tiedon saamiseen liittyvät pyynnöt sekä sovelluspyynnöt palvelun tilan muuttamiseksi.

Jotta voit hallita palvelua, sinun on ensin hankittava sen kahva käyttämällä OpenService Win32 API -toimintoa. StartService-toiminto käynnistää palvelun. Tarvittaessa palvelun tilaa muutetaan kutsumalla ControlService-toiminto.

Palvelutietokanta

Jokaisen palvelun tiedot tallennetaan rekisteriin - avaimeen HKLM\SYSTEM\CurrentControlSet\Services\ServiceName. Se sisältää seuraavat tiedot:

  • Palvelutyyppi. Ilmaisee, toteuttaako tämä sovellus vain yhtä palvelua (yksinomainen) vai onko niitä useita sovelluksessa. Yksinomainen palvelu voi toimia missä tahansa tietoturvaympäristössä. Useita saman sovelluksen palveluita voidaan käyttää vain LocalSystem-kontekstissa.
  • Käynnistystyyppi. Automaattinen - palvelu käynnistyy järjestelmän käynnistyksen yhteydessä. On demand - käyttäjä käynnistää palvelun manuaalisesti. Ei käytössä - Palvelua ei voi käynnistää.
  • Suoritettavan moduulin nimi (EXE-tiedosto).
  • Käynnistystilaus suhteessa muihin palveluihin. Joissakin tapauksissa yhden tai useamman muun palvelun on oltava käynnissä, jotta palvelu toimisi oikein. Tässä tapauksessa rekisteri sisältää tiedot palveluista, jotka aloitettiin ennen tätä.
  • Palvelun suorittamisen suojauskonteksti ( verkon nimi ja salasana). Oletusarvoisesti suojauskonteksti on LocalSystem.

Sovellusten, jotka haluavat hakea tietoja palvelusta tai muuttaa palveluasetusta, on olennaisesti muutettava tietoja palvelun tietokannasta rekisterissä. Tämä voidaan tehdä vastaavilla Win32 API -toiminnoilla:

  • OpenSCManager, CreateService, OpenService, CloseServiceHandle - palvelun luomiseen (avaamiseen);
  • QueryServiceConfig, QueryServiceObjectSecurity, EnumDependentServices, EnumServicesStatus - saada tietoja palvelusta;
  • ChangeServiceConfig, SetServiceObjectSecurity, LockServiceDatabase, UnlockServiceDatabase, QueryServiceLockStatus - palvelun määritystietojen muuttaminen.

Palvelun sisäinen rakenne.

Jotta tämä tapahtuisi, sovellus on rakennettava vastaavasti, eli sen on sisällettävä tietty joukko toimintoja (C++-termeillä) tietyllä toiminnallisuudella. Katsotaanpa lyhyesti jokaista niistä.

päätoiminto

Kuten tiedät, päätoiminto on minkä tahansa Win32-konsolisovelluksen aloituspiste. Kun palvelu käynnistyy, tämän toiminnon koodi alkaa suorittaa ensimmäisenä. Päätoiminnon on kutsuttava StartServiceCtrlDispatcher 30 sekunnin kuluessa käynnistämisestä yhteyden muodostamiseksi sovelluksen ja SCM:n välille. Kaikki viestintä minkä tahansa tietyn sovelluksen palvelun ja SCM:n välillä suoritetaan StartServiceCtrlDispatcher-toiminnossa, joka päättyy vasta, kun kaikki sovelluksen palvelut ovat pysähtyneet.

ServiceMain-toiminto

Prosessinlaajuisen sisääntulopisteen lisäksi jokaiselle sovelluksessa toteutetulle palvelulle on oma sisääntulopiste. Palvelun aloituspisteinä olevien funktioiden nimet (kutsutaanko niitä yksinkertaisuuden vuoksi samalla nimellä - ServiceMain) välitetään SCM:lle yhdessä parametreista kutsuttaessa StartServiceCtrlDispatcheria. Kun jokainen palvelu käynnistyy, luodaan erillinen säie ServiceMainin suorittamista varten.

Ohjauksen saatuaan ServiceMainin on ensin rekisteröitävä palvelupyyntökäsittelijä, Handler-toiminto, jokaiselle sovelluksen palvelulle. Tätä seuraa yleensä ServiceMainissa joitakin palvelun alustustoimenpiteitä - muistin varaaminen, tietojen lukeminen jne. Näihin toimiin on liitettävä SCM-ilmoitukset siitä, että palvelu on edelleen käynnistysvaiheessa eikä vikoja ole ilmennyt. Ilmoitukset lähetetään kutsumalla SetServiceStatus-toimintoon. Kaikkien puheluiden, paitsi viimeisimmän, tulee olla SERVICE_START_PENDING-parametrilla ja viimeisimmän SERVICE_RUNNING-parametrilla. Palvelun kehittäjä määrittää puhelujen tiheyden seuraavan ehdon perusteella: kahden vierekkäisen SetServiceStatus-puhelun välisen aikavälin kesto ei saa ylittää SCM:lle ensimmäisen kahdesta puhelusta välitetyn parametrin dwWaitHint arvoa. Muussa tapauksessa SCM, joka ei saa seuraavaa ilmoitusta ajoissa, lopettaa palvelun väkisin. Tällä menetelmällä voit välttää palvelun alkutilanteen, joka johtuu tiettyjen vikojen esiintymisestä (muista, että palvelut ovat yleensä ei-vuorovaikutteisia ja ne voidaan käynnistää käyttäjän poissa ollessa). Tavallinen käytäntö on, että SCM:lle ilmoitetaan seuraavan alustusvaiheen jälkeen.

Käsittelijätoiminto

Kuten edellä mainittiin, Handler on takaisinsoittotoiminnon prototyyppi, palvelupyyntökäsittelijä, joka on yksilöllinen jokaiselle sovelluksen palvelulle. Käsittelijä kutsutaan, kun palvelu vastaanottaa pyynnön (aloitus, tauko, jatka, pysäytys, nykyinen tilaviesti) ja suorittaa tarvittavat toimenpiteet pyynnön mukaisesti, minkä jälkeen se raportoi uuden tilan SCM:lle.

Erityisesti tulee huomioida yksi pyyntö - pyyntö, joka vastaanotettiin järjestelmää sammutettaessa (Shutdown). Tämä pyyntö osoittaa, että alustus on poistettava ja lopetettava. Microsoft sanoo, että jokaiselle palvelulle annetaan 20 sekuntia aikaa sulkea ennen kuin se pakotetaan lopettamaan. Testit ovat kuitenkin osoittaneet, että tämä ehto ei aina täyty ja palvelu pakotetaan lopettamaan ennen tämän ajanjakson umpeutumista.

Palvelun turvajärjestelmä

Kaikki palveluita koskevat toimet edellyttävät, että sovelluksella on asianmukaiset oikeudet. Kaikilla sovelluksilla on oikeus muodostaa yhteys SCM:ään, luetella palveluita ja tarkistaa, onko palvelutietokanta estetty. Vain järjestelmänvalvojan oikeudet omaavat sovellukset voivat rekisteröidä järjestelmään uuden palvelun tai estää palvelutietokannan.

Jokaisella palvelulla on suojauskuvaus, joka kuvaa, millä käyttäjillä on oikeudet mihin tahansa toimintoon. Oletus:

  • Kaikilla käyttäjillä on oikeudet SERVICE_QUERY_CONFIG, SERVICE_QUERY_STATUS, SERVICE_ENUMERATE_DEPENDENTS, SERVICE_INTERROGATE ja SERVICE_USER_DEFINED_CONTROL;
  • Tehokäyttäjät-ryhmään ja LocalSystem-tiliin kuuluvilla käyttäjillä on lisäksi SERVICE_START-, SERVICE_PAUSE_CONTINUE- ja SERVICE_STOP-oikeudet;
  • Järjestelmänvalvoja- ja Järjestelmänvalvoja-ryhmiin kuuluvilla käyttäjillä on SERVICE_ALL_ACCESS-oikeus.

Palvelut ja interaktiivisuus

Oletusarvoisesti interaktiiviset palvelut voivat toimia vain LocalSystem-suojauskontekstissa. Tämä johtuu Windows NT:n näyttöruudulla näyttämisen erityispiirteistä, joissa on esimerkiksi objekti, kuten "Desktop", jonka kanssa työskentelyyn sinulla on oltava asianmukaiset käyttöoikeudet, joita mielivaltainen objekti ei välttämättä omistaa. tili, muu kuin LocalSystem. Huolimatta siitä, että suurimmassa osassa tapauksista tämä rajoitus ei ole merkittävä, joskus on tarpeen luoda palvelu, joka näyttäisi tiedot näytön näytöllä ja joka samalla suoritettaisiin muussa suojauskontekstissa kuin LocalSystem, esimerkiksi sovelluspalvelinkomponentti sovellusten suorittamiseen etätietokoneessa.

Koodinpätkä kohteesta . kuvaa tätä mahdollisuutta.

Tässä fragmentissa palvelu näyttää tekstiviestin näytön näytöllä vastauksena sovelluksen asiakaspuolen RPC-seurauksena lähettämään pyyntöön.

Esimerkkipalvelu (avainkatkelmat)

Katsotaanpa esimerkkiä Windows NT -palvelun toteuttavan C++:n sovelluksen avainfragmenteista. Selvyyden vuoksi koodin ei-olennaiset osat on jätetty pois.

päätoiminto

Päätoimintokoodi on esitetty kohdassa B.

ServiceMain-toiminto

ServiceMainin sisältämän koodin ominaisuus on, että tietyn toiminnon suoritusaikaa on usein mahdotonta ennustaa etukäteen, varsinkin kun otetaan huomioon, että sen suoritus tapahtuu käyttöjärjestelmässä, jossa on ennaltaehkäisevä moniajo. Jos toiminto kestää kauemmin kuin SetServiceStatus-puheluparametrissa määritetty aikaväli, palvelu ei pysty lähettämään seuraavaa ilmoitusta ajoissa, jolloin SCM lopettaa toimintansa. Esimerkkejä mahdollisista toiminnoista voivat olla kutsut verkkotoimintoihin suurilla aikakatkaisuilla tai kertaluku Suuri määrä tietoa hitaasta mediasta. Lisäksi tämä lähestymistapa on täysin soveltumaton palvelun virheenkorjauksessa, koska ohjelman suorittamiseen debuggerissa liittyy pitkiä taukoja, jotka ovat tarpeen kehittäjälle.

Tämän ongelman ratkaisemiseksi kaikki toiminnot, jotka ovat vuorovaikutuksessa SCM:n kanssa, tulisi suorittaa erillisessä säikeessä, riippumatta toiminnoista, joita tapahtuu alustusvaiheen aikana.

B näyttää algoritmin palvelun käynnistämiseksi oikein apulangan avulla.

Käsittelijätoiminto

B näyttää Handler-toiminnon ja apukierteiden koodin. "Stop"- ja "Shutdown"-pyynnöissä käytetään palvelun oikein pysäyttävää algoritmia, joka on samankaltainen kuin palvelun käynnistämisen yhteydessä, sillä ainoalla erolla, että SERVICE_START_PENDING-parametrin sijaan SERVICE_STOP_PENDING-parametri välitetään SetserviceStatukselle. / SERVICE_RUNNING - SERVICE_STOPPED.

Ihannetapauksessa "Keskeytä"- ja "Jatka"-pyyntöjen tulisi myös käyttää tätä lähestymistapaa. Utelias lukija voi helposti toteuttaa sen näiden esimerkkien perusteella.

Johtopäätös

Lopuksi haluamme todeta, että palveluiden kehitys ei muuttunut Windows NT 2000:een siirtymisen myötä. Palvelut ovat edelleen tärkeä osa Windows-alustan ohjelmistoja, mikä tarjoaa kehittäjille laajan valikoiman vaihtoehtoja.


// Toiminto, joka on samankaltainen kuin MessageBox Win32 API int ServerMessageBox(RPC_BINDING_HANDLE h, LPSTR lpszText, LPSTR lpszTitle, UINT fuStyle) ( DWORD dwThreadId; HWINSTA hwinstaSave; HDESK hdeskSave nykyinen HDESKSK-tulos "W indow station " ja "Desktop". GetDesktopWindow(); hwinstaSave = GetProcessWindowStation(); dwThreadId = GetCurrentThreadId(); hdeskSave = GetThreadDesktop(dwThreadId); // Muuta suojauskonteksti, jolla on RPC:tä kutsuva asiakas // ja saada pääsy käyttäjän // -objekteihin "Window station" ja "Desktop". RpcImpersonateClient(h); hwinstaUser = OpenWindowStation("WinSta0", FALSE, MAXIMUM_ALLOWED); if (hwinstaUser == NULL) ( RpcRevertToSelf(); return 0; ) SetProcessWindowStation( hwinstaUser); hdeskUser = OpenDesktop("Oletus", 0, EPÄTOSI, MAXIMUM_ALLOWED); RpcRevertToSelf(); if (hdeskUser == NULL) ( SetProcessWindowStation(hwinstaSaveStser);0 return;hwindowSt; ) SetThreadDesktop(hdeskUser); // Näytä tavallinen teksti-ikkuna. tulos = MessageBox(NULL, lpszText, lpszTitle, fuStyle); // Palauta tallennetut objektit // "Window station" ja "Desktop". SetThreadDesktop(hdeskSave); SetProcessWindowStation(hwinstaSave); CloseDesktop(hdeskUser); CloseWindowStation(hwinstaUser); palauttaa tuloksen; ) void main() ( SERVICE_TABLE_ENTRY steTable = ((SERVICENAME, ServiceMain), (NULL, NULL) ); // Muodosta yhteys SCM:ään. Tämän toiminnon sisällä // pyynnöt vastaanotetaan ja lähetetään. StartServiceCtrlDispatcher(steTable); ) void WINAPI ServiceMain (DWORD dwArgc, LPSTR *psArgv) ( // Rekisteröi pyynnön käsittelijä välittömästi. hSS = RegisterServiceCtrlHandler(SERVICENAME, ServiceHandler); sStatus.dwCheckPoint = 0; sStatus.dwControlsAccepted = SERVICE_ACCEPT_ACCEPTUS; ExitC ode = 0;sTila. dwServiceType = SERVICE_WIN32_OWN_PROCESS; sStatus.dwWaitHint = 0; sStatus.dwWin32ExitCode = NOERROR; // Palvelun alustamiseksi kutsutaan InitService()-funktio; // Varmistaakseen, että järjestelmä ei // pura palvelua alustuksen aikana käynnistetään säie, joka raportoi kerran // sekunnissa, että palvelu on alustusvaiheessa. // Säikeen synkronointia varten luodaan tapahtuma. // Tämän jälkeen käynnistetään työsäie, // jolle tapahtuma on myös // luotu synkronoitavaksi. hSendStartPending = CreateEvent(NULL, TOSI, EPÄTOSI, NULL); HANDLE hSendStartThread; DWORD dwThreadId; hSendStartThread = CreateThread(NULL, 0, SendStartPending, NULL, 0, &dwThreadId); //Kaikki palvelun alustus tehdään täällä. InitService(); SetEvent(hSendStartPending); if(WaitForSingleObject(hSendStartThread, 2000) != WAIT_OBJECT_0) ( TerminateThread(hSendStartThread, 0); ) CloseHandle(hSendStartPending); CloseHandle(hSendStartThread); hWork = CreateEvent(NULL, TOSI, EPÄTOSI, NULL); hServiceThread = CreateThread(NULL, 0, ServiceFunc, 0, 0, &dwThreadId); sStatus.dwCurrentState = PALVELU KÄYNNISSÄ; SetServiceStatus(hSS, &sStatus); ) // Säietoiminto, joka lähettää ilmoituksia SCM:lle // joka sekunti, kun alustusprosessi on käynnissä. Funktio // päättyy, kun hSendStartPending // -tapahtuma on asetettu. DWORD WINAPI SendStartPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_START_PENDING; sStatus.dwWaitHint = 2000; // "Sleep" 1 sekunnin ajan. Jos 1 sekunnin kuluttua ei ole tullut //en-signaalia hding-tapahtumassa tila ( palvelun alustus ei ole // päättynyt), lähetämme seuraavan ilmoituksen, // asettamalla maksimiaikavälin // 2 sekuntiin, jotta // seuraavaan ilmoitukseen jää aikaa. while (true ) (SetServiceStatus(hSS, &sStatus); sStatus .dwCheckPoint++; if(WaitForSingleObject(hSendStartPending, 1000)!=WAIT_TIMEOUT) break; ) sStatus.dwCheckPoint; 0) palauttaa palvelun. //0 Tietojen lukeminen, // muistin varaus jne. void InitService() ( ... ) // Palvelukoodin sisältävä funktio. DWORD WINAPI ServiceFunc(LPVOID) ( while (true) ( ​​if (!bPause) ( // Tämä sisältää koodin, joka tyypillisesti // suorittaa jonkinlaisia ​​syklisiä toimintoja... ) if (WaitForSingleObject(hWork, 1000)!=WAIT_TIMEOUT ) break; ) return 0; ) // Pyynnönkäsittelijä SCM:stä void WINAPI ServiceHandler(DWORD dwCode) ( kytkin (dwCode) ( tapaus SERVICE_CONTROL_STOP: tapaus SERVICE_CONTROL_SHUTDOWN: ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR,0enddingSNULL0,0toped); TOSI, EPÄTOSI, NULL); hSendStopThread = CreateThread(NULL, 0, SendStopPending, NULL, 0, & dwThreadId); SetEvent(hWork); if (WaitForSingleObject(hServiceThread, 100WATh)h (OB) lue, 0); ) SetEvent(hSendStopPending); CloseHandle(hServiceThread); CloseHandle(hWork); if(WaitForSingleObject(hSendStopThread, 2000) != WAIT_OBJECT_0) ( TerminateThread(hServicehSendding); sStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus( hSS, &sStatus); tauko; case SERVICE_CONTROL_PAUSE: bPause = tosi; sStatus.dwCurrentState = PALVELU_KESKEYTETTY; SetServiceStatus(hSS, &sStatus); tauko; case SERVICE_CONTROL_CONTINUE: bTauko = tosi; sStatus.dwCurrentState = PALVELU KÄYNNISSÄ; SetServiceStatus(hSS, &sStatus); tauko; case SERVICE_CONTROL_INTERROGATE: SetServiceStatus(hSS, &sStatus); tauko; oletus: SetServiceStatus(hSS, &sStatus); tauko; ) ) // Säikeen toiminto, joka on samanlainen kuin SendStartPending // lopettaaksesi palvelun. DWORD WINAPI SendStopPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_STOP_PENDING; sStatus.dwWaitHint = 2000; while (true) ( ​​​​SetServiceStatus(WStahtusw); aitForSingleObject(hSendStopPending, 1000 )! =WAIT_TIMEOUT) tauko; ) sStatus.dwCheckPoint = 0; paluu 0; )

Sovelluksen suorittaminen Windows-palveluna

Onko mahdollista käyttää asiakassovellusta palveluna? Yhdessä niistä kuvailin tapoja luoda Windows-palvelu käyttämällä tavallisia käyttöjärjestelmän työkaluja. Jokainen konsolisovellus ei kuitenkaan voi toimia palveluna, eivätkä graafisella käyttöliittymällä varustetut ohjelmat periaatteessa voi toimia tällä tavalla. Mutta on silti mahdollista ajaa sovellusta palveluna, ja ohjelma, jolla on alkuperäinen nimi, auttaa meitä tässä Ei-imevä palvelupäällikkö.

NSSM on ilmainen ohjelmisto Kanssa avoin lähdekoodi ja tukee kaikkia Microsoft-käyttöjärjestelmiä Windows 2000:sta Windows 8:aan. NSSM ei vaadi asennusta, lataa ja pura se. Jakelu sisältää versiot 32- ja 64-bittisille käyttöjärjestelmille. Ohjelman saa nettisivuilta nssm.cc, tällä hetkellä uusin vakaa versio on 2.21.1, jota aion käyttää.

Osoittaaksemme NSSM:n ominaisuudet, yritetään ajaa Windowsin Muistio palveluna Windows 8.1:ssä.

Palvelun luominen

Luodaksesi palvelun nimeltä muistilehtiö käynnistä komentokonsoli, mene kansioon, jossa on pakattu NSSM (64-bittiselle Windowsille) ja kirjoita komento nssm install notepad, joka avaa NSSM:n graafisen asennusohjelman. Luodaksesi palvelun, määritä polku suoritettavaan tiedostoon Polku-kentässä ja napsauta "Asenna palvelu" -painiketta. Lisäksi Asetukset-kentässä voit määrittää palvelun käynnistämiseen tarvittavat avaimet.

Voit myös määrittää joitain lisäparametreja luodessasi uutta palvelua.

Shutdown-välilehti näyttää sammutustavat ja aikakatkaisut, joita käytetään, kun sovellus sammuu normaalisti tai kaatuu. Kun NSSM vastaanottaa pysäytyskomennon (esimerkiksi kun sovellus suljetaan), se yrittää pysäyttää ohjatun sovelluksen normaaliin tapaan. Jos sovellus ei vastaa, NSSM voi väkisin lopettaa kaikki tämän sovelluksen prosessit ja aliprosessit.

Sovelluksen sulkemiseen on neljä vaihetta, ja oletusarvoisesti niitä käytetään tässä järjestyksessä:

Ensimmäisessä vaiheessa NSSM yrittää luoda ja lähettää tapahtuman Ctrl+C. Tämä menetelmä toimii hyvin konsolisovellusten tai komentosarjojen kanssa, mutta ei sovellu graafisiin sovelluksiin.
NSSM havaitsee sitten kaikki sovelluksen luomat ikkunat ja lähettää niille WM_CLOSE-viestin, jolloin sovellus sulkeutuu.
Kolmas vaihe on, että NSSM laskee kaikki sovelluksen luomat säikeet ja lähettää niille WM_QUIT-sanoman, joka vastaanotetaan, jos sovelluksella on säikeen sanomajono;
Viimeisenä keinona NSSM voi kutsua TerminateProcess()-metodia pakottaen sovelluksen lopettamaan.

On mahdollista poistaa käytöstä jotkut tai jopa kaikki menetelmät, mutta ei erilaisia ​​sovelluksia Erilaiset menetelmät toimivat, ja sovelluksen sulkemiseksi oikein on suositeltavaa jättää kaikki ennalleen.

Kun palvelu kaatuu, NSSM yrittää oletusarvoisesti käynnistää sen uudelleen. "Poistumistoiminnot" -välilehdellä voit muuttaa automaattista toimintaa, kun sovellus päättyy epänormaalisti, sekä asettaa viiveen ennen kuin sovellus käynnistyy automaattisesti uudelleen.

"Input/Output (I/O)" -välilehdellä voit määrittää sovelluksen tulon/lähdön uudelleenohjauksen tiettyyn tiedostoon.

"Ympäristö"-välilehdellä voit asettaa palvelulle uusia ympäristömuuttujia tai ohittaa olemassa olevia.

Et voi myöskään käyttää graafista kuorta ja luoda heti palvelua konsoliin seuraavalla komennolla:

nssm asenna muistilehtiö ″C:\Windows\system32\notepad.exe″

Palvelujen hallinta

Kun olet luonut palvelun NSSM:llä, siirry Palvelut-laajennukseen ja etsi muistilehtiöpalvelu. Kuten näette, ulkonäöltään se ei eroa muista palveluista; voimme myös käynnistää sen, pysäyttää sen tai muuttaa käynnistystilaa. Huomaa kuitenkin, että nssm.exe on lueteltu suoritettavana tiedostona.

Ja jos siirrymme Task Manageriin, näemme seuraavan kuvan: NSSM on käynnissä pääprosessina (emoprosessina), notepad-palvelu on käynnissä sen aliprosessina ja Notepad-sovellus on jo käynnissä tässä aliprosessissa.

Palvelun poistaminen

Voit poistaa palvelun kirjoittamalla nssm remove notepad -komennon ja vahvistamalla sen poistamisen. Ja kirjoittamalla komennon nssm remove notepad vahvista , voit tehdä ilman vahvistusta.

Aloita palvelu interaktiivisesti

Tärkein ero mukautettu sovellus Palvelusta on se, että sovelluksen käynnistämisen jälkeen voi vaatia käyttäjältä lisätoimia työskentelyn jatkamiseksi - esimerkiksi painikkeen painamista tai komennon antamista. Tätä varten sinun on päästävä siihen, mikä, kuten käy ilmi, ei ole niin helppoa.

Palvelun käynnistämiseksi interaktiivisessa tilassa sinun on avattava sen ominaisuudet Palvelut-laajennuksessa ja "Kirjaudu"-välilehdellä on valittava "Salli vuorovaikutus työpöydän kanssa" -valintaruutu.

Ja sitten ihmeet alkavat :) Interaktiivisessa tilassa käynnistetty palvelu avautuu erillisessä istunnossa (istunto 0). Tähän istuntoon pääsee vain käyttämällä Interactive Services Detection Service -palvelua (ui0detect), joka valvoo vuorovaikutteisten palvelujen käynnistymistä tietokoneessa ja antaa hälytyksen. Windows 7\Server 2008:ssa tämä palvelu on oletuksena aktiivinen, mutta Windows 8\Server 2012:ssa se on poistettu käytöstä, eikä se näy Services graafisessa laajennuksessa (en ainakaan minä löytänyt sitä sieltä). Lisäksi, jos löydät tämän salaperäisen palvelun ja yrität käynnistää sen, saat virheilmoituksen.

Mutta tosiasia on, että sen suorittaminen edellyttää, että interaktiiviset palvelut toimivat tietokoneellasi. Siksi avaa rekisterieditori ja etsi kohdasta HKLM\System\CurrentControlSet\Control\Windows DWORD-tyyppinen parametri nimeltä NoInteractiveServices ja aseta sen arvoksi 0 .

Avaa sitten PowerShell-konsoli ja käynnistä etsintäpalvelu komennolla:

Aloituspalvelu -Nimi ui0detect

Kun olet varmistanut, että tunnistuspalvelu on käynnissä, käynnistämme muistilehtiöpalvelun uudelleen ja saamme tämän ikkunan. Valitse "Näytä viesti"

ja löydämme itsemme nollaistunnosta, jossa sovelluksemme toimii. Sitten suoritamme tarvittavat toimenpiteet sen kanssa ja palaamme takaisin.

Tämä on mielenkiintoinen ratkaisu sovellusten suorittamiseen Windows-palveluina. Ei kaunein, mutta nimensä mukainen :)

Viimeksi päivitetty: 31.10.2015

Yksi Windows-käyttöjärjestelmän tärkeimmistä osista on palvelut. Itse asiassa nämä ovat erillisiä sovelluksia, joissa ei ole graafista käyttöliittymää ja jotka suorittavat erilaisia ​​tehtäviä taustalla. Palvelut voidaan käynnistää käyttöjärjestelmän käynnistyessä tai milloin tahansa muuna käyttäjän työskentelyn aikana. Yleinen esimerkki palveluista ovat erilaiset web-palvelimet, jotka kuuntelevat taustalla tiettyä porttia yhteyksiä varten ja jos yhteyksiä on, ne ovat vuorovaikutuksessa niiden kanssa. Nämä voivat olla myös erilaisia ​​lisäpäivityspalveluita muille asennetut ohjelmat, joka ottaa yhteyttä palvelimeen selvittääkseen, onko olemassa uusi versio sovellukset. Yleensä voimme avata palvelupaneelin ja nähdä itse kaikki asennetut ja käynnissä olevat palvelut:

Katsotaanpa, kuinka voit luoda omia palveluita C#:ssa. Toteutettavaksi tehtäväksi valitsemme tiedostojärjestelmän tietyn kansion muutosten seurannan. Luodaan nyt palvelu sen suorittamiseksi.

Luodaan ensin uusi projekti, jonka tyyppi on Windows Service. Kutsutaan projektia FileWatcherServiceksi:

Visual Studio luo sitten projektin, jossa on kaikki mitä tarvitset. Vaikka meidän ei välttämättä tarvitse valita tämäntyyppistä projektia, voisimme luoda luokkakirjastoprojektin ja määrittää sitten kaikki tarvittavat luokat siihen.

Uusi projekti näyttää siis tältä:

Siellä on myös tiedosto Program.cs ja varsinainen palvelusolmu Service1.cs.

Palvelu edustaa normaalia sovellusta, mutta se ei käynnisty itsestään. Kaikki puhelut ja pääsy siihen menevät palvelunhallinnan (Service Control Manager tai SCM) kautta. Kun palvelu käynnistyy automaattisesti järjestelmän käynnistyksen yhteydessä tai manuaalisesti, SCM kutsuu Main-menetelmää Ohjelma-luokassa:

Staattinen luokkaohjelma ( staattinen void Main() ( ServiceBase ServicesToRun; ServicesToRun = new ServiceBase ( new Service1() ); ServiceBase.Run(ServicesToRun); ) )

Main-menetelmä on oletusarvoisesti määritetty suorittamaan useita palveluita kerralla, jotka on määritelty ServicesToRun-taulukossa. Oletusarvoisesti projekti sisältää kuitenkin vain yhden palvelun, Service1. Itse käynnistys suoritetaan Run-menetelmällä: ServiceBase.Run(ServicesToRun) .

Aloitettavaa palvelua edustaa Service1.cs-solmu. Tämä ei kuitenkaan ole itse asiassa yksinkertainen kooditiedosto. Jos avaamme tämän solmun, näemme palvelusuunnittelijatiedoston Service1.Designer.cs ja Service1-luokan.

Palvelu1-luokka edustaa itse asiassa palvelua. Oletuksena siinä on seuraava koodi:

Järjestelmän käyttö; käyttäen System.Collections.Generic; käyttäen System.ComponentModel; käyttäen System.Data; käyttämällä System.Diagnostics -ohjelmaa; käyttäen System.Linq; käyttäen System.ServiceProcess; käyttäen System.Text; käyttäen System.Threading.Tasks; nimitila FileWatcherService ( julkinen osittainen luokka Palvelu1: ServiceBase ( julkinen palvelu1() ( InitializeComponent(); ) suojattu ohitus void OnStart(string args) ( ) suojattu ohitus void OnStop() ( ) ) )

Palveluluokan on perittävä ServiceBase-perusluokasta. Tämä luokka määrittelee useita menetelmiä, joista tärkeimmät ovat OnStart()-metodi, joka käynnistää palvelun suorittamat toimet, ja OnStop()-metodi, joka pysäyttää palvelun.

Kun SCM kutsuu Main-menetelmää ja rekisteröi palvelun, se kutsutaan suoraan suorittamalla OnStart-menetelmä.

Palvelukonsolissa tai sen kautta komentorivi lähetämme komennon lopettaa palvelun, sitten SCM kutsuu OnStop-menetelmää lopettaakseen sen.

Näiden palveluluokan kahden menetelmän lisäksi voit ohittaa useita muita ServiceBase-perusluokan menetelmiä:

    OnPause: Soitetaan, kun palvelu on keskeytetty

    OnContinue: Kutsutaan, kun palvelu jatkuu sen jälkeen, kun se on keskeytetty

    OnShutdown: Kutsutaan, kun Windows sammuu

    OnPowerEvent: Kutsutaan, kun virtatila vaihtuu

    OnCustomCommand: Kutsutaan, kun palvelu vastaanottaa mukautetun komennon Service Control Managerilta (SCM)

Luokan Service1 rakentajassa kutsutaan InitializeComponent()-metodia, joka on määritelty suunnittelijatiedostossa Service1.Designer.cs:

Nimiavaruus FileWatcherService ( osaluokka Service1 ( yksityinen System.ComponentModel.IContainer komponentit = null; suojattu ohitus void Dispose(bool disposing) ( if (disposing && (komponentit != null)) ( komponentit.Dispose(); ) base.Dispose(disposing ); ) private void InitializeComponent() ( komponentit = uusi System.ComponentModel.Container(); this.ServiceName = "Palvelu1"; ) ) )

Ainoa asia, joka on huomioitava siinä, on palvelun nimen asettaminen (ServiceName-ominaisuus):

This.ServiceName = "Palvelu1";

Tämä on nimi, joka näkyy palvelukonsolissa tämän palvelun asennuksen jälkeen. Voimme muuttaa sen tai voimme jättää sen sellaisena kuin se on.

Vaihdetaan nyt palvelukoodi seuraavasti:

Järjestelmän käyttö; käyttäen System.ServiceProcess; käyttäen System.IO:ta; käyttäen System.Threading; nimiavaruus FileWatcherService ( julkinen osittainen luokka Service1: ServiceBase ( Loggeri logger; public Service1() ( InitializeComponent(); this.CanStop = true; this.CanPauseAndContinue = true; this.AutoLog = true; ) suojattu ohitus void OnStart(merkkijono args) ( logger = new Logger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); ) suojattu ohitus 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 Aloita() ( watcher.EnableRaisingEvents = true; while(käytössä) ( Thread.Sleep(1000); ) ) public void Stop() ( watcher.EnableRaisingEvents = false; enabled = false; ) // tiedostojen uudelleennimeäminen private void Watcher_Renamed(objektin lähettäjä, RenamedEventArgs e) ( string fileEvent = "nimetty uudelleen muotoon " + e.FullPath; merkkijono filePath = e.OldFullPath; RecordEntry(tiedostoTapahtuma, tiedostopolku); ) // tiedostojen muuttaminen yksityinen void Watcher_Changed(objektin lähettäjä, FileSystemEventArgs e) ( string fileEvent = "muutettu"; merkkijono filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // tiedostojen luominen yksityinen void Watcher_Created(objektin lähettäjä, FileSysys e) ( merkkijono fileEvent = "luotu"; merkkijono tiedostoPath = e.FullPath; RecordEntry(fileEvent, filePath); ) // tiedostojen poistaminen private void Watcher_Deleted(objektin lähettäjä, FileSystemEventArgs e) ( merkkijono fileEvent = "poistettu"; merkkijono tiedostoPath = e.FullPath; RecordEntry(fileEvent, filePath); ) private void RecordEntry(merkkijono fileEvent, string filePath) ( lukko (obj) ( käyttäen (StreamWriter writer = new StreamWriter("D:\\templog.txt", true)) ( writer.WriteLine(String.Format("(0) tiedosto (1) oli (2)", DateTime.Now.ToString("pp/MM/yyyy hh:mm:ss"), filePath, fileEvent)); kirjoittaja. Huuhtele(); ) ) ) ) )

Avainluokka, joka kapseloi kaikki toiminnot, on Logger-luokka. FileSystemWatcher-objektin avulla se seuraa kansion muutoksia D://Temp. Start()-menetelmä määrittää, että tarkkailemme muutoksia FileSystemWatcher-objektin kautta. Ja kaikki työ jatkuu niin kauan kuin käytössä oleva boolean-muuttuja on tosi. Ja Stop()-metodi sallii luokan lopettamisen.

FileSystemWatcher-tapahtumien avulla voit seurata kaikkia tarkkailtuun kansioon tehtyjä muutoksia. Tämä tallentaa muutokset templog.txt-tiedostoon. Jotta vältetään resurssikilpailu templog.txt-tiedostosta, johon muutokset tallennetaan, lock(obj)-tynkä estää tallennusprosessin.

Tämän seurauksena lokitiedosto sisältää luomisen, muuttamisen, uudelleennimeämisen ja poistamisen jälkeen jotain seuraavanlaista:

30.07.2015 12:15:40 tiedosto D:\Temp\Uusi tekstidokumentti.txt luotiin 30.07.2015 12:15:46 tiedosto D:\Temp\New text document.txt nimettiin uudelleen muotoon D:\ Temp\hello.txt 30.7.2015 12:15:55 tiedostoa D:\Temp\hello.txt muokattu 30.07.2015 12:15:55 tiedostoa D:\Temp\hello.txt muokattu 30.7. /2015 12:16:01 tiedosto D: \Temp\hello.txt on poistettu

Itse Service1-palveluluokassa konstruktoriin on asetettu useita vaihtoehtoja:

This.CanStop = tosi; // palvelu voidaan pysäyttää tämän.CanPauseAndContinue = true; // palvelu voidaan keskeyttää ja jatkaa tämän jälkeen.AutoLog = true; // palvelu voi kirjoittaa lokiin

OnStart()-metodissa uusi säiettä kutsutaan aloittamaan Logger-objekti:

Suojattu ohitus void OnStart(string args) ( logger = new Logger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); )

Uusi säiettä tarvitaan, koska nykyinen säie käsittelee vain SCM-komentoja ja sen on palattava OnStart-menetelmästä mahdollisimman nopeasti.

Kun SCM:ltä vastaanotetaan komento palvelun pysäyttämiseksi, OnStop-menetelmä laukeaa, joka kutsuu logger.Stop()-metodia. Lisäviive sallii loggerin säikeen pysähtymisen:

Suojattu ohitus void OnStop() ( logger.Stop(); Thread.Sleep(1000); )

Palveluluokka itsessään ei kuitenkaan riitä. Meidän on myös luotava palvelun asennusohjelma.

Tai käyttäjien työpöytä (sekä paikalliset että etäiset), mutta joissakin palveluissa poikkeus on mahdollinen - vuorovaikutus konsolin kanssa (istuntonumero 0, johon käyttäjä on rekisteröitynyt paikallisesti tai palvelua käynnistettäessä mstsc/console-kytkimellä).

Palveluille on useita tiloja:

  • laukaisu kielletty;
  • manuaalinen käynnistys (pyynnöstä);
  • automaattinen käynnistys, kun tietokone käynnistyy;
  • automaattinen (viivästetty) käynnistys (otettu käyttöön Windows Vistassa ja Windows Server 2008:ssa);
  • pakollinen huolto/ajuri (automaattinen käynnistys ja kyvyttömyys (käyttäjälle) pysäyttää palvelu).

Taustatila

Käynnistä, pysäytä ja muuta Windows-palveluita

Palveluita ja niiden ominaisuuksia voidaan muuttaa MMC:ssä:

Käyttöjärjestelmien eri versioissa voi olla joitain palveluita mutta ei toisia. Jotkut erikseen asennettavat sovellukset ja ohjelmat voivat myös luoda omia palvelujaan.

Luettelo Microsoft Windows -käyttöjärjestelmäpalveluista

Näyttönimi Palvelun nimi Toiminnot Kuvaus
DHCP asiakas Dhcp Rekisteröi ja päivittää tämän tietokoneen IP-osoitteet ja DNS-tietueet. Jos tämä palvelu pysäytetään, tämä tietokone ei pysty hankkimaan dynaamisia IP-osoitteita ja suorittamaan DNS-päivityksiä.
DNS-asiakas Dnscache DNS-asiakaspalvelu (dnscache) tallentaa välimuistiin DNS (Domain Name System) -nimiä ja rekisteröi tietyn tietokoneen täydellisen nimen. Jos palvelu pysäytetään, DNS-nimen selvittäminen jatkuu. DNS-nimijonojen tuloksia ei kuitenkaan tallenneta välimuistiin eikä tietokoneen nimeä rekisteröidä.
KtmRm hajautetun tapahtuman koordinaattorille KtmRm Koordinoi tapahtumia MSDTC:n ja Kernel Transaction Managerin (KTM) välillä.
ReadyBoost EMDMgmt ReadyBoost Tuki järjestelmän suorituskyvyn parantamiseen ReadyBoost-tekniikan avulla.
Superfetch SysMain Superfetch Ylläpitää ja parantaa järjestelmän suorituskykyä.
Windows Audio Audiosrv Äänityökalujen hallinta Windows-ohjelmille. Jos tämä palvelu pysäytetään, äänilaitteet ja tehosteet eivät toimi oikein.
Windows CardSpace idsvc Tarjoaa turvallisen mahdollisuuden luoda, hallita ja paljastaa digitaalisia identiteettejä.
Automaattinen päivitys WUAUSERV Sisältää Windows-päivitysten lataamisen ja asennuksen. Jos palvelu on poistettu käytöstä, tämä tietokone ei voi käyttää automaattisia päivityksiä tai Windows Update -Web-sivustoa.
Remote Procedure Call (RPC) RpcSs Tarjoaa kartoituksen päätepisteiden ja muiden RPC-palvelujen välillä.

Luettelo Microsoftin sovellusten ja ohjelmien luomista palveluista

Esimerkkejä kolmannen osapuolen sovellusten ja ohjelmien luomista palveluista

Näyttönimi Palvelun nimi Toiminnot Kuvaus
ESET HTTP-palvelin EhttpSrv virustorjunta ESET HTTP Server -komponentti