Internet. Számítógép. Segítség. Tanácsot. Javítás

A Windows mely szolgáltatásaira van szükség, és melyeket lehet letiltani. Alkalmazás futtatása Windows szolgáltatásként, mely felhasználó alatt futnak a szolgáltatások Windowsban

Alkalmazás futtatása Windows szolgáltatásként

Lehetséges-e szolgáltatásként kliens alkalmazást futtatni? Az egyikben leírtam, hogyan lehet Windows szolgáltatást létrehozni szokásos operációs rendszer eszközeivel. Nem minden konzolalkalmazás tud majd szolgáltatásként futni, a grafikus felülettel rendelkező programok pedig elvileg nem működhetnek így. De továbbra is van lehetőség az alkalmazás szolgáltatásként való futtatására, ebben lesz segítségünkre az eredeti nevű program. Nem szívás szolgáltatásvezető.

Az NSSM egy ingyenes és nyílt forráskódú szoftver, amely támogatja az összes Microsoft operációs rendszert a Windows 2000-től a Windows 8-ig. Az NSSM nem igényel telepítést, csak töltse le és bontsa ki. A terjesztési készlet 32 ​​bites és 64 bites operációs rendszerhez készült verziókat tartalmaz. A programot az nssm.cc oldalról lehet beszerezni, jelenleg a legfrissebb stabil verzió a 2.21.1, amit használni fogok.

Az NSSM képességeinek bemutatásához próbáljuk meg futtatni a Windows Jegyzettömb szolgáltatást Windows 8.1 rendszeren.

Hozzon létre egy szolgáltatást

nevű szolgáltatás létrehozásához jegyzettömb indítsa el a parancskonzolt, lépjen a kicsomagolt NSSM-t tartalmazó mappába (64 bites Windows esetén), és írja be az nssm install notepad parancsot, amely megnyitja az NSSM grafikus telepítőablakát. Szolgáltatás létrehozásához elég megadni a futtatható fájl elérési útját az Elérési út mezőben, és rákattintani a "Szolgáltatás telepítése" gombra. Ezenkívül a Beállítások mezőben megadhatja a szolgáltatás indításához szükséges kulcsokat.

Ezenkívül az új szolgáltatás létrehozásának szakaszában megadhat néhány további paramétert.

A Leállítás lap felsorolja az alkalmazás normál leállítása vagy vészleállítása során használt leállítási módszereket és időtúllépéseket. Amikor az NSSM leállítási parancsot kap (pl. amikor egy alkalmazás leáll), a normál módon megkísérli leállítani a vezérelt alkalmazást. Ha az alkalmazás nem válaszol, akkor az NSSM erőszakkal leállíthatja az alkalmazás összes folyamatát és alfolyamatait.

Összesen négy alkalmazásleállítási lépés van, amelyek alapértelmezés szerint a következő sorrendben kerülnek felhasználásra:

Az első lépésben az NSSM megpróbál eseményt generálni és elküldeni ctrl+c. Ez a módszer jól működik konzolalkalmazásokhoz vagy szkriptekhez, de nem grafikus alkalmazásokhoz;
Az NSSM ezután észleli az alkalmazás által létrehozott összes ablakot, és WM_CLOSE üzenetet küld nekik, hogy kikényszerítse az alkalmazást;
A harmadik lépésben az NSSM kiértékeli az alkalmazás által létrehozott összes szálat, és küld nekik egy WM_QUIT üzenetet, amelyet akkor kap, ha az alkalmazásnak van szál üzenetsora;
Végső megoldásként pedig az NSSM meghívhatja a TerminateProcess() metódust, ezzel erőszakosan leállítva az alkalmazást.

Lehetőség van néhány vagy akár az összes metódus letiltására is, azonban különböző módszerek működnek a különböző alkalmazásoknál, és ajánlatos mindent a régiben hagyni, hogy az alkalmazás megfelelően leálljon.

Alapértelmezés szerint, amikor egy szolgáltatás összeomlik, az NSSM megpróbálja újraindítani. A "Kilépési műveletek" lapon módosíthatja az automatikus műveletet az alkalmazás rendellenes leállása esetén, valamint beállíthat egy késleltetést, mielőtt az alkalmazás automatikusan újraindul.

Az "Input / Output (I / O)" fülön beállíthatja az alkalmazás bemeneti / kimeneti átirányítását a megadott fájlra.

A "Környezet" lapon új környezeti változókat állíthat be a szolgáltatáshoz, vagy felülírhatja a meglévőket.

Nem is használhatja a grafikus héjat, és azonnal létrehozhat egy szolgáltatást a konzolban a következő paranccsal:

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

Szolgáltatás kezelés

Miután létrehozta a szolgáltatást az NSSM használatával, nyissa meg a Szolgáltatások beépülő modult, és keresse meg a jegyzettömb szolgáltatást. Mint látható, megjelenésében semmiben sem különbözik a többi szolgáltatástól, mi is elindíthatjuk, leállíthatjuk vagy megváltoztathatjuk az indítási módot. Ne feledje azonban, hogy az nssm.exe futtatható fájlként szerepel.

