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):
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!
Nastavíme adaptér sieťového pripojenia (IPv6 možnosť budúceho použitia):
Nástroj SC (Sc.exe)
Každá služba musí byť zapísaná v databáze služieb a je uložená v registri.
- HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ meno našej služby
- 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.exe.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.exe.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.InstallLog, 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 InstallUtilInstalLog:
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:
Od Windows7 je v jadre operačného systému rozšírené zabezpečenie pozri MSDN, potrebujeme práva administrátora.
Class Installer1: System.Configuration.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ť.
- ServiceInstallerDialog nám zabezpečí, že pri nastavení Account na User sa zobrazí dialógové okno pre prihlásenie. Musíme pridať odkaz na System.Windows.Forms.
- Musia byť null
- Musia byť null
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".
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.
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#