NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

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 - Programování služeb ve 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>\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 - Programování služeb ve Windows

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ž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#

 

Všechny články v sekci
Programování služeb ve Windows
Článek pro vás napsal zpavlu
Avatar
Uživatelské hodnocení:
4 hlasů
C# , C++ a assembler
Aktivity