Ha pedig a Feladatkezelőbe lép, a következő képet fogjuk látni: Az NSSM fő (szülő) folyamatként, a jegyzettömb szolgáltatás utódfolyamatként fut, és a Jegyzettömb alkalmazás már ebben a gyermekfolyamatban fut.

Szolgáltatás eltávolítása

A szolgáltatás eltávolításához írja be az nssm Remove notepad parancsot, és erősítse meg az eltávolítást. Az nssm remove notepad megerősítés beírásával pedig megerősítés nélkül is megteheti.

Szolgáltatás interaktív indítása

A fő különbség a felhasználói alkalmazások és a szolgáltatások között az, hogy az indítást követően az alkalmazás további műveleteket igényelhet a felhasználó részéről, például egy gombra kattintásra vagy egy parancs beírására, hogy tovább futhasson. Ehhez hozzá kell jutni, ami, mint kiderült, nem is olyan egyszerű.

A szolgáltatás interaktív módban történő elindításához meg kell nyitnia annak tulajdonságait a Szolgáltatások beépülő modulban, és a "Bejelentkezés" lapon be kell jelölnie az "Interakció engedélyezése az asztallal" jelölőnégyzetet.

És akkor elkezdődnek a csodák 🙂 Egy interaktív módban elindított szolgáltatás izolált munkamenetben nyílik meg (0. munkamenet). Ehhez a munkamenethez csak az Interactive Services Detection Service (ui0detect) férhet hozzá, amely figyeli az interaktív szolgáltatások indulását a számítógépen, és riasztást generál. A Windows 7\Server 2008-ban ez a szolgáltatás alapértelmezés szerint engedélyezve van, de a Windows 8\Server 2012-ben le van tiltva, és nem jelenik meg a Szolgáltatások grafikus beépülő moduljában (legalábbis én nem találtam). Sőt, ha megtalálja ezt a rejtélyes szolgáltatást, és megpróbálja elindítani, hibaüzenetet fog kapni.

De tény, hogy futtatásához engedélyeznie kell az interaktív szolgáltatások elindítását a számítógépen. Ezért megnyitjuk a rendszerleíróadatbázis-szerkesztőt, és a HKLM\System\CurrentControlSet\Control\Windows részben keresünk egy duplaszó-paramétert a névvel Nincsenek interaktív szolgáltatásokés állítsa be az értékét 0 .

Ezután megnyitjuk a PowerShell konzolt, és elindítjuk a felderítési szolgáltatást a következő paranccsal:

Start-Service -Name ui0detect

Miután megbizonyosodtunk arról, hogy a felderítési szolgáltatás fut, újraindítjuk a jegyzettömb szolgáltatást, és ezt az ablakot kapjuk. Válassza az "Üzenet megtekintése" lehetőséget

és belépünk a nulla munkamenetbe, amelyben az alkalmazásunk fut. Ezután elvégezzük vele a szükséges műveleteket, és visszatérünk.

Egy ilyen érdekes megoldás az alkalmazások futtatására, mint a Windows szolgáltatások. Nem a legszebb, de a nevéhez hűen 🙂

A szolgáltatások működését egy speciális Windows-kezelőben konfigurálhatja. A megnyitáshoz használja a Windows + R billentyűkombinációt, a megjelenő sorba írja be a services.msc parancsot, és nyomja meg az Enter billentyűt. Ugyanazt vagy hasonló ablakot fog látni (ha az operációs rendszer régebbi verzióinak egyike van):

A menedzser táblázatban jeleníti meg a szolgáltatásokat. Itt megtekintheti az elérhető szolgáltatások listáját, elolvashatja rövid leírásukat és megtudhatja az aktuális állapotot. Különösen fontos az Indítási típus oszlop. Ő mutatja meg, hogy egy adott szolgáltatás engedélyezve van-e, és milyen módban indítja el a rendszer.

Az egyik szolgáltatásra duplán kattintva megnyílik egy ablak, amelyben letilthatja azt. Elég megnyitni az "Indítási típus" elemet, kiválasztani a "Letiltva" lehetőséget, és kattintson az "OK" gombra. De az egyéb indítási lehetőségek között van egy „Kézi” érték. Biztonsági okokból válassza ki az összes szolgáltatáshoz, amelyet le szeretne tiltani. Ez lehetővé teszi, hogy a rendszer akkor indítsa el a szolgáltatásokat, amikor valóban szükség van rájuk, és ne veszítse rájuk a fennmaradó időt.

Ne tiltsa le teljesen a szolgáltatásokat, csak kapcsolja kézi módba.

Az alább felsorolt ​​szolgáltatások nem kritikusak a rendszer működése szempontjából, és sok felhasználó nélkülözheti őket. Ezért ezeket a szolgáltatásokat manuális módba állíthatja. Mielőtt bármilyen változtatást végrehajtana, feltétlenül olvassa el a rövid leírásokat, hogy ne hagyja abba az Ön számára fontos szolgáltatásokat.

