Programování služeb ve Windows - 1.díl

C# .NET Pro pokročilé 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.Service­Process. Realizace programů služeb je pomocí třídy ServiceControler.

Služby systému Windows

  1. Šablonu Služeb nepůjde vytvořit ve Visual Studiu – Express.
  2. Služby, vytvořené pro Windows XP, nebudou pravděpodobně pracovat pod Windows 7 a 8.
  3. Služby musíme registrovat (instalovat) pod účtem administrator (tedy spustit Visual Studio jako správce).
  4. Než začneme, musíme si ujasnit jaký název bude naše třída mít -> v ukázce použijeme MojeService1.
  5. 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:

  1. Program služby - Poskytuje službě danou funkčnost, kterou potřebujeme.
  2. Program řízení služby - Pomocí ně zasíláme službě požadavky (spustit, zastavit, pokračovat a podobně).
  3. 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.

UML diagram

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>\sys­tem32\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.Service­Process

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 ServiceContro­ller. Ta slouží na zasílání požadavků službě.

Třídy ServiceProces­sInstaller 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 ServiceContro­ller, ServiceProces­sInstaller a ServiceInstaller.

Tyto položky budeme potřebovat pro vytvoření šablony služeb a musíme je zaškrtnout.

Přidané položky do projektu Windows služby

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)
  1. 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.
  2. 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\Sys­tem32\drivers\et­c\ 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íč RSACryptoServi­ceProvider 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ženo 91x (139.77 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal zpavlu
Avatar
C# a C++

Jak se ti líbí článek?
Celkem (2 hlasů) :
4.54.54.54.54.5


 



 

 

Komentáře

Avatar
Michal Haňáček:

Moc hezká série článků, oba palce nahoru a díky za ně :). Jen bych rád doplnil (pro ty kdo VS express používají a chtěli by si zkusit napsat vlastní win. službu), že byť ve VS express nejde vytvářet ŠABLONY (jak zpavlu správně napsal), neznamená to že nejde vytvářet služby Windows. Jen si je člověk musí celé ručně napsat.

Odpovědět 3.12.2014 12:15
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
zpavlu
Redaktor
Avatar
zpavlu:

Podrobněji na mém webu www.zpavlu.cz

Odpovědět 21.2.2015 14:58
PZ
Avatar
lubogolis
Člen
Avatar
lubogolis:

Dobry den,

kde najdem subory sn.exe a sn.exe.config

 
Odpovědět 24. března 14:46
Avatar
lubogolis
Člen
Avatar
 
Odpovědět 24. března 14:59
Avatar
lubogolis
Člen
Avatar
 
Odpovědět 24. března 15:05
Avatar
lubogolis
Člen
Avatar
 
Odpovědět 24. března 15:14
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.