Programovanie služieb vo Windows - 1.diel
Služby systému Windows sú programy, ktoré sa môžu spúšťať automaticky pri štarte bez nutnosti prihlásenia používateľa. Implementácia služieb Windows sa realizuje pomocou tried, ktoré sú definované v mennom priestore System.ServiceProcess. Realizácia programov služieb je pomocou triedy ServiceControler.
Služby systému Windows
- Šablónu Služieb nepôjde vytvoriť vo Visual Studiu - Express.
- Služby, vytvorené pre Windows XP, nebudú pravdepodobne pracovať pod Windows 7 a 8.
- Služby musíme registrovať (inštalovať) pod účtom administrator (teda spustiť Visual Studio ako správca).
- Než začneme, musíme si ujasniť aký názov bude naša trieda mať -> v ukážke použijeme MojeService1.
- Názov služby musia byť jedinečný, dve služby nemôžu mať rovnaký názov.
Architektúra služieb systému Windows
Pre správne zostavenie programu služieb je nevyhnutné vytvoriť tieto programy:
- Program služby - Poskytuje službe danú funkčnosť, ktorú potrebujeme.
- Program riadenie služby - Pomocou ne zasielame službe požiadavky (spustiť, zastaviť, pokračovať a podobne).
- Program konfigurácia služby - Umožňuje inštaláciu služby a zápis do registra. Každú službu musíme nainštalovať a musia mať zápis a konfiguráciu v registri PC.
Správcu riadenia služieb
Všetku komunikáciu so službou zabezpečuje správca riadenia služieb, ktorý je súčasťou jadra operačného systému Windows.
Pri štarte Windows sa u služby, pre každý proces, ktorý má nastavené automatické spustenie, zavolá hlavné funkcie daného procesu. Služba zodpovedá za registráciu všetkých svojich služieb. Hlavné funkcie služby sú vstupným bodom a správca riadenia služieb zaregistruje tieto vstupné body danej služby.
Hlavné a obslužné funkcie
Program služby môže poskytovať mnoho služieb v jednom programe. Hlavné funkcie musia registrovať všetky ponúkané služby. Ako príklad by som uviedol službu <windows> \ system32 \ Services.exe, obsahuje služby správa aplikácií, výstrahy, prehľadávanie počítačov, DHCP a ďalšie.
Hlavné funkcie služby obsahuje skutočnú funkčnosť služby a zodpovedá za registráciu služieb. Správca riadenia služieb volá hlavné funkcie všetkých spúšťaných služieb, ktoré obsahuje hlavné služba. Obslužné funkcie zodpovedajú za udalosti, ktoré zasiela správca riadenia služieb a môže tiež odosielať udalosti. Program riadenia služby je nezávislý na správcovi riadenia služieb aj na službe samostatné.
Menný priestor System.ServiceProcess
Služba je implementovaná pomocou odvodenie od triedy ServiceBase. Zabezpečuje registráciu a funkciu Spustiť a Zastaviť.
Môžeme tiež implementovať od triedy ServiceController. Tá slúži na zasielanie požiadaviek službe.
Triedy ServiceProcessInstaller a ServiceInstaller slúžia na inštaláciu a konfiguráciu služby.
Začíname - Kostra aplikácie našej služby (VS 2010, .NET Framework 4)
Naša vytvorená aplikácia bude predstavovať šablónu.
Spustíme Visual Studio -> Nový projekt -> C# -> Windows -> Služba systému Windows.
Panel nástrojov -> pridať -> Inštalačné trieda.
Panel nástrojov -> pravé tlačidlo myši -> "Vybrať položky" a vyberieme ServiceController, ServiceProcessInstaller a ServiceInstaller.
Tieto položky budeme potrebovať pre vytvorenie šablóny služieb a musíme ich zaškrtnúť.
Našu službu premenujeme na MojeService1 a vytvorenú inštalačný komponent na Installer1. Namespace bude ľubovoľný.
Prejdeme na spúšťací generovanú triedu "Program". Kód v triede program ponecháme, ak naše hlavné služba bude spúšťať len jednu službu (MojeService1). Ak naša služba bude spúšťať viacerých podriadených služieb, upravíme spúšťací kód:
using System.ServiceProcess; namespace WindowsService1 { // More than one user Service may run within the same process. To add // another service to this process, change the following line to // create a second service object. For example, // static class Program { // "Hlavní vstupní bod aplikace" . static void Main() { ServiceBase[] ServicesToRun; //ServicesToRun = new ServiceBase[] {new MojeService1() /*, new MojeService2()*\ }; ServicesToRun = new ServiceBase[] {new MojeService1() }; //1 ServiceBase.Run(ServicesToRun); } } }
Pre viac služieb bude platiť vrchný riadok.
Začneme úpravou AssemblyInfo.cs
doplníme:
using System.Security; [assembly: AssemblyKeyNameAttribute("")] //1 [assembly: SecurityRules(SecurityRuleSet.Level2)] //2 (MSDN)
- Určuje názov kontajnera kľúča v rámci sprostredkovateľa kryptografických služieb. Obsahuje dvojicu kľúčov, ktoré sú použité na generovanie silného názvu.
- Literatúra z MSDN. Zhruba sa jedná o rozdiel v režimoch zabezpečenia do .NET verzie 4 a od verzie 4 a vyššie. Čítanie je dosť komplikované a ťažko pochopiteľné. Pre verziu .NET menšie ako 4 musíme použiť:
[assembly: SecurityRules(SecurityRuleSet.Level1)] //2 (MSDN)
Pokračujeme
Prihlásime sa ako administrátor a prevedieme túto úpravu - otvoríme
zložku:
C: \ Windows \ System32 \ drivers \ etc \ a otvoríme súbor
hosts. Pozor, nesmie mať príponu (u väčšiny Windows má
príponu Hosts.sam) a prevedieme túto úpravu:
# localhost name resolution is handled within DNS itself. 127.0.0.1 localhost ::1 localhost (Pro IPv6)
Ak budeme inštalovať službu na server, dopíšeme podľa skutočného názvu a IP
102.54.94.97 rhino.acme.com # source server 38.25.63.10 x.acme.com # x client host
Otvoríme si v tejto zložke súbor services a pozrieme sa ktorý port je voľný pre naše použitie. Zavrieme zložku Windows.
Vygenerujeme silný názov pre podpísanie zostavy Service
Vytvoríme novú zložku c: \ Podpis. Do tejto zložky
skopírujeme súbor sn.exe a
sn.exe.config.
Kľúč, ktorý vygenerujeme, bude slúžiť len pre ukážky a naše pokusy, po
vyhotovení aplikácie tento kľúč nahradíme ostrým naším kľúčom. Nový
kľúč RSACryptoServiceProvider zadanej veľkosti sa
zapíše do zadaného súboru. V súbore je zapísaný verejný aj súkromný
kľúč.
V príkazovom riadku prejdeme do zložky Podpis a zadáme príkaz sn -k PokusnyKlic.snk. Prejdeme do našej zostavy do vlastností na záložku podpísanie, označíme Podpísať zostavenie a do ComboBox vyberieme náš vygenerovaný kľúč. Vykonáme kompiláciu našej zostavy. Ak sme pracovali OK, potom pri otvorení IL DASM pri načítaní nášho WindowsService1.exe v Manifestu vidíme náš kľúč.
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .publickey = (00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00 00 24 00 00 52 53 41 31 00 04 00 00 01 00 01 00 97 57 47 68 E9 B7 E8 2D 2F 38 B9 9F 87 45 09 3A 58 D7 42 23 06 20 64 C3 6E DF 53 FA 6F 08 79 9A 7C 65 44 C3 DB C7 D0 74 0B 65 75 71 B5 2C 3F BA 5D 59 3B 51 BD A1 BB 5C 11 64 2A 77 CC 5B CE 9C B6 7F AE 5D 87 E9 9E 0D DB 6F D6 4A B3 69 28 D8 3F 41 06 B1 DB 19 55 11 A8 C3 4D 61 C8 04 BF 51 29 05 14 1F 30 49 47 B5 30 FC 23 02 65 AD AF C5 2D F3 E6 7C E1 7E 37 E4 64 81 C7 91 37 EE 1A B0 ) .hash algorithm 0x00008004
Pokračovanie v budúcom diele.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 152x (139.77 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#