Előfordulhat, hogy a listánk egyes szolgáltatásai már teljesen le vannak tiltva a számítógépén, vagy kezdetben kézi módban működnek. Ebben az esetben egyszerűen hagyja ki őket.

A szolgáltatások konfigurálása során elkövetett hibák a rendszer hibás működéséhez vezethetnek. Ha változtatásokat hajt végre, felelősséget vállal.

A módosítások érvénybe lépéséhez a beállítás után ne felejtse el újraindítani a számítógépet.

Kézi módba kapcsolható Windows szolgáltatások

A listán szereplő egyes szolgáltatások orosz nyelvű neve eltérhet a számítógépén láthatótól. De ez csak a megfogalmazásra vonatkozik. Ha nem találja a keresett szolgáltatást a pontos név alapján, keressen hasonló jelentésű lehetőségeket.

Windows 10

  • Funkcionalitás a csatlakoztatott felhasználók számára és a telemetria (Connected User Experiences és Telemetria).
  • Diagnosztikai nyomkövető szolgáltatás.
  • dmwappushsvc.
  • Letöltött Maps Manager – ha nem használja a Térkép alkalmazást.
  • Érintse meg a Billentyűzet és kézírás panel szolgáltatás lehetőséget.
  • Windows Defender szolgáltatás.

Windows 8/8.1

  • Diagnosztikai házirend szolgáltatás.
  • Distributed Link Tracking Client – ​​ha a számítógép nem csatlakozik semmilyen hálózathoz.
  • IP Helper – ha nem használ IPv6 kapcsolatot.
  • Programkompatibilitási asszisztens szolgáltatás.
  • Nyomtatási sorkezelő – ha nincs nyomtatója.
  • Remote Registry – Ez a szolgáltatás teljesen letiltható.
  • Másodlagos bejelentkezés.
  • Biztonsági Központ.
  • NetBIOS Helper TCP/IP-n keresztül (TCP/IP NetBIOS Helper).
  • Windows hibajelentési szolgáltatás.
  • Windows Image Acquisition (WIA) – ha nem rendelkezik szkennerrel.
  • Windows Search – ha nem használja a Windows keresési funkcióját.

Windows 7

  • Számítógépböngésző – ha a számítógép nem csatlakozik egyetlen hálózathoz sem.
  • Diagnosztikai házirend szolgáltatás.
  • Distributed Link Tracking Client – ​​ha a számítógép nem csatlakozik semmilyen hálózathoz.
  • IP Helper – ha nem használ IPv6 kapcsolatot.
  • Offline fájlok (Offline fájlok).
  • Portable Device Enumerator Service.
  • Nyomtatási sorkezelő – ha nincs nyomtatója.
  • Védett tárolás.
  • Remote Registry – Ez a szolgáltatás teljesen letiltható.
  • Másodlagos bejelentkezés.
  • Biztonsági Központ.
  • Szerver (Szerver) - ha a számítógépet nem használják szerverként.
  • NetBIOS Helper TCP/IP-n keresztül (TCP/IP NetBIOS Helper).
  • Windows hibajelentési szolgáltatás.
  • Windows Search – ha nem használja a Windows keresési funkcióját.

Windows Vista

  • Számítógépböngésző – ha a számítógép nem csatlakozik egyetlen hálózathoz sem.
  • Desktop Window Manager Session Manager – ha nem az Aero témát használja.
  • Diagnosztikai házirend szolgáltatás.
  • Distributed Link Tracking Client – ​​ha a számítógép nem csatlakozik semmilyen hálózathoz.
  • Offline fájlok (Offline fájlok).
  • Portable Device Enumerator Service.
  • Nyomtatási sorkezelő – ha nincs nyomtatója.
  • Ready Boost.
  • Remote Registry – Ez a szolgáltatás teljesen letiltható.
  • Másodlagos bejelentkezés.
  • Biztonsági Központ.
  • Szerver (Szerver) - ha a számítógépet nem használják szerverként.
  • Tablet PC beviteli szolgáltatás.
  • NetBIOS Helper TCP/IP-n keresztül (TCP/IP NetBIOS Helper).
  • Témák – ha klasszikus Windows-témát használ.
  • Windows hibajelentési szolgáltatás.
  • Windows Media Center szolgáltatásindító.
  • Windows Search – ha nem használja a Windows keresési funkcióját.

Windows XP

  • Figyelmeztető.
  • Számítógépböngésző – ha a számítógép nem csatlakozik egyetlen hálózathoz sem.
  • Distributed Link Tracking Client – ​​ha a számítógép nem csatlakozik semmilyen hálózathoz.
  • Indexelő szolgáltatás – ha nem használja a Windows Search szolgáltatást.
  • Internetes tűzfal (ICF) / Internetkapcsolat megosztása (ICS) (Internetkapcsolati tűzfal / Internetkapcsolat megosztása).
  • Üzenetszolgáltatás (Messenger).
  • Remote Registry – Ez a szolgáltatás teljesen letiltható.
  • Másodlagos bejelentkezés.
  • Szerver (Szerver) - ha a számítógépet nem használják szerverként.
  • Rendszer-visszaállítási szolgáltatás.
  • NetBIOS Helper TCP/IP-n keresztül (TCP/IP NetBIOS Helper).
  • Szünetmentes tápegység.
  • Feltöltéskezelő.
  • Vezeték nélküli nulla konfiguráció.

