IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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 - 2.diel

Pokračujeme 2. dielom o programovaní služieb Windows v C# .NET. Podpíšeme projekt vytvoreným kľúčom (PokusnyKlic.snk):

Podpísanie aplikácie vytvoreným kľúčom. - C # - Pre pokročilých

Upravíme záložku ladenia (pre tento prípad stačí označiť "Povoliť ladenie nespravovaného kódu", tu záleží na službe, ktorú vytvárame.) Pokiaľ označíme všetky záložky, na našu ďalšiu činnosť to nemá vplyv!

Uprava nutná pre ladenie service - C # - Pre pokročilých

Nastavíme adaptér sieťového pripojenia (IPv6 možnosť budúceho použitia):

Sieťové pripojenie - C # - Pre pokročilých

Nástroj SC (Sc.exe)

Každá služba musí byť zapísaná v databáze služieb a je uložená v registri.

  1. HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ meno našej služby
  2. HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ EventLog \ Application \ meno našej služby

Prvý zápis je o údajoch služby, druhý ukazuje na adresu dynamického helpu. Vo veľkej väčšine u služieb dodávaných mimo Windows ukazuje na .NET Framework. Registrácia u Windows 7/8 je nutná, bez nej nebude služba funkčná. Registráciu služby a zápis do registra a DB služieb zabezpečuje nástroj Sc.exe.

Na spustenie služby vo vzdialenom počítači možno síce použiť nástroj Netsvc.exe alebo Instsrv.exe, avšak tieto nástroje neumožňujú vzdialene vytvoriť novú službu. Nástroje tu uvedené sú súčasťou sady Resource Kit.

Poznámka:
Nástroj Srvinstw.exe je verzia nástroja pre vytváranie vzdialených služieb, ktorá má grafické užívateľské rozhranie (GUI). Srvinstw.exe nie je nástroj príkazového riadku. Popisy týchto nástrojov sú v pripojených nášho projektu a v MSDN. Popis Sc.exe. Popis Sc config

Nástroj Installutil

Pomocou tohto nástroja získame možnosť inštalovať a odinštalovať službu. Tento nástroj nájdeme v zložke: C: \ Windows \ Microsoft.Net \ Framework. Musíme dať pozor na verziu .NET, ktorú vykonávame kompiláciu (cieľové rozhranie .NET). Musíte byť prihlásení ako administrátor Windows.

Postup, ktorý sa mi osvedčil, je nasledujúci. Skopírujú súbory:

  • Installutil.exe
  • Installutil.e­xe.config
  • installutilLib.dll
  • cmd.exe (nemôže byť zástupca)

do novo vytvorenej zložky Instal umiestnené v .. \\ Mojeservice \ bin \ Instal \ a vytvorím dva súbory Install.bat a Uninstall.bat.

Súbory v priečinku Instal:

  • cmd.exe
  • InstallUtil.exe
  • Installutil.e­xe.config
  • installutilLib.dll
  • install.bat
  • Uninstall.bat

Install.bat (obsahuje toto nastavenie)

installutil.exe ..\Debug\TestService1.exe
sc create Moje_Service_1 binPath=..\Debug\TestService1.exe type=own start=demand error=normal

Uninstall.bat (obsahuje toto nastavenie)

sc delete Moje_Service_1 binPath=..\Debug\TestService1.exe
installutil  /u ..\Debug\TestService1.exe

Ak spustíme príkaz Install.bat, vytvorí sa v našej zložke súbor MojeService.In­stallLog, kde sa bude zaznamenávať priebeh inštalácie služby. To isté prevedieme s príkazom Uninstall.bat. Okno (cmd.exe) musíme spustiť ako správca alebo musíme byť prihlásení ako administrátor. Ak nie, dostaneme chybovú hlášku o nedostatočných právach a službu nezaregistrujete. Pokiaľ užívateľ nebude mať práva "administrátor" a nebude skutočným administrátorom, službu nespustí. Na príklad používateľ "Pepa" má práva "užívateľ" + "administrátor", toto sa nerovná s právami účtu administrátor !!

Hlásenie chyby v InstallUtilIn­stalLog:

Spouštění instalace s podporou transakcí: Zahajování instalační fáze instalace Prohlédněte si obsah souboru protokolu pro průběh sestavení ...\Služby\WindowsService1\WindowsService1\bin\Debug\TestService1.exe.
Umístění souboru:
...\Služby\WindowsService1\WindowsService1\bin\Debug\MojeService.InstallLog.
V průběhu instalační fáze došlo k výjimce. **System.Security.SecurityException** :
Zdroj nebyl nalezen, ale některé nebo všechny protokoly událostí nelze prohledat.
Nepřístupné protokoly: Security.
...další text.

Názov nášho exe súboru môže byť ľubovoľný, odporúčam ak názov zmeníme neskôr ho nemeniť, budeme potom meniť registračné súbory (náš názov je TestService1.exe). Ak zadáme iný názov, upravíme Install.bat a Uninstall.bat.

Ak sa pokúsime našu šablónu spustiť (MojeService1.exe z Visual Studia), je zobrazené toto okno:

chyba spustenia - C # - Pre pokročilých

