Programování služeb ve Windows - 1.díl
Služby systému Windows jsou programy, které se mohou spouštět automaticky při startu bez nutnosti přihlášení uživatele. Implementace služeb Windows se realizuje pomocí tříd, které jsou definovány ve jmenném prostoru System.ServiceProcess. Realizace programů služeb je pomocí třídy ServiceControler.
Služby systému Windows
- Šablonu Služeb nepůjde vytvořit ve Visual Studiu – Express.
- Služby, vytvořené pro Windows XP, nebudou pravděpodobně pracovat pod Windows 7 a 8.
- Služby musíme registrovat (instalovat) pod účtem administrator (tedy spustit Visual Studio jako správce).
- Než začneme, musíme si ujasnit jaký název bude naše třída mít -> v ukázce použijeme MojeService1.
- Název služby musí být jedinečný, dvě služby nemohou mít stejný název.
Architektura služeb systému Windows
Pro správné sestavení programu služeb je nezbytné vytvořit tyto programy:
- Program služby - Poskytuje službě danou funkčnost, kterou potřebujeme.
- Program řízení služby - Pomocí ně zasíláme službě požadavky (spustit, zastavit, pokračovat a podobně).
- Program konfigurace služby - Umožňuje instalaci služby a zápis do registru. Každou službu musíme nainstalovat a musí mít zápis a konfiguraci v registru PC.
Správce řízení služeb
Veškerou komunikaci se službou zajišťuje správce řízení služeb, který je součástí jádra operačního systému Windows.
Při startu Windows se u služby, pro každý proces, který má nastaveno automatické spuštění, zavolá hlavní funkce daného procesu. Služba zodpovídá za registraci všech svých služeb. Hlavní funkce služby jsou vstupním bodem a správce řízení služeb zaregistruje tyto vstupní body dané služby.
Hlavní a obslužné funkce
Program služby může poskytovat mnoho služeb v jednom programu. Hlavní funkce musí registrovat všechny nabízené služby. Jako příklad bych uvedl službu <windows>\system32\services.exe, obsahuje služby správa aplikací, výstrahy, prohledávání počítačů, DHCP a další.
Hlavní funkce služby obsahuje skutečnou funkčnost služby a zodpovídá za registraci služeb. Správce řízení služeb volá hlavní funkce všech spouštěných služeb, které obsahuje hlavní služba. Obslužné funkce zodpovídají za události, které zasílá správce řízení služeb a může též odesílat události. Program řízení služby je nezávislý na správci řízení služeb i na službě samostatné.
Jmenný prostor System.ServiceProcess
Služba je implementována pomocí odvození od třídy ServiceBase. Zabezpečuje registraci a funkci Spustit a Zastavit.
Můžeme také implementovat od třídy ServiceController. Ta slouží na zasílání požadavků službě.
Třídy ServiceProcessInstaller a ServiceInstaller slouží k instalaci a konfiguraci služby.
Začínáme - Kostra aplikace naší služby (VS 2010, .NET Framework 4)
Naše vytvořená aplikace bude představovat šablonu.
Spustíme Visual Studio –> Nový projekt –> C# -> Windows –> Služba systému Windows.
Panel nástrojů -> přidat -> Instalační třída.
Panel nástrojů -> pravé tlačítko myši -> "Vybrat položky" a vybereme ServiceController, ServiceProcessInstaller a ServiceInstaller.
Tyto položky budeme potřebovat pro vytvoření šablony služeb a musíme je zaškrtnout.
Naši službu přejmenujeme na MojeService1 a vytvořenou instalační komponentu na Installer1. Namespace bude libovolný.
Přejdeme na spouštěcí generovanou třídu "Program". Kód ve třídě program ponecháme, pokud naše hlavní služba bude spouštět jen jednu službu (MojeService1). Pokud naše služba bude spouštět více podřízených služeb, upravíme spouštěcí 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); } } }
Pro více služeb bude platit vrchní řádek.
Začneme úpravou AssemblyInfo.cs
Doplníme:
using System.Security; [assembly: AssemblyKeyNameAttribute("")] //1 [assembly: SecurityRules(SecurityRuleSet.Level2)] //2 (MSDN)
- Určuje název kontejneru klíče v rámci zprostředkovatele kryptografických služeb. Obsahuje dvojici klíčů, které jsou použity ke generování silného názvu.
- Literatura z MSDN. Zhruba se jedná o rozdíl v režimech zabezpečení do .NET verze 4 a od verze 4 a výše. Čtení je dosti komplikované a těžce pochopitelné. Pro verzi .NET menší jak 4 musíme použít:
[assembly: SecurityRules(SecurityRuleSet.Level1)] //2 (MSDN)
Pokračujeme
Přihlásíme se jako administrátor a provedeme tuto úpravu - otevřeme
složku:
C:\Windows\System32\drivers\etc\ a otevřeme soubor hosts.
Pozor, nesmí mít příponu (u většiny Windows má příponu hosts.sam) a
provedeme tuto úpravu:
# localhost name resolution is handled within DNS itself. 127.0.0.1 localhost ::1 localhost (Pro IPv6)
Pokud budeme instalovat službu na server, dopíšeme podle skuteč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
Otevřeme si v této složce soubor services a podíváme se který port je volný pro naše použití. Zavřeme složku Windows.
Vygenerujeme silný název pro podepsání sestavy Service
Vytvoříme novou složku c:\Podpis. Do této složky
zkopírujeme soubor sn.exe a
sn.exe.config.
Klíč, který vygenerujeme, bude sloužit pouze pro ukázky a naše pokusy, po
vyhotovení aplikace tento klíč nahradíme ostrým naším klíčem. Nový
klíč RSACryptoServiceProvider zadané velikosti se zapíše
do zadaného souboru. V souboru je zapsán veřejný i soukromý klíč.
V příkazovém řádku přejdeme do složky Podpis a zadáme příkaz sn -k PokusnyKlic.snk . Přejdeme do naší sestavy do vlastností na záložku podepsání, označíme Podepsat sestavení a do ComboBoxu vybereme náš vygenerovaný klíč. Provedeme kompilaci naší sestavy. Pokud jsme pracovali OK, pak při otevření IL DASM při načtení našeho WindowsService1.exe v Manifestu vidíme náš klíč.
.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čování v příštím díle.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 154x (139.77 kB)
Aplikace je včetně zdrojových kódů v jazyce C#