Utolsó frissítés: 2015.10.31

A szolgáltatások a Windows operációs rendszer egyik legfontosabb összetevője. Valójában ezek különálló alkalmazások, amelyek nem rendelkeznek grafikus felülettel, és különféle feladatokat hajtanak végre a háttérben. A szolgáltatások elindíthatók az operációs rendszer indulásakor, vagy a felhasználó munkája során bármikor. A szolgáltatások gyakori példája a különféle webszerverek, amelyek a háttérben egy adott porton figyelik a kapcsolatokat, és ha vannak kapcsolatok, akkor interakcióba lépnek velük. Különböző segédfrissítési szolgáltatások is lehetnek más telepített programok számára, amelyek kapcsolatba lépnek a kiszolgálóval, hogy megtudják, van-e új verziója az alkalmazásnak. Általában megnyithatjuk a szolgáltatások panelt, és megnézhetjük magunknak az összes telepített és futó szolgáltatást:

Nézzük meg, hogyan hozhat létre saját szolgáltatásokat C#-ban. Megvalósítandó feladatként a fájlrendszer egy adott mappájában bekövetkező változások figyelését választjuk. Most hozzunk létre egy szolgáltatást a futtatásához.

Először is hozzunk létre egy új projektet, amely Windows Service típusú lesz. Nevezzük el a projektet FileWatcherService:

Ezt követően a Visual Studio létrehoz egy projektet, amelyben minden szükséges. Bár elvileg nem kell ezt a konkrét projekttípust választanunk, létrehozhatunk egy osztálykönyvtári projektet, majd meghatározhatjuk benne az összes szükséges osztályt.

Tehát az új projekt így néz ki:

Van még egy Program.cs fájl, és ott van maga a Service1.cs szolgáltatáscsomópont.

A szolgáltatás egy normál alkalmazást képvisel, de nem indul el magától. Minden hívás és hozzáférés a Service Control Manageren (SCM) keresztül történik. Amikor a szolgáltatás automatikusan elindul a rendszer indításakor vagy manuálisan, az SCM meghívja a Main metódust a Program osztályban:

Statikus osztályú program ( static void Main() ( ServiceBase ServicesToRun; ServicesToRun = new ServiceBase ( new Service1() ); ServiceBase.Run(ServicesToRun); ) )

A Main metódus alapértelmezés szerint több szolgáltatás futtatására van definiálva, amelyek a ServicesToRun tömbben vannak definiálva. Alapértelmezés szerint azonban a projekt csak egy szolgáltatást tartalmaz, a Service1-et. Maga az indítás a Run metódussal történik: ServiceBase.Run(ServicesToRun) .

Magát az indítandó szolgáltatást a Service1.cs csomópont képviseli. Ez azonban valójában nem egy egyszerű kódfájl. Ha megnyitjuk ezt a csomópontot, akkor a Service1.Designer.cs szolgáltatástervező fájlt és a Service1 osztályt fogjuk látni benne.

A Service1 osztály valójában a szolgáltatást képviseli. Alapértelmezés szerint a következő kóddal rendelkezik:

Rendszer használata; a System.Collections.Generic használatával; a System.ComponentModel használatával; a System.Data használatával; a System.Diagnostics használatával; a System.Linq; a System.ServiceProcess használatával; a System.Text használatával; a System.Threading.Tasks használatával; névtér FileWatcherService ( nyilvános részleges osztály Service1: ServiceBase ( public Service1() ( InitializeComponent(); ) protected override void OnStart(string args) ( ) protected override void OnStop() ( ) ) )

A szolgáltatási osztálynak örökölnie kell a ServiceBase alaposztályt. Ez az osztály számos metódust definiál, amelyek közül a legfontosabbak az OnStart() metódus, amely elindítja a szolgáltatás által végrehajtott műveleteket, és az OnStop() metódus, amely leállítja a szolgáltatást.

Miután az SCM meghívja a Main metódust és regisztrálja a szolgáltatást, közvetlenül az OnStart metódus futtatásával hívja meg.

Amikor parancsot küldünk a szolgáltatás leállítására a szolgáltatáskonzolon vagy a parancssorban, az SCM meghívja az OnStop metódust a leállításhoz.

A szolgáltatásosztály e két metódusán kívül a ServiceBase alaposztály több további metódusát is felülírhatja:

    OnPause: akkor hívják meg, ha a szolgáltatás szünetel

    OnContinue : Akkor hívják, ha a szolgáltatást a felfüggesztés után folytatják

    OnShutdown: Akkor hívják, amikor a Windows leáll

    OnPowerEvent: akkor hívják meg, ha az energia üzemmód megváltozik

    OnCustomCommand: Akkor hívják meg, ha a szolgáltatás egyéni parancsot kap a Service Control Managertől (SCM)

A Service1 osztály konstruktora meghívja az InitializeComponent() metódust, amely a Service1.Designer.cs tervezőfájlban van definiálva:

Névtér FileWatcherService ( részleges osztály Service1 ( privát System.ComponentModel.IContainer összetevők = null; védett felülírás void Dispose(bool disposing) ( if (disposing && (components != null)) ( parts.Dispose(); ) base.Dispose(disposing ); ) private void InitializeComponent() ( komponensek = new System.ComponentModel.Container(); this.ServiceName = "Szolgáltatás1"; ) ) )

Az egyetlen dolog, amit meg kell jegyezni, az a szolgáltatás nevének beállítása (ServiceName tulajdonság):

This.ServiceName = "Szolgáltatás1";

Ez a név jelenik meg a szolgáltatási konzolon a szolgáltatás telepítése után. Megváltoztathatjuk, vagy hagyhatjuk úgy, ahogy van.

Most változtassuk meg a szervizkódot az alábbiak szerint:

Rendszer használata; a System.ServiceProcess használatával; a System.IO használatával; a System.Threading használatával; névtér FileWatcherService ( nyilvános részleges osztály Service1: ServiceBase ( Logger logger; public Service1() ( InitializeComponent(); this.CanStop = true; this.CanPauseAndContinue = true; this.AutoLog = true; ) védett felülírás void OnStart(karakterlánc) ( logger = new Logger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); ) védett felülírás void OnStop() ( logger.Stop(); Thread.Sleep(1000); ) ) class Logger ( FileSystemWatcher figyelő; objektum obj = új objektum(); bool engedélyezve = igaz; 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; ) // fájlok átnevezése private void Watcher_Renamed(objektum küldője, RenamedEventArgs e) ( string fileEvent = "átnevezve erre: " + e.FullPath; string filePath = e.OldFullPath; RecordEntry(fileEvent, filePath); ) // fájlok módosítása private void Watcher_Changed(object sender, FileSystemEventArgs e) ( string fileEvent = "changed"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // fájlok létrehozása private void Watcher_Created(objectEvent, FileSysys e) ( string fileEvent = "létrehozva"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // fájlok törlése private void Watcher_Deleted(objektum feladó, FileSystemEventArgs e) ( string fileEvent = "törölt"; 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("nn/MM/yyyy hh:mm:ss"), filePath, fileEvent)); író. Öblítés(); ) ) ) ) )

Az összes funkciót magába foglaló kulcsosztály a Logger osztály. A FileSystemWatcher objektum segítségével figyeli a mappában bekövetkezett változásokat D://Temp. A Start() metódus azt határozza meg, hogy a FileSystemWatcher objektumon keresztül figyeljük a változásokat. És minden munka addig megy, amíg az engedélyezett logikai változó igaz. A Stop() metódus pedig lehetővé teszi az osztály befejezését.

A FileSystemWatcher események lehetővé teszik a figyelt mappában lévő összes változás figyelését. Ez rögzíti a templog.txt fájl módosításait. A módosításokat tartalmazó templog.txt fájl erőforrásversenyének elkerülése érdekében az írási eljárást a lock(obj) csonk blokkolja.

Ennek eredményeként a naplófájl létrehozása, módosítása, átnevezése és törlése után valami ilyesmit fog tartalmazni:

2015. 07. 30. 12:15:40 a D:\Temp\New Text Document.txt fájl létrehozása 2015. 07. 30. 12:15:46 a D:\Temp\New Text Document.txt fájl átnevezve erre: D:\Temp\hello. txt 07/30/2015 12:15:55 fájl D:\Temp\hello.txt módosult 07/30/2015 12:15:55 fájl D:\Temp\ hello.txt módosult 07/30/2015 12:16:01 PM fájl D: \Temp\hello.txt eltávolítva

Magában a Service1 szolgáltatási osztályban számos lehetőség van beállítva a konstruktorban:

This.CanStop = igaz; // a szolgáltatás ezzel leállítható.CanPauseAndContinue = true; // a szolgáltatás szüneteltethető, majd ezt követően újraindítható.AutoLog = true; // a szolgáltatás írhat a naplóba

Az OnStart() metódusban egy új szál kerül meghívásra a Logger objektum elindításához:

Védett felülírás void OnStart(string args) ( logger = new Logger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); )

Az új szálra azért van szükség, mert az aktuális szál csak az SCM parancsokat dolgozza fel, és a lehető leggyorsabban vissza kell térnie az OnStart metódusból.

Amikor az SCM-től parancs érkezik a szolgáltatás leállítására, az OnStop metódus aktiválódik, amely meghívja a logger.Stop() metódust. Az extra késleltetés lehetővé teszi a naplózó szál leállását:

Védett felülírás void OnStop() ( logger.Stop(); Thread.Sleep(1000); )

Maga a szolgáltatási osztály azonban nem elég. Létre kell hoznunk egy szerviztelepítőt is.

A szoftver kompatibilitás szempontjából. Ezért teljesen természetes, hogy visszatérünk a szolgáltatások megvitatásához a Windows 7 kontextusában. Ezúttal azonban a Windows 7-ben elérhető szolgáltatások optimalizálásának előnyeiről fogunk beszélni. Ez a cikk a Windows 7 új szolgáltatására összpontosít. − Indítsa el a szolgáltatásokat. Mielőtt azonban rátérnénk az API-ra, vessünk egy pillantást a szolgáltatások átfogó képére.

Mik azok a szolgáltatások?

A szolgáltatás a Windows operációs rendszerbe beépített belső mechanizmus. A szolgáltatásokat olyan speciális alkalmazásoknak tekintheti, amelyek az aktuális felhasználói környezettől függetlenül működnek. A szolgáltatások abban különböznek a normál alkalmazásoktól, hogy beállíthatók úgy, hogy a rendszer bekapcsolásától (betöltésétől) a felhasználó jelenléte nélküli leállításig futjanak. Vagyis a szolgáltatások akkor is futhatnak, ha a felhasználó nincs bejelentkezve.

Inkább úgy tekintünk a szolgáltatásokra, mint futó feladatokra, amelyek a háttérben futnak, és nem befolyásolják a felhasználói műveleteket. A Windows szolgáltatásai mindenféle háttértevékenységért felelősek, a Remote Procedure Call (RPC) és a Printer Spooler (Nyomtatósor-kezelő), egészen a hálózati helymeghatározásig.

Az évek során a Windows nőtt és a szolgáltatások száma is. Legyünk őszinték, a Windows háttérszolgáltatásai nagyon fájdalmasak – az operációs rendszer számos szolgáltatást tartalmaz. Emellett a független szoftvergyártók (ISV-k) és alkalmazásaik még több szolgáltatást adnak hozzá. Például szoftverfrissítési szolgáltatások. Egyes szolgáltatások azonban kritikusak és szükségesek a rendszerindítási folyamat során, míg másokra később, amikor egy bizonyos felhasználó bejelentkezik, másokat pedig egyáltalán nem kell elindítani, amíg meg nem hívják őket. Ennek ellenére, amikor megtekinti a jelenleg futó szolgáltatások listáját, sok olyan objektumot lát, amelyeknek nem kell éjjel-nappal működniük.

Mi a baj a 24 órás szolgáltatásokkal?

Számos probléma van a hét minden napján, 24 órában futó szolgáltatásokkal. Először is, miért futna valami (még a háttérben is), ha nincs rá szükség? Minden futó folyamat (beleértve a szolgáltatásokat is) értékes memóriát és CPU-erőforrásokat használ, amelyek más alkalmazásokhoz és szolgáltatásokhoz használhatók. Ha összeszámolja az adott pillanatban futó összes szolgáltatást, akkor jelentős mennyiségű memóriát, leírót, szálat és CPU-használatot adnak össze. Mindezek az „elpazarolt” erőforrások csökkentik a számítógép általános teljesítményét, reagálóképességét, és azt a benyomást keltik, hogy a számítógép lomha és lassú. Ezen túlmenően, mivel sok szolgáltatás úgy van beállítva, hogy automatikusan induljanak el (a rendszer indításakor kezdenek működni), befolyásolják a számítógép rendszerindítási idejét.

Másodszor, ezek az elpazarolt erőforrások közvetlen hatással vannak a villamosenergia-fogyasztásra. Minél nagyobb a CPU terhelése, annál több energiát fogyaszt a számítógép. Ez kritikus lehet a laptopok számára, és több órával csökkentheti az akkumulátor élettartamát.

Harmadszor, az improduktív szoftverek állandó működése memóriaszivárgáshoz és általános rendszerinstabilitáshoz vezethet. Ez az alkalmazások és végül a számítógép meghibásodásához vezet.

Végül, ha a szolgáltatás éjjel-nappal fut, és egy jól ismert szolgáltatásról van szó (amely minden népszerű alkalmazással rendelkezhet, például egy PDF-olvasó), akkor ez nagy támadási felületet hoz létre. A támadó felhasználhatja azt a tudatot, hogy egy bizonyos népszerű alkalmazás 24x7 szolgáltatást telepít, és megpróbálhatja feltörni, hogy hozzáférjen a számítógéphez.

Mindent összevetve felmerülhet a kérdés, hogy miért állítja be olyan sok fejlesztő a szolgáltatásait folyamatosan futásra, ha van más lehetőségük. Már a Windows 7 előtt is több lehetőség állt rendelkezésre a szolgáltatások elindításához:

  • Tiltva teljesen letiltja a szolgáltatást és megakadályozza annak és a függő szolgáltatások elindítását - ez azt jelenti, hogy a felhasználónak manuálisan kell engedélyeznie a szolgáltatást a vezérlőpultról vagy parancssorból
  • Kézikönyv igény esetén elindítja a szolgáltatást (más szolgáltatások függősége miatt), vagy amikor a szolgáltatást az alkalmazásból hívják a megfelelő API-k használatával, az alábbiak szerint
  • Automatikus bejelentkezéskor elindítja a szolgáltatást
  • Automatikus késleltetés a Windows Vista rendszerben bevezetett újabb indítási típus, amely a rendszerindítás és a kezdeti műveletek befejezése után indítja el a szolgáltatást, ami felgyorsítja a rendszerindítást.

