Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.Service­Process. Realizácia programov služieb je pomocou triedy ServiceControler.

Služby systému Windows

  1. Šablónu Služieb nepôjde vytvoriť vo Visual Studiu - Express.
  2. Služby, vytvorené pre Windows XP, nebudú pravdepodobne pracovať pod Windows 7 a 8.
  3. Služby musíme registrovať (inštalovať) pod účtom administrator (teda spustiť Visual Studio ako správca).
  4. Než začneme, musíme si ujasniť aký názov bude naša trieda mať -> v ukážke použijeme MojeService1.
  5. 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:

  1. Program služby - Poskytuje službe danú funkčnosť, ktorú potrebujeme.
  2. Program riadenie služby - Pomocou ne zasielame službe požiadavky (spustiť, zastaviť, pokračovať a podobne).
  3. 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.

UML diagram - C # - Pre pokročilých

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

Služba je implementovaná pomocou odvodenie od triedy ServiceBase. Zabezpečuje registráciu a funkciu Spustiť a Zastaviť.

Môžeme tiež implementovať od triedy ServiceContro­ller. Tá slúži na zasielanie požiadaviek službe.

Triedy ServiceProces­sInstaller 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 ServiceContro­ller, ServiceProces­sInstaller a ServiceInstaller.

Tieto položky budeme potrebovať pre vytvorenie šablóny služieb a musíme ich zaškrtnúť.

Pridanej položky do projektu Windows služby - C # - Pre pokročilých

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)
  1. 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.
  2. 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ľúč RSACryptoServi­ceProvider 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#

 

Všetky články v sekcii
C # - Pre pokročilých
Článok pre vás napísal zpavlu
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
C# , C++ a assembler
Aktivity