Od Windows7 je v jadre operačného systému rozšírené zabezpečenie pozri MSDN, potrebujeme práva administrátora.

Spustenie bez práv administrátora - C # - Pre pokročilých

Class Installer1: System.Configu­ration.Install­.Installer

Otvoríme Installer1 v okne kódu. Návrhár tejto triede priradil iba konštruktor. Triedu doplníme o kód.

[RunInstaller(true)]
public partial class Installer1 : System.Configuration.Install.Installer
{
       //Konstanty
       private const string DESKRIPTION = "Stručný komentář popis a účel služby ";
       private const string DISPLAYNAME = "Moje_Service_1";
       private const string SERVICENAME = "MojeService1";

       private ServiceInstallerDialog sid = new ServiceInstallerDialog();   //1
       private ServiceInstaller serviceInstaller = new ServiceInstaller();
       private ServiceProcessInstaller serviceProcessInstaller = new ServiceProcessInstaller();


    public Installer1()
    {
        InstallServiceProcessInstaller();
        InstallServiceInstaller();
        InitializeComponent();
    }

//Informace o službách
    private void InstallServiceInstaller()
    {
           this.serviceInstaller.ServiceName = SERVICENAME;
           this.serviceInstaller.DisplayName = DISPLAYNAME;
           this.serviceInstaller.Description = DESKRIPTION;
           this.serviceInstaller.StartType = ServiceStartMode.Manual;
           this.serviceInstaller.Parent = this;
    }

    private void InstallServiceProcessInstaller()
    {
           this.serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
           this.serviceProcessInstaller.Parent = this;
           this.serviceProcessInstaller.Password = null;    //2
           this.serviceProcessInstaller.Username = null;    //3
    }

//Zde můžeme provádět kontrolu jména a hesla při Users módu .
}

Ak hlavný proces služby spúšťa viac služieb, musíme pridať ServiceInstaller toľkokrát, koľko služieb budeme spúšťať.

  1. ServiceInstaller­Dialog nám zabezpečí, že pri nastavení Account na User sa zobrazí dialógové okno pre prihlásenie. Musíme pridať odkaz na System.Window­s.Forms.
  2. Musia byť null
  3. Musia byť null
installer User - C # - Pre pokročilých

Class MojeService1: ServiceBase

Pre testovanie triedy MojeService1 ju vybavíme pomocnú funkcií, ktorú po otestovaní môžeme odstrániť. Ak si veríte, túto pasáž môžete vynechať. Táto funkcia imituje funkčnosť podriadených služieb.

Doplníme triedu týmto kódom:

public partial class MojeService1 : ServiceBase
{
       // private ServiceA_1 service11; //reference na službu
        PerformanceCounter counter;
        System.Timers.Timer timer = new System.Timers.Timer();
        string fileName;
        bool isStopping;

        protected override void OnStart(string[] args)
        {
            // vytvořit performance counter pro zjištění zatížení procesoru
            counter = new PerformanceCounter();
            counter.CategoryName = "Processor";
            counter.CounterName = "% Processor Time";
            counter.InstanceName = "_Total";
            // cesta, kam se budou data ukládat libovolný adresář musí existovat !!!
        // zápis musí být v tomto tvaru nesmí být ....\\temp\\....
            fileName = @"c:\temp\cpu.txt";
            // vytvořit timer, který bude každou vteřinu data zapisovat
            timer.Interval = 1000;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.AutoReset = false;
            timer.Start();
        }

        protected override void OnStop()
        {
            isStopping = true;
        }

        private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            // zastavuje se služba? pak neprovádět další krok
            if (isStopping)
                return;
            try
            {
                // naformátovat hlášku, která bude do logu zapsána
                string message =
                    string.Format("{0:HH:mm:ss} - CPU usage {1}%",
                    DateTime.Now,
                    counter.NextValue());
                // zapsat hlášku
                System.IO.File.AppendAllText(fileName, message + Environment.NewLine);
            }
            finally
            {
                // po provedení kroku znovu spustit časovač
                timer.Start();
            }
        }
}

Po spustení z priečinka inštalačných - cmd.exe - Install si môžeme prezrieť spustenú službu. Musíme spustiť v okne našej služby "Štart".

Instaler - C # - Pre pokročilých
testovací súbor - C # - Pre pokročilých

Ukončíme službu tlačidlom "Stop", nebudeme vykonávať odinštalovanie príkazom Uninstall.bat!

Môžeme si oddýchnuť, prvú časť máme za sebou, jedná sa o rozcvičku. Môže nás tešiť, že táto časť projektu je rovnaká pre veľké množstvo služieb. Mení sa len názov služby.

Projekt ServiceControl

Tento projekt umožňuje sledovať a riadiť služba systému Windows. Projekt nie je závislý na konkrétny našej službe, je použiteľný všeobecne pre všetky služby. Myslím, že je z dielne Microsoftu. Podľa mňa by tento projekt mal rozšíriť o zachytávanie chýb, je to na každom z vás.

kontrola služieb - C # - Pre pokročilých

Zdrojový kód neuvádzam, je obsiahnutý v projekte. Ide o okenný aplikácii exe.

Pokračovanie v treťom diele.


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 117x (211.09 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