Sajnos sok ISV (köztük maga a Microsoft is) továbbra is Automated vagy Automatic Delayed beállításra állítja szolgáltatásait, mert mindenki számára ez tűnik a legegyszerűbb megoldásnak. A szolgáltatás egyszerűen a hét minden napján, 24 órában fut, és mindig elérhető, így nincs szükség a függőségek ellenőrzésére vagy a szolgáltatás futásának ellenőrzésére.

Számos példa van a meglévő szolgáltatásokra, amelyek sokkal kevesebb erőforrást használnak fel, és nagyobb biztonságot nyújtanak anélkül, hogy éjjel-nappal futnának. Gondoljunk például egy frissítési szolgáltatásra, amely új frissítéseket keres egy alkalmazáshoz. Ha a számítógép nincs csatlakoztatva a hálózathoz, és nincs IP-címe, miért működne? Semmit nem tud csinálni, akkor miért hagyjunk el egy futó programot, ami nem csinál semmit? Gondoljunk csak a Házirend-kezelési szolgáltatásra, amelyet a csoportházirendek módosításakor használnak, vagy amikor egy számítógép csatlakozik egy tartományhoz, vagy elhagyja azt, de most, hogy a számítógép csatlakozik az otthoni hálózatomhoz, a szolgáltatás ismét kárba veszett.

Kiváltott szolgáltatás megjelenése

A fenti problémák megoldása az, hogy a szolgáltatást az "állandó állapotból" kihozzuk másfajta háttértevékenységbe, például ütemezett feladatokba vagy kiváltott szolgáltatásokba. Ez a cikk a Windows 7 Trigger Start Services szolgáltatásról szól. A Windows 7 ütemezett feladatokról sok érdekesség elmondható, amelyekről a következő cikkekben lesz szó.

Lehetséges-e szolgáltatásként kliens alkalmazást futtatni? Nem minden konzolalkalmazás tud majd szolgáltatásként futni, a grafikus felülettel rendelkező programok pedig elvileg nem működhetnek így. De továbbra is van lehetőség az alkalmazás szolgáltatásként való futtatására, ebben lesz segítségünkre az eredeti nevű program. Nem szívás szolgáltatásvezető.

Az NSSM egy ingyenes és nyílt forráskódú szoftver, amely minden operációs rendszert támogat Microsoft, kezdve a Windows 2000-zel és a következővel végződve: . Az NSSM nem igényel telepítést, csak töltse le és csomagolja ki. A terjesztési készlet 32 ​​bites és 64 bites operációs rendszerhez készült verziókat tartalmaz. A programot az nssm.cc oldalról lehet beszerezni, jelenleg a legfrissebb stabil verzió a 2.21.1, amit használni fogok.

Az NSSM képességeinek bemutatásához próbáljuk meg futtatni a Jegyzettömb szolgáltatást a webhelyen.

Hozzon létre egy szolgáltatást

nevű szolgáltatás létrehozásához jegyzettömb elindítjuk a parancskonzolt, a kicsomagolt NSSM-et tartalmazó mappába lépünk (64 bites Windowshoz), és beírjuk az nssm install notepad parancsot, amely megnyitja az NSSM grafikus telepítő ablakát. Szolgáltatás létrehozásához elég megadni a futtatható fájl elérési útját az Elérési út mezőben, és rákattintani a "Szolgáltatás telepítése" gombra. Ezenkívül a Beállítások mezőben megadhatja a szolgáltatás indításához szükséges kulcsokat.

Ezenkívül az új szolgáltatás létrehozásának szakaszában megadhat néhány további paramétert.

A „Leállítás” lap felsorolja azokat a leállítási módszereket és időtúllépéseket, amelyek akkor használatosak, amikor az alkalmazás normálisan leáll vagy összeomlik. Amikor az NSSM leállítási parancsot kap (pl. amikor egy alkalmazás leáll), a normál módon megkísérli leállítani a vezérelt alkalmazást. Ha az alkalmazás nem válaszol, akkor az NSSM erőszakkal leállíthatja az alkalmazás összes folyamatát és alfolyamatait.

Összesen négy alkalmazásleállítási lépés van, amelyek alapértelmezés szerint a következő sorrendben kerülnek felhasználásra:

Az első lépésben az NSSM megpróbál eseményt generálni és elküldeni ctrl+c. Ez a módszer jól működik konzolalkalmazásokhoz vagy szkriptekhez, de nem grafikus alkalmazásokhoz;
Az NSSM ezután észleli az alkalmazás által létrehozott összes ablakot, és WM_CLOSE üzenetet küld nekik, hogy kikényszerítse az alkalmazást;
A harmadik lépésben az NSSM kiértékeli az alkalmazás által létrehozott összes szálat, és küld nekik egy WM_QUIT üzenetet, amelyet akkor kap, ha az alkalmazásnak van szál üzenetsora;
Végső megoldásként pedig az NSSM meghívhatja a TerminateProcess() metódust, ezzel erőszakosan leállítva az alkalmazást.

Lehetőség van néhány vagy akár az összes metódus letiltására is, azonban különböző módszerek működnek a különböző alkalmazásoknál, és ajánlatos mindent a régiben hagyni, hogy az alkalmazás megfelelően leálljon.

Alapértelmezés szerint, amikor egy szolgáltatás összeomlik, az NSSM megpróbálja újraindítani. A "Kilépési műveletek" lapon módosíthatja az automatikus műveletet az alkalmazás rendellenes leállása esetén, valamint beállíthat egy késleltetést, mielőtt az alkalmazás automatikusan újraindul.

Az "Input / Output (I / O)" fülön beállíthatja az alkalmazás bemeneti / kimeneti átirányítását a megadott fájlra.

A "Környezet" lapon új környezeti változókat állíthat be a szolgáltatáshoz, vagy felülírhatja a meglévőket.

Nem is használhatja a grafikus héjat, és azonnal létrehozhat egy szolgáltatást a konzolban a következő paranccsal:

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

Szolgáltatás kezelés

Miután létrehozta a szolgáltatást az NSSM használatával, nyissa meg a Szolgáltatások beépülő modult, és keresse meg a jegyzettömb szolgáltatást. Mint látható, megjelenésében semmiben sem különbözik a többi szolgáltatástól, mi is elindíthatjuk, leállíthatjuk vagy megváltoztathatjuk az indítási módot. Ne feledje azonban, hogy az nssm.exe futtatható fájlként szerepel.

Ha pedig a Feladatkezelőbe lép, a következő képet fogjuk látni: Az NSSM fő (szülő) folyamatként, a jegyzettömb szolgáltatás utódfolyamatként fut, és a Jegyzettömb alkalmazás már ebben a gyermekfolyamatban fut.

Szolgáltatás eltávolítása

A szolgáltatás eltávolításához írja be az nssm Remove notepad parancsot, és erősítse meg az eltávolítást. És ha beírja az nssm remove notepad megerősítés parancsot, megerősítés nélkül is megteheti.

Szolgáltatás interaktív indítása

A fő különbség a felhasználói alkalmazások és a szolgáltatások között az, hogy az indítást követően az alkalmazás további műveleteket igényelhet a felhasználó részéről, például egy gombra kattintásra vagy egy parancs beírására, hogy tovább futhasson. Ehhez hozzá kell jutni, ami, mint kiderült, nem is olyan egyszerű.

A szolgáltatás interaktív módban történő elindításához meg kell nyitnia annak tulajdonságait a Szolgáltatások beépülő modulban, és a "Bejelentkezés" lapon be kell jelölnie az "Interakció engedélyezése az asztallal" jelölőnégyzetet.

És akkor kezdődnek a csodák. Egy interaktív módban futó szolgáltatásnál a rendszer külön izolált munkamenetet nyit (0. munkamenet). Ehhez a munkamenethez csak az Interactive Services Detection Service (ui0detect) férhet hozzá, amely figyeli az interaktív szolgáltatások indulását a számítógépen, és riasztást generál. A Windows 7\Server 2008-ban ez a szolgáltatás alapértelmezés szerint engedélyezve van, de a Windows 8\Server 2012-ben le van tiltva, és nem jelenik meg a Szolgáltatások grafikus beépülő moduljában (legalábbis én nem találtam). Sőt, ha megtalálja ezt a rejtélyes szolgáltatást, és megpróbálja elindítani, hibaüzenetet fog kapni.

De tény, hogy futtatásához engedélyeznie kell az interaktív szolgáltatások elindítását a számítógépen. Ezért megnyitjuk a rendszerleíróadatbázis-szerkesztőt, és a HKLM\System\CurrentControlSet\Control\Windows részben keresünk egy duplaszó-paramétert a névvel Nincsenek interaktív szolgáltatásokés állítsa be az értékét 0 .

Ezután megnyitjuk a PowerShell konzolt, és elindítjuk a felderítési szolgáltatást a következő paranccsal:

Start-Service -Name ui0detect

Miután megbizonyosodtunk arról, hogy a felderítési szolgáltatás fut, újraindítjuk a jegyzettömb szolgáltatást, és ezt az ablakot kapjuk. Válassza az "Üzenet megtekintése" lehetőséget

és belépünk a nulla munkamenetbe, amelyben az alkalmazásunk fut. Ezután elvégezzük vele a szükséges műveleteket, és visszatérünk.

Egy ilyen érdekes megoldás az alkalmazások futtatására, mint a Windows szolgáltatások. Nem a legszebb, de a nevéhez méltó.

Tetszett a cikk? Oszd meg a barátaiddal!
Hasznos volt ez a cikk?
Igen
Nem
Köszönjük a visszajelzést!
Hiba történt, és a szavazatát nem számoltuk be.
Köszönöm. Az üzenet el lett küldve
Találtál hibát a szövegben?
Válassza ki, kattintson Ctrl+Enterés megjavítjuk!