Xidmət və tətbiq arasındakı fərq. Hansı Windows xidmətlərinə ehtiyac var və hansıları söndürmək olar. Tətik əsaslı xidmətlərin yaranması

Proqram uyğunluğu baxımından. Beləliklə, biz Windows 7 kontekstində xidmətlərin müzakirəsinə qayıtmağımız təbiidir. Amma bu dəfə biz Windows 7-də mövcud olan xidmətlərin optimallaşdırılmasının bəzi üstünlükləri haqqında danışacağıq. Bu məqalə Windows 7-də yeni funksiya haqqındadır - Trigger Start Services. Ancaq API-yə baxmazdan əvvəl xidmətlərin böyük mənzərəsinə nəzər salaq.

Xidmətlər nədir?

Xidmət Windows əməliyyat sistemində quraşdırılmış daxili mexanizmdir. Siz xidmətləri cari istifadəçi kontekstindən asılı olmayaraq işləyən xüsusi proqramlar kimi düşünə bilərsiniz. Xidmətlər adi proqramlardan onunla fərqlənir ki, onlar sistemin işə salındığı (yüklənildiyi) andan istifadəçinin iştirakı tələb olunmadan bağlanana qədər işləmək üçün konfiqurasiya edilə bilər. Yəni, istifadəçi daxil olmasa belə xidmətlər işləyə bilər.

Biz xidmətləri arxa planda işləyən və istifadəçi əməliyyatlarına təsir etməyən çalışan tapşırıqlar kimi düşünməyə üstünlük veririk. Windows-dakı xidmətlər Uzaqdan Prosedur Zəngi (RPC), Printer Spooler və Şəbəkə Məkanı Məlumatına qədər bütün növ fon fəaliyyəti üçün cavabdehdir.

İllər keçdikcə Windows böyüdü və xidmətlərin sayı da artdı. Düzünü desək, Windows-da fon xidmətləri bir az ağrılıdır - əməliyyat sistemi qutudan çıxarılan bir çox xidmətlə gəlir. Bundan əlavə, müstəqil proqram tərtibatçıları (ISV) və onların tətbiqləri daha çox xidmətlər əlavə edirlər. Məsələn, proqram təminatı yeniləmə xidmətləri. Bununla belə, bəzi xidmətlər kritikdir və yükləmə prosesi zamanı tələb olunur, digərləri isə daha sonra müəyyən bir istifadəçi daxil olduqdan sonra tələb olunur, digərləri isə çağırılana qədər ümumiyyətlə işə başlamaq lazım deyil. Buna baxmayaraq, hazırda fəaliyyət göstərən xidmətlərin siyahısına baxdığınız zaman 24x7 işləməyə ehtiyac olmayan bir çox obyektlər görürsünüz.

Gündə 24 saat, həftənin 7 günü fəaliyyət göstərən xidmətlərin nəyi pisdir?

24x7 xidmətlərlə bağlı bir sıra problemlər var. Birincisi, ehtiyac yoxdursa, niyə bir şey işləməlidir (hətta arxa planda da)? İstənilən işləyən proses (xidmətlər daxil olmaqla) digər proqramlar və xidmətlər üçün istifadə oluna bilən qiymətli yaddaş və CPU resurslarından istifadə edir. Müəyyən bir anda işləyən bütün xidmətləri sayarsanız, onlar əhəmiyyətli miqdarda yaddaş, tutacaqlar, mövzular və CPU istifadəsini əlavə edirlər. Bütün bu “boş-boş” resurslar kompüterin ümumi məhsuldarlığını azaldır, onun reaksiya qabiliyyətini azaldır və kompüteri ləng və yavaş göstərir. Bundan əlavə, bir çox xidmətlər avtomatik başlamağa konfiqurasiya edildiyindən (sistem işə salındıqda işə başlayır), onlar kompüterin açılış vaxtına təsir göstərir.

İkincisi, israf edilən bu resurslar enerji istehlakına birbaşa təsir göstərir. CPU-ya nə qədər çox yük düşərsə, kompüter bir o qədər çox enerji sərf edər. Bu, noutbuklarda kritik ola bilər və batareyanın ömrünü bir neçə saat azalda bilər.

Üçüncüsü, davamlı olaraq məhsuldar olmayan proqram təminatının işləməsi yaddaş sızmasına və ümumi sistemin qeyri-sabitliyinə səbəb ola bilər. Bu, proqramların və nəticədə kompüterin uğursuzluğuna səbəb olur.

Nəhayət, əgər xidmət 7x24 işləyirsə və o, tanınmış xidmətdirsə (hər bir populyar proqramda ola bilər, məsələn, PDF Reader), bu, böyük bir hücum səthi yaradır. Təcavüzkar müəyyən populyar proqramın 24x7 xidməti quraşdırdığı məlumatından istifadə edə və kompüterə giriş əldə etmək üçün onu sındırmağa cəhd edə bilər.

Bütün deyilənlərlə, bir çox tərtibatçının başqa seçimləri varsa niyə xidmətlərini hər zaman işləmək üçün qurduğunu merak edə bilərsiniz. Windows 7-dən əvvəl də xidmətləri işə salmaq üçün bir neçə variant var idi:

  • Əlil xidməti tamamilə söndürür və onun və ondan asılı xidmətlərin başlamasına mane olur - yəni istifadəçi xidməti İdarəetmə Panelindən və ya Əmr İstemindən əl ilə aktivləşdirməlidir.
  • Manual ehtiyac olduqda (digər xidmətlərin asılılığına görə) və ya xidmət aşağıda göstərildiyi kimi müvafiq API-lərdən istifadə edərək tətbiqdən çağırıldıqda xidmətə başlayır
  • Avtomatik daxil olduqdan sonra xidmətə başlayır
  • Avtomatik gecikmə– Windows Vista-da təqdim edilən daha yeni başlanğıc növü, onun köməyi ilə xidmət yükləmə tamamlandıqdan və ilkin əməliyyatlar tamamlandıqdan sonra başlayır və bu, sistemin işə salınmasını sürətləndirir.

Təəssüf ki, bir çox ISV-lər (Microsoft-un özü də daxil olmaqla) xidmətlərini Avtomatlaşdırılmış və ya Avtomatik Gecikmiş kimi təyin etməyə davam edir, çünki bu, hamı üçün ən sadə həll yolu kimi görünür. Xidmət sadəcə olaraq 24x7 işləyir və həmişə mövcuddur, asılılıqları və ya xidmətin işlək olub-olmadığını yoxlamaq ehtiyacını aradan qaldırır.

7/24 işləmədən daha az resurs istifadə edən və daha təhlükəsiz ola bilən mövcud xidmətlərin bir çox nümunəsi var. Məsələn, tətbiqin yeni yeniləmələrini yoxlayan yeniləmə xidməti haqqında düşünün. Əgər kompüter şəbəkəyə qoşulmayıbsa və IP ünvanı yoxdursa, niyə işləməlidir? O, heç nə edə bilməz, onda heç nə etməyən proqramı niyə işlək vəziyyətdə qoyursunuz? Qrup Siyasətlərini dəyişdirərkən və ya kompüter domenə qoşulduqda və ya ayrıldıqda istifadə edilən Siyasət İdarəetmə Xidməti haqqında düşünün, lakin indi kompüter mənim ev şəbəkəmə qoşulduqda, xidmət yenidən boş işləyir.

Tətik əsaslı xidmətlərin yaranması

Yuxarıda göstərilən problemlərin həlli xidməti "həmişə açıq" vəziyyətindən planlaşdırılmış tapşırıqlar və ya işə salınan xidmətlər kimi digər fon fəaliyyət növlərinə köçürməkdir. Bu məqalə Windows 7 Trigger Start Services haqqındadır. Növbəti məqalələrdə görüləcək Windows 7 Planlaşdırılmış Tapşırıqlar haqqında çox maraqlı şeylər söyləmək olar.

Son yenilənmə: 31/10/2015

Windows əməliyyat sisteminin ən vacib komponentlərindən biri xidmətlərdir. Əslində bunlar qrafik interfeysi olmayan və fonda müxtəlif vəzifələri yerinə yetirən ayrı proqramlardır. Xidmətlər əməliyyat sistemi işə salındıqda və ya istifadəçinin işlədiyi istənilən vaxt işə salına bilər. Xidmətlərin ümumi nümunəsi, əlaqələr üçün müəyyən bir porta arxa planda qulaq asan və əlaqələr varsa, onlarla qarşılıqlı əlaqədə olan müxtəlif veb serverləridir. Tətbiqin yeni versiyasının olub olmadığını öyrənmək üçün serverlə əlaqə saxlayan digər quraşdırılmış proqramlar üçün müxtəlif köməkçi yeniləmə xidmətləri də ola bilər. Ümumiyyətlə, biz xidmətlər panelini aça və bütün quraşdırılmış və işləyən xidmətləri özümüz görə bilərik:

Gəlin C# dilində öz xidmətlərinizi necə yaratacağınıza baxaq. Həyata keçiriləcək tapşırıq olaraq, biz fayl sistemindəki müəyyən bir qovluqdakı dəyişiklikləri izləməyi seçəcəyik. İndi onu yerinə yetirmək üçün bir xidmət yaradaq.

Əvvəlcə Windows Service tipli yeni layihə yaradaq. Layihəni FileWatcherService adlandıraq:

Sonra Visual Studio sizə lazım olan hər şeyə malik olan layihə yaradır. Bu xüsusi layihə növünü seçmək məcburiyyətində olmasaq da, biz bir sinif kitabxanası layihəsi yarada və sonra bütün lazımi sinifləri təyin edə bilərik.

Beləliklə, yeni layihə belə görünür:

Proqram.cs faylı da var və faktiki xidmət node Service1.cs var.

Xidmət adi tətbiqi təmsil edir, lakin öz-özünə başlamır. Bütün zənglər və ona giriş xidmətə nəzarət meneceri (Service Control Manager və ya SCM) vasitəsilə keçir. Xidmət sistemin başlanğıcında avtomatik olaraq və ya əl ilə işə salındıqda, SCM Proqram sinfində Main metodunu çağırır:

Statik sinif Proqramı ( statik boşluq Main() ( ServiceBase ServicesToRun; ServicesToRun = yeni ServiceBase (yeni Service1() ); ServiceBase.Run(ServicesToRun); ) )

Main metodu defolt olaraq ServicesToRun massivində müəyyən edilmiş birdən çox xidməti eyni anda işə salmaq üçün müəyyən edilmişdir. Bununla belə, standart olaraq layihə yalnız bir xidmətdən ibarətdir, Service1. Başlatma özü Run metodundan istifadə etməklə həyata keçirilir: ServiceBase.Run(ServicesToRun) .

Başlanılan xidmət Service1.cs qovşağı ilə təmsil olunur. Ancaq bu, əslində sadə bir kod faylı deyil. Bu qovşağı açsaq, Service1.Designer.cs xidmət konstruktor faylını və Service1 sinfini görəcəyik.

Service1 sinfi əslində xidməti təmsil edir. Varsayılan olaraq, aşağıdakı kod var:

Sistemdən istifadə; System.Collections.Generic istifadə edərək; System.ComponentModel istifadə edərək; System.Data istifadə edərək; System.Diagnostics istifadə edərək; System.Linq istifadə edərək; System.ServiceProcess istifadə edərək; System.Text istifadə edərək; System.Threading.Tasks istifadə edərək; ad sahəsi FileWatcherService ( ictimai qismən sinif Service1: ServiceBase ( ictimai Xidmət1() ( InitializeComponent(); ) qorunan ləğvetmə etibarsız OnStart(string args) ( ) qorunan ləğvetmə etibarsız OnStop() ( ) ) )

Xidmət sinfi ServiceBase baza sinfindən miras alınmalıdır. Bu sinif bir sıra metodları müəyyən edir, onlardan ən mühümləri xidmətin yerinə yetirdiyi hərəkətləri işə salan OnStart() metodu və xidməti dayandıran OnStop() metodudur.

SCM Main metodunu çağırdıqdan və xidməti qeydiyyatdan keçirdikdən sonra OnStart metodu ilə birbaşa çağırılır.

Xidmətlər konsolunda və ya komanda xətti vasitəsilə bir xidməti dayandırmaq üçün əmr göndərdiyimiz zaman, SCM onu dayandırmaq üçün OnStop metodunu çağırır.

Xidmət sinfində bu iki üsula əlavə olaraq, ServiceBase baza sinifinin daha bir neçə metodunu ləğv edə bilərsiniz:

    OnPause: Xidmət dayandırıldıqda çağırılır

    OnContinue: Xidmət dayandırıldıqdan sonra bərpa edildikdə çağırılır

    OnShutdown: Windows bağlandıqda çağırılır

    OnPowerEvent: Güc rejimi dəyişdikdə çağırılır

    OnCustomCommand: Xidmət Xidmətə Nəzarət Menecerindən (SCM) xüsusi əmr aldıqda çağırılır.

Service1 sinifinin konstruktorunda Service1.Designer.cs konstruktor faylında müəyyən edilmiş InitializeComponent() metodu çağırılır:

Namespace FileWatcherService ( qismən sinif Service1 ( şəxsi System.ComponentModel.IContainer komponentləri = null; qorunan ləğvetmə etibarsızdır Dispose(bool disposing) ( if ( dispose && (components != null))) ( components.Dispose(); ) base.Dispose(dispose) ) private void InitializeComponent() (komponentlər = new System.ComponentModel.Container(); this.ServiceName = "Service1"; ) ) )

Burada qeyd edilməli olan yeganə şey xidmət adını təyin etməkdir (ServiceName xüsusiyyəti):

This.ServiceName = "Xidmət1";

Bu, bu xidməti quraşdırdıqdan sonra xidmətlər konsolunda görünəcək addır. Biz onu dəyişə bilərik, ya da olduğu kimi buraxa bilərik.

İndi xidmət kodunu aşağıdakı kimi dəyişdirək:

Sistemdən istifadə; System.ServiceProcess istifadə edərək; System.IO istifadə edərək; System.Threading istifadə edərək; namespace FileWatcherService ( ictimai qismən sinif Service1: ServiceBase ( Logger logger; public Service1() ( InitializeComponent(); this.CanStop = true; this.CanPauseAndContinue = true; this.AutoLog = true; ) qorunan ləğvetmə etibarsız OnStart(string args) ( logger = new LoggerThread = new ThreadStart(logger.Start) mühafizəsi ləğv edilir OnStop() ( logger.Stop(); Thread.Sleep(1000); ) ) sinif Logger ( FileSystemWatcher izləyicisi; obyekt obj = yeni obyekt(); bool aktiv = doğru; ictimai Logger() ( izləyici = yeni FileSystemWatcher("D:\\Temp"); watcher.Deleted += Watcher_Deleted; watcher.Created + = Watcher_Created; watcher.Changed += Watcher.Renamed += Watcher_Renamed; = false enabled = false; ) // faylların adının dəyişdirilməsi void Watcher_Renamed(obyekt göndərən, RenamedEventArgs e) ( string fileEvent = "adlandırıldı" + e.FullPath; string filePath = e.OldFullPath; RecordEntry (fileEvent, filePath); ) // faylların dəyişdirilməsi şəxsi void Watcher_Changed(obyekt göndərən, FileSystemEventArgs e) ( string fileEvent = "dəyişdirildi"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // Şəxsi etibarsız faylların yaradılması Watcher_Created(obyekt göndərən, FileSystemE). e) ( string fileEvent = "created"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // faylların silinməsi şəxsi etibarsız Watcher_Deleted(obyekt göndərən, FileSystemEventArgs e) ( string fileEvent = "silindi"; string filePath = e.FullPath (fileEvent, filePath) şəxsi void RecordEntry (string fileEvent, string filePath) ( lock (obj) (StreamWriter writer = new StreamWriter("D:\\templog.txt", doğru)) (yazıcı); .WriteLine(String.Format("(0) fayl (1) idi (2)", DateTime.Now.ToString("gg/MM/yyyy ss:dd:ss"), filePath, fileEvent)); ;)))

Bütün funksionallığı əhatə edən əsas sinif Logger sinfidir. FileSystemWatcher obyektindən istifadə edərək, qovluqdakı dəyişiklikləri izləyəcək D://Temp. Start() metodu FileSystemWatcher obyekti vasitəsilə dəyişiklikləri izləyəcəyimizi müəyyən edir. Aktivləşdirilmiş boolean dəyişəni doğru olduğu müddətdə bütün işlər davam edəcək. Stop() metodu isə sinfi dayandırmağa imkan verəcək.

FileSystemWatcher hadisələri sizə baxılan qovluğa edilən bütün dəyişiklikləri izləməyə imkan verir. Bu templog.txt faylına dəyişiklikləri qeyd edəcək. Dəyişikliklərin qeydə alındığı templog.txt faylı üçün resurs yarışının qarşısını almaq üçün qeyd proseduru lock(obj) stub tərəfindən bloklanır.

Nəticədə, yaratdıqdan, dəyişdirildikdən, adının dəyişdirilməsindən və silinməsindən sonra log faylında aşağıdakı kimi bir şey olacaq:

30.07.2015 12:15:40 fayl D:\Temp\New text document.txt yaradıldı 30/07/2015 12:15:46 fayl D:\Temp\New text document.txt adı dəyişdirildi D:\ Temp\hello txt 30/07/2015 12:15:55 faylı D:\Temp\hello.txt dəyişdirildi 30/07/2015 12:15:55 fayl D:\Temp\hello.txt 07/30 dəyişdirildi. /2015 12:16:01 D: \Temp\hello.txt faylı silindi

Service1 xidmət sinfinin özündə konstruktorda bir sıra seçimlər təyin olunur:

This.CanStop = doğrudur; // xidmət bu şəkildə dayandırıla bilər.CanPauseAndContinue = true; // xidmət dayandırıla və sonra bunu davam etdirə bilər.AutoLog = true; // xidmət jurnala yaza bilər

OnStart() metodunda Logger obyektini işə salmaq üçün yeni başlıq çağırılır:

Qorunan ləğvetmə etibarsız OnStart(string args) ( logger = new Logger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); )

Yeni mövzu lazımdır, çünki cari ip yalnız SCM əmrlərini emal edir və OnStart metodundan mümkün qədər tez qayıtmalıdır.

Xidməti dayandırmaq üçün SCM-dən əmr alındıqda, logger.Stop() metodunu çağıran OnStop metodu işə salınır. Əlavə gecikmə logger mövzusunun dayanmasına imkan verəcək:

Qorunan ləğvetmə etibarsız OnStop() ( logger.Stop(); Thread.Sleep(1000); )

Bununla belə, xidmət sinfinin özü kifayət deyil. Həmçinin xidmət quraşdırıcısı yaratmalıyıq.

Və ya istifadəçilərin iş masası (həm yerli, həm də uzaq), lakin bəzi xidmətlər üçün bir istisna mümkündür - konsolla qarşılıqlı əlaqə (istifadəçinin yerli olaraq qeydiyyatdan keçdiyi və ya xidmətə başlayarkən 0 nömrəli sessiya) mstsc/konsol açarı ilə).

Xidmətlər üçün bir neçə rejim var:

  • işə salınması qadağandır;
  • əl ilə işə salma (istək əsasında);
  • kompüter açıldıqda avtomatik başlanğıc;
  • avtomatik (gecikmiş) işə salınma (Windows Vista və Windows Server 2008-də təqdim edilmişdir);
  • məcburi xidmət/sürücü (avtomatik başlanğıc və xidməti dayandıra bilməməsi (istifadəçi üçün).

Fon rejimi

Windows xidmətlərini işə salın, dayandırın və dəyişdirin

Xidmətlər və onların atributları MMC-də dəyişdirilə bilər:

Əməliyyat sistemlərinin müxtəlif versiyalarında bəzi xidmətlər ola bilər, digərləri isə yox. Ayrı-ayrılıqda quraşdırılmış bəzi tətbiqlər və proqramlar da öz xidmətlərini yarada bilər.

Microsoft Windows əməliyyat sistemi xidmətlərinin siyahısı

Göstərilən ad Xidmət adı Funksiyalar Təsvir
DHCP müştəri Dhcp Bu kompüter üçün IP ünvanlarını və DNS qeydlərini qeyd edir və yeniləyir. Bu xidmət dayandırılsa, bu kompüter dinamik IP ünvanları əldə edə və DNS yeniləmələrini həyata keçirə bilməyəcək.
DNS müştəri Dnscache DNS Müştəri xidməti (dnscache) Domen Adı Sisteminin (DNS) adlarını keşləyir və verilmiş kompüterin tam uyğun adını qeyd edir. Xidmət dayandırılsa, DNS adının həlli davam edəcək. Bununla belə, DNS ad növbələrinin nəticələri keşlənməyəcək və kompüter adı qeydə alınmayacaq.
Paylanmış əməliyyat koordinatoru üçün KtmRm KtmRm MSDTC və Kernel Transaction Manager (KTM) arasında əməliyyatları əlaqələndirir.
ReadyBoost EMDMgmt ReadyBoost ReadyBoost texnologiyasından istifadə edərək sistem performansını yaxşılaşdırmaq üçün dəstək.
Super gətirmə SysMain Super gətirmə Sistem performansını saxlayır və yaxşılaşdırır.
Windows Audio Audiosrv Windows proqramları üçün audio alətlərin idarə edilməsi. Bu xidmət dayandırılsa, audio cihazları və effektləri düzgün işləməyəcək.
Windows CardSpace idsvc Rəqəmsal şəxsiyyətləri yaratmaq, idarə etmək və ifşa etmək üçün təhlükəsiz imkan təmin edir.
Avtomatik yeniləmə WUAUSERV Windows yeniləmələrinin endirilməsi və quraşdırılması daxildir. Xidmət deaktiv edilərsə, bu kompüter Avtomatik Yeniləmələri və ya Windows Yeniləmə Veb saytından istifadə edə bilməyəcək.
Uzaqdan Prosedur Zəngi (RPC) RPCS Son nöqtələr və digər RPC xidmətləri arasında xəritələşdirməni təmin edir.

Microsoft proqramları və proqramları tərəfindən yaradılmış xidmətlərin siyahısı

Üçüncü tərəf proqramları və proqramları tərəfindən yaradılan xidmətlərə nümunələr

Göstərilən ad Xidmət adı Funksiyalar Təsvir
ESET HTTP Server EhttpSrv antivirus qorunması ESET HTTP Server komponenti

Proqramı Windows xidməti kimi necə işə salmaq olar

Müştəri tətbiqini xidmət kimi işə salmaq mümkündürmü? Onlardan birində standart OS alətlərindən istifadə edərək Windows xidmətinin yaradılması yollarını təsvir etdim. Bununla belə, hər bir konsol tətbiqi bir xidmət kimi işləyə bilməz və qrafik interfeysli proqramlar, prinsipcə, bu şəkildə işləyə bilməz. Ancaq hələ də tətbiqi bir xidmət kimi işə salmaq mümkündür və orijinal adı olan bir proqram bu işdə bizə kömək edəcəkdir Əmizdirməyən Xidmət Meneceri.

NSSM pulsuz və açıq mənbə proqramdır və Windows 2000-dən Windows 8-ə qədər bütün Microsoft əməliyyat sistemlərini dəstəkləyir. NSSM quraşdırma tələb etmir, sadəcə onu endirin və açın. Dağıtım 32 və 64 bitlik əməliyyat sistemləri üçün versiyaları əhatə edir. Proqramı nssm.cc saytından əldə edə bilərsiniz, hal-hazırda ən son stabil versiya 2.21.1-dir, ondan istifadə edəcəm.

NSSM-nin imkanlarını nümayiş etdirmək üçün gəlin Windows 8.1-də Windows Notepad-i xidmət kimi işə salmağa çalışaq.

Xidmətin yaradılması

adlı bir xidmət yaratmaq üçün bloknot komanda konsolunu işə salın, açılmamış NSSM (64-bit Windows üçün) olan qovluğa gedin və NSSM qrafik quraşdırma pəncərəsini açan nssm install notepad əmrini daxil edin. Xidmət yaratmaq üçün Path sahəsində icra olunan faylın yolunu göstərin və "Xidməti quraşdırın" düyməsini basın. Bundan əlavə, Seçimlər sahəsində siz xidməti başlamaq üçün tələb olunan düymələri təyin edə bilərsiniz.

Yeni xidmət yaratarkən bəzi əlavə parametrləri də təyin edə bilərsiniz.

Kapatma nişanı proqram normal şəkildə bağlandıqda və ya qəzaya uğradıqda istifadə olunan bağlama üsullarını və vaxtaşımlarını sadalayır. NSSM dayandırma əmrini qəbul etdikdə (məsələn, proqram bağlandıqda), idarə olunan tətbiqi normal şəkildə dayandırmağa çalışır. Tətbiq cavab vermirsə, NSSM bu tətbiqin bütün proseslərini və alt proseslərini məcburi şəkildə dayandıra bilər.

Proqramı bağlamaq üçün dörd addım var və onlar standart olaraq bu ardıcıllıqla istifadə olunacaq:

Birinci mərhələdə NSSM hadisə yaratmağa və göndərməyə çalışır Ctrl+C. Bu üsul konsol proqramları və ya skriptlər üçün yaxşı işləyir, lakin qrafik proqramlar üçün tətbiq edilmir;
Daha sonra NSSM proqram tərəfindən yaradılmış bütün pəncərələri aşkarlayır və onlara WM_CLOSE mesajı göndərir, bu da proqramın çıxmasına səbəb olur;
Üçüncü addım ondan ibarətdir ki, NSSM proqram tərəfindən yaradılan bütün mövzuları hesablayır və onlara WM_QUIT mesajı göndərir ki, proqramda mövzu mesajı növbəsi varsa, bu mesaj alınacaq;
Son çarə olaraq, NSSM TerminateProcess() metodunu çağıraraq tətbiqi dayandırmağa məcbur edə bilər.

Bəzi və ya hətta bütün üsulları söndürmək mümkündür, lakin fərqli üsullar müxtəlif tətbiqlər üçün işləyir və tətbiqin düzgün bağlanmasını təmin etmək üçün hər şeyi olduğu kimi tərk etmək tövsiyə olunur.

Varsayılan olaraq, xidmət qəzaya uğradıqda, NSSM onu yenidən başlatmağa çalışır. "Çıxış hərəkətləri" sekmesinde, proqram anormal şəkildə dayandırıldıqda avtomatik hərəkəti dəyişdirə, həmçinin proqram avtomatik olaraq yenidən başlamazdan əvvəl gecikmə təyin edə bilərsiniz.

“Giriş/Çıxış (I/O)” nişanında siz proqramın giriş/çıxışının müəyyən edilmiş fayla yönləndirilməsini təyin edə bilərsiniz.

"Ətraf mühit" tabında siz xidmət üçün yeni mühit dəyişənləri təyin edə və ya mövcud olanları ləğv edə bilərsiniz.

Siz həmçinin qrafik qabığı istifadə edə bilməzsiniz və dərhal aşağıdakı əmrlə konsolda bir xidmət yarada bilərsiniz:

nssm quraşdırma bloknotunu ″C:\Windows\system32\notepad.exe″

Xidmətin idarə edilməsi

NSSM-dən istifadə edərək xidməti yaratdıqdan sonra Xidmətlər bölməsinə keçin və notepad xidmətini tapın. Göründüyü kimi, o, digər xidmətlərdən heç bir fərqi yoxdur, biz də onu işə sala, dayandıra və ya işə salma rejimini dəyişə bilərik. Bununla belə, nssm.exe-nin icra olunan fayl kimi qeyd edildiyini nəzərə alın.

Və əgər Tapşırıq menecerinə keçsək, aşağıdakı şəkli görəcəyik: NSSM əsas (ana) proses kimi işləyir, notepad xidməti öz uşaq prosesi kimi işləyir və Notepad tətbiqi artıq bu uşaq prosesində işləyir.

Xidmətin çıxarılması

Xidməti silmək üçün nssm sil notepad əmrini daxil edin və onun silinməsini təsdiqləyin. Və əmri daxil edərək nssm notepad sil təsdiqləyin , siz təsdiq etmədən edə bilərsiniz.

İnteraktiv şəkildə xidmətə başlayın

İstifadəçi tətbiqi ilə xidmət arasındakı əsas fərq ondan ibarətdir ki, işə salındıqdan sonra proqram işə davam etmək üçün düyməyə basmaq və ya əmr daxil etmək kimi əlavə istifadəçi hərəkətlərini tələb edə bilər. Bunu etmək üçün ona giriş əldə etməlisiniz, göründüyü kimi bunu etmək o qədər də asan deyil.

İnteraktiv rejimdə bir xidmətə başlamaq üçün onun xassələrini Xidmətlər bölməsində və "Giriş" sekmesinde açmalı, "Masa üstü ilə qarşılıqlı əlaqəyə icazə ver" qutusunu işarələyin.

Və sonra möcüzələr başlayır :) İnteraktiv rejimdə işə salınan xidmət təcrid olunmuş sessiyada açılır (sessiya 0). Bu sessiyaya yalnız interaktiv xidmətlərin kompüterdə işə salınmasına nəzarət edən və xəbərdarlıq verən İnteraktiv Xidmətlərin Aşkarlanması Xidmətindən (ui0detect) istifadə etməklə daxil olmaq olar. Windows 7\Server 2008-də bu xidmət standart olaraq aktivdir, lakin Windows 8\Server 2012-də o, söndürülüb və Xidmətlərin qrafik əlavəsində görünmür (ən azı mən onu orada tapmadım). Üstəlik, bu sirli xidməti tapsanız və onu işə salmağa çalışsanız, səhv mesajı alacaqsınız.

Amma fakt budur ki, onu işə salmaq üçün kompüterinizdə interaktiv xidmətlərin işləməsinə icazə verməlisiniz. Buna görə də, qeyd redaktorunu açın, HKLM\System\CurrentControlSet\Control\Windows bölməsində adlı DWORD tipli parametri tapın. İnteraktiv Xidmətlər yoxdur və dəyərini təyin edin 0 .

Sonra PowerShell konsolunu açın və əmrlə kəşf xidmətinə başlayın:

Start-Service -Ad ui0detect

Aşkarlama xidmətinin işlədiyinə əmin olduqdan sonra notepad xidmətini yenidən işə salırıq və bu pəncərəni alırıq. "Mesajı görüntülə" seçin

və tətbiqimizin işlədiyi null sessiyada özümüzü tapırıq. Sonra onunla lazımi hərəkətləri yerinə yetirib geri qayıdırıq.

Bu, proqramları Windows xidmətləri kimi işlətmək üçün maraqlı bir həlldir. Ən gözəli deyil, amma adına uyğundur :)


Windows NT xidməti Windows NT əməliyyat sistemi ilə qarşılıqlı əlaqə üçün vahid interfeysə malik olan xüsusi prosesdir. Xidmətlər iki növə bölünür - Service Control Manager (SCM) vasitəsilə əməliyyat sistemi ilə qarşılıqlı əlaqədə olan Win32 xidmətləri və Windows NT cihaz drayver protokolundan istifadə etməklə işləyən sürücülər. Biz yalnız bu məqalədə Win32 xidmətlərindən bəhs edəcəyik.

Xidmətlərin tətbiqi

Xidmətin ən vacib xüsusiyyətlərindən biri qeyri-interaktivlikdir. Tipik bir xidmət adi istifadəçi tərəfindən nəzərə alınmadan arxa planda işləyir. Buna görə xidmətlər aşağıdakı tətbiq növlərini həyata keçirmək üçün ən uyğundur:

  • Müştəri-server arxitekturasında serverlər (məsələn, MS SQL, MS Exchange Server)
  • Windows NT şəbəkə xidmətləri (Server, Workstation);
  • Paylanmış proqramların server (funksionallıq baxımından) komponentləri (məsələn, bütün növ monitorinq proqramları).

Xidmətlərin əsas xüsusiyyətləri

Xidmət adi Win32 proqramından 3 əsas xüsusiyyəti ilə fərqlənir. Gəlin onların hər birinə nəzər salaq.

Birincisi, xidməti düzgün dayandırmaq (dayandırmaq) mümkündür. Standart mexanizmlərdən istifadə edən istifadəçi və ya digər proqram xidmətin vəziyyətini dəyişdirmək imkanına malikdir - onu işləyən vəziyyətdən dayandırılmış vəziyyətə köçürmək və ya hətta işləməsini dayandırmaq. Bu halda, vəziyyətini dəyişdirməzdən əvvəl xidmət xüsusi bir bildiriş alır, bunun sayəsində yeni vəziyyətə keçid üçün lazım olan hərəkətləri edə bilər, məsələn, işğal edilmiş resursları buraxır.

İkincisi, istifadəçini qeydiyyatdan keçirməzdən əvvəl xidmətə başlamaq imkanı və nəticədə ümumiyyətlə qeydiyyatdan keçmiş istifadəçi olmadan işləmək imkanı. İstənilən xidmət əməliyyat sistemi işə salındıqda avtomatik olaraq işə salına və hətta istifadəçi sistemə daxil olmamışdan əvvəl işə başlaya bilər.

Və nəhayət, özbaşına təhlükəsizlik kontekstində işləmək bacarığı. Windows NT təhlükəsizlik konteksti bir proses üçün müxtəlif sistem obyektlərinə və məlumatlarına giriş hüquqlarını müəyyən edir. Həmişə hazırda sistemə daxil olan istifadəçinin təhlükəsizlik kontekstində işləyən tipik Win32 proqramından fərqli olaraq, xidmət üçün onun icrasının təhlükəsizlik konteksti əvvəlcədən müəyyən edilə bilər. Bu o deməkdir ki, xidmət əvvəlcədən müəyyən edilmiş sistem obyektlərinə giriş hüquqlarına malik ola bilər və bununla da onun fəaliyyət dairəsini məhdudlaşdıra bilər. Xidmətlər üçün Yerli Sistem adlı xüsusi bir standart təhlükəsizlik konteksti var. Bu kontekstdə işləyən xidmət yalnız yerli kompüterdəki resurslara hüquqlara malikdir. Yerli Sistem hüquqları ilə heç bir şəbəkə əməliyyatı həyata keçirilə bilməz, çünki bu kontekst yalnız yerli kompüterdə məna kəsb edir və şəbəkədəki digər kompüterlər tərəfindən tanınmır.

Xidmətin digər tətbiqlərlə qarşılıqlı əlaqəsi

Müvafiq hüquqlara malik olan istənilən proqram xidmətlə əlaqə saxlaya bilər. Qarşılıqlı fəaliyyət, ilk növbədə, xidmətin vəziyyətinin dəyişdirilməsini, yəni onun üç vəziyyətdən birinə ötürülməsini nəzərdə tutur - çalışır (Start), dayandırılmış (Pauza), dayandırmaq və SCM sorğularını təqdim etməklə həyata keçirilir. Sorğular üç növdür - xidmətlərdən gələn mesajlar (onların vəziyyətlərinin düzəldilməsi), xidmətin konfiqurasiyasının dəyişdirilməsi və ya onun haqqında məlumatın əldə edilməsi ilə bağlı sorğular və xidmətin vəziyyətini dəyişdirmək üçün tətbiq sorğuları.

Xidməti idarə etmək üçün əvvəlcə OpenService Win32 API funksiyasından istifadə edərək onun sapını əldə etməlisiniz. StartService funksiyası xidmətə başlayır. Lazım gələrsə, ControlService funksiyasına zəng etməklə xidmətin vəziyyəti dəyişdirilir.

Xidmət verilənlər bazası

Hər bir xidmət haqqında məlumat reyestrdə - HKLM\SYSTEM\CurrentControlSet\Services\ServiceName açarında saxlanılır. O, aşağıdakı məlumatları ehtiva edir:

  • Xidmət növü. Bu proqramın yalnız bir xidməti (eksklüziv) həyata keçirib-keçmədiyini və ya tətbiqdə onlardan bir neçəsinin olub-olmadığını göstərir. Eksklüziv xidmət istənilən təhlükəsizlik kontekstində fəaliyyət göstərə bilər. Eyni proqram daxilində birdən çox xidmət yalnız LocalSystem kontekstində işləyə bilər.
  • Başlatma növü. Avtomatik - xidmət sistem işə salındıqda başlayır. Tələb üzrə - xidmət istifadəçi tərəfindən əl ilə işə salınır. Deaktiv edilib - Xidməti başlamaq mümkün deyil.
  • İcra olunan modulun adı (EXE faylı).
  • Digər xidmətlərlə bağlı başlanğıc sifarişi. Bəzi hallarda xidmətin düzgün işləməsi üçün bir və ya bir neçə digər xidmət işləməlidir. Bu halda, reyestrdə bundan əvvəl başlamış xidmətlər haqqında məlumatlar var.
  • Xidmətin icrası təhlükəsizlik konteksti (şəbəkə adı və parol). Varsayılan olaraq, təhlükəsizlik konteksti LocalSystem-dir.

Xidmət haqqında məlumat əldə etmək və ya xidmət parametrlərini dəyişdirmək istəyən proqramlar reyestrdəki xidmətin verilənlər bazasındakı məlumatları mahiyyətcə dəyişməlidir. Bu, müvafiq Win32 API funksiyalarından istifadə etməklə edilə bilər:

  • OpenSCManager, CreateService, OpenService, CloseServiceHandle - xidmət yaratmaq (açmaq) üçün;
  • QueryServiceConfig, QueryServiceObjectSecurity, EnumDependentServices, EnumServicesStatus - xidmət haqqında məlumat əldə etmək üçün;
  • ChangeServiceConfig, SetServiceObjectSecurity, LockServiceDatabase, UnlockServiceDatabase, QueryServiceLockStatus - xidmət konfiqurasiya məlumatlarını dəyişdirmək üçün.

Xidmətin daxili strukturu.

Bunun baş verməsi üçün proqram müvafiq olaraq strukturlaşdırılmalıdır, yəni müəyyən funksionallığı olan müəyyən funksiyalar dəstini (C++ baxımından) daxil etməlidir. Onların hər birinə qısaca nəzər salaq.

əsas funksiyası

Bildiyiniz kimi, əsas funksiya istənilən Win32 konsol tətbiqinin giriş nöqtəsidir. Xidmət işə salındıqda, əvvəlcə bu funksiyanın kodu icra olunmağa başlayır. Başlanğıcdan 30 saniyə ərzində əsas funksiya proqram və SCM arasında əlaqə yaratmaq üçün StartServiceCtrlDispatcher-ə zəng etməlidir. Verilmiş proqramdakı hər hansı xidmət və SCM arasındakı bütün əlaqə StartServiceCtrlDispatcher funksiyası çərçivəsində həyata keçirilir və bu funksiya yalnız proqramdakı bütün xidmətlər dayandırıldıqdan sonra dayandırılır.

ServiceMain funksiyası

Proses miqyasında giriş nöqtəsinə əlavə olaraq, tətbiqdə həyata keçirilən xidmətlərin hər biri üçün ayrıca giriş nöqtəsi də mövcuddur. Xidmətə giriş nöqtələri olan funksiyaların adları (sadəlik üçün hamısını eyni adlandıraq - ServiceMain) StartServiceCtrlDispatcher çağırarkən parametrlərdən birində SCM-ə ötürülür. Hər bir xidmət işə salındıqda, ServiceMain-i yerinə yetirmək üçün ayrıca bir başlıq yaradılır.

Nəzarəti qəbul etdikdən sonra ServiceMain əvvəlcə proqramdakı hər bir xidmət üçün xidmət sorğusu idarəçisini, Handler funksiyasını qeydiyyatdan keçirməlidir. Bunun ardınca adətən ServiceMain-də xidməti işə salmaq üçün bəzi hərəkətlər - yaddaşın ayrılması, verilənlərin oxunması və s. Bu hərəkətlər xidmətin hələ də başlama prosesində olduğu və heç bir nasazlığın baş vermədiyi barədə SCM bildirişləri ilə müşayiət olunmalıdır. Bildirişlər SetServiceStatus funksiyasına edilən zənglərdən istifadə etməklə göndərilir. Ən sonuncudan başqa bütün zənglər SERVICE_START_PENDING parametri ilə, ən sonuncusu isə SERVICE_RUNNING parametri ilə olmalıdır. Zənglərin tezliyi xidmət tərtibatçısı tərəfindən aşağıdakı şərt əsasında müəyyən edilir: iki bitişik SetServiceStatus çağırışı arasındakı vaxt intervalının müddəti iki zəngdən birincisi zamanı SCM-ə ötürülən dwWaitHint parametrinin dəyərindən çox olmamalıdır. Əks halda, növbəti bildirişi vaxtında almayan SCM xidməti məcburi şəkildə dayandıracaq. Bu üsul müəyyən nasazlıqların baş verməsi nəticəsində başlanğıcda xidmətin vəziyyətindən qaçmağa imkan verir (unutmayın ki, xidmətlər adətən qeyri-interaktivdir və istifadəçi olmadıqda işə salına bilər). Adi təcrübə ondan ibarətdir ki, SCM-ə növbəti işə salma addımı başa çatdıqdan sonra məlumat verilir.

İşləyici funksiyası

Yuxarıda qeyd edildiyi kimi, Handler geri çağırış funksiyasının prototipidir, tətbiqdəki hər bir xidmət üçün unikal olan xidmət sorğusu idarəçisidir. Xidmət sorğu qəbul etdikdə (başlamaq, dayandırmaq, davam etdirmək, dayandırmaq, cari vəziyyət mesajı) və sorğuya uyğun olaraq lazımi hərəkətləri yerinə yetirdikdə işləyici çağırılır, bundan sonra yeni vəziyyəti SCM-ə bildirir.

Bir sorğu xüsusilə qeyd edilməlidir - sistemin bağlanması zamanı alınan sorğu (Söndürmə). Bu sorğu deinisializasiya və ləğv etmək zərurətindən xəbər verir. Microsoft deyir ki, hər bir xidmətə məcburi dayandırılmadan əvvəl bağlanması üçün 20 saniyə vaxt verilir. Ancaq sınaqlar göstərdi ki, bu şərt həmişə yerinə yetirilmir və xidmət bu müddət başa çatmamış dayandırmaq məcburiyyətində qalır.

Xidmət təhlükəsizlik sistemi

Xidmətlərlə bağlı istənilən hərəkət tətbiqin müvafiq hüquqlara malik olmasını tələb edir. Bütün proqramlar SCM-ə qoşulmaq, xidmətləri sadalamaq və xidmət verilənlər bazasının bloklandığını yoxlamaq hüququna malikdir. Yalnız inzibati hüquqları olan proqramlar sistemdə yeni xidməti qeydiyyatdan keçirə və ya xidmət verilənlər bazasını bloklaya bilər.

Hər bir xidmətdə hansı istifadəçilərin hansı əməliyyata hüquqlarının olduğunu təsvir edən təhlükəsizlik deskriptoru var. Defolt:

  • Bütün istifadəçilərin SERVICE_QUERY_CONFIG, SERVICE_QUERY_STATUS, SERVICE_ENUMERATE_DEPENDENTS, SERVICE_INTERROGATE və SERVICE_USER_DEFINED_CONTROL hüquqları var;
  • Power Users qrupuna və LocalSystem hesabına aid olan istifadəçilər əlavə olaraq SERVICE_START, SERVICE_PAUSE_CONTINUE və SERVICE_STOP hüquqlarına malikdirlər;
  • Administratorlar və Sistem Operatorları qruplarına aid olan istifadəçilər SERVICE_ALL_ACCESS hüququna malikdirlər.

Xidmətlər və interaktivlik

Varsayılan olaraq, interaktiv xidmətlər yalnız LocalSystem təhlükəsizlik kontekstində işləyə bilər. Bu, Windows NT-də monitor ekranında, məsələn, "Masaüstü" kimi bir obyektin olduğu, LocalSystem-dən başqa ixtiyari hesabla işləmək üçün müvafiq giriş hüquqlarına malik olmanız lazım olan xüsusiyyətləri ilə bağlıdır. olmaya bilər. Əksər hallarda bu məhdudiyyətin əhəmiyyətli olmamasına baxmayaraq, bəzən monitor ekranında məlumatları əks etdirən və eyni zamanda LocalSystem-dən başqa təhlükəsizlik kontekstində yerinə yetiriləcək bir xidmət yaratmağa ehtiyac var. məsələn, uzaq kompüterdə tətbiqləri işə salmaq üçün proqram server komponenti.

-dan kod parçası. bu ehtimalı nümayiş etdirir.

Bu fraqmentdə, tətbiqin müştəri tərəfi tərəfindən RPC nəticəsi olaraq göndərilən sorğuya cavab olaraq, xidmət monitor ekranında mətn mesajı göstərir.

Nümunə Xidmət (Açar Parçalar)

Windows NT xidmətini həyata keçirən C++ dilində proqramın əsas fraqmentlərinin nümunəsinə baxaq. Aydınlıq üçün kodun vacib olmayan hissələri buraxılmışdır.

əsas funksiyası

Əsas funksiya kodu B-də göstərilmişdir.

ServiceMain funksiyası

ServiceMain-də olan kodun bir xüsusiyyəti ondan ibarətdir ki, müəyyən bir əməliyyatın icra müddətini əvvəlcədən proqnozlaşdırmaq çox vaxt mümkün deyil, xüsusən də onun icrasının preemptive multitasking ilə bir əməliyyat sistemində baş verdiyini nəzərə alsaq. Əgər əməliyyat SetServiceStatus çağırış parametrində göstərilən vaxt intervalından çox vaxt apararsa, xidmət növbəti bildirişi vaxtında göndərə bilməyəcək və bu, SCM-nin fəaliyyətini dayandırmasına səbəb olacaq. Potensial əməliyyatlara misal olaraq böyük fasilələrlə şəbəkə funksiyalarına zənglər və ya yavaş mühitdən böyük miqdarda məlumatın eyni vaxtda oxunması daxildir. Bundan əlavə, bu yanaşma bir xidməti sazlayarkən tamamilə tətbiq olunmur, çünki proqramın sazlayıcıda icrası tərtibatçı üçün zəruri olan uzun fasilələrlə müşayiət olunur.

Bu problemi aradan qaldırmaq üçün, SCM ilə qarşılıqlı əlaqədə olan bütün əməliyyatlar başlanğıc mərhələsində baş verən hərəkətlərdən asılı olmayaraq, ayrıca bir ipdə yerinə yetirilməlidir.

B köməkçi ipdən istifadə edərək xidmətin düzgün başlaması üçün alqoritmi göstərir.

İşləyici funksiyası

B Handler funksiyası və köməkçi iplər üçün kodu göstərir. "Stop" və "Bağlantı" sorğuları üçün, xidmətin işə salınması zamanı istifadə edilənə bənzər xidməti düzgün dayandırmaq üçün alqoritm istifadə olunur, yeganə fərq SERVICE_START_PENDING parametrinin əvəzinə SERVICE_STOP_PENDING parametrinin SetserviceStatus-a ötürülməsi və bunun əvəzinə SERVICE_RUNNING - SERVICE_STOPPED.

İdeal olaraq, "Pause" və "Davam et" sorğuları da bu yanaşmadan istifadə etməlidir. Maraqlı oxucu bu nümunələrə əsaslanaraq onu asanlıqla həyata keçirə bilər.

Nəticə

Sonda qeyd etmək istərdik ki, Windows NT 2000-ə keçidlə xidmətlərin inkişafı dəyişməyib. Xidmətlər Windows platformasında proqram təminatının mühüm hissəsi olmaqda davam edir və tərtibatçılara geniş seçim imkanı verir.


// MessageBox Win32 API int ServerMessageBox-a bənzər funksiya(RPC_BINDING_HANDLE h, LPSTR lpszText, LPSTR lpszTitle, UINT fuStyle) ( DWORD dwThreadId; HWINSTA hwinstaSave; HDESK hdeskUESK; yadda saxla. hdeskUESK; hdeskUdesk; cari obyektlər " Pəncərə stansiya " və "Desktop". GetDesktopWindow(); hwinstaSave = GetProcessWindowStation(); dwThreadId = GetCurrentThreadId(); hdeskSave = GetThreadDesktop(dwThreadId); // Təhlükəsizlik kontekstini çağıran RPC müştərisində // və // ilə dəyişdirin. user // "Window station" və "Desktop" obyektlərinə giriş əldə edin hwinstaUser = OpenWindowStation("WinSta0", FALSE, MAXIMUM_ALLOWED if (hwinstaUser == NULL) ( RpcRevertToSelf(); return 0; SetProcessWindowStation( hwinstaUser = OpenDesktop("Default", 0, FALSE, MAXIMUM_ALLOWED (hdeskUser == NULL) ( SetProcessWindowStation(hwinstaSave); returnwin); ) SetThreadDesktop(hdeskUser); // Adi mətn pəncərəsini göstərin. nəticə = MessageBox(NULL, lpszText, lpszTitle, fuStyle); // Saxlanılan obyektləri bərpa edin // "Pəncərə stansiyası" və "Masaüstü". SetThreadDesktop(hdeskSave); SetProcessWindowStation(hwinstaSave); Masaüstünü bağlayın(hdeskUser); CloseWindowStation(hwinstaUser); nəticəni qaytarmaq; ) void main() ( SERVICE_TABLE_ENTRY steTable = ( (SERVICENAME, ServiceMain), (NULL, NULL) ); // SCM ilə əlaqə qurun. Bu funksiya daxilində // sorğular qəbul edilir və göndərilir. StartServiceCtrlDispatcher(steTable); ) void WINAPI ServiceMain (DWORD dwArgc, LPSTR *psArgv) ( // Sorğu işləyicisini dərhal qeydiyyatdan keçirin. hSS = RegisterServiceCtrlHandler(SERVICENAME, ServiceHandler); sStatus.dwCheckPoint = 0; sStatus.dwControlsAccepted = SERVICE_ACPTUET 0 sStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; sStatus.dwWaitHint = 0; sStatus.dwWin32ExitCode = NOERROR; // Xidməti işə salmaq üçün InitService() funksiyası çağırılır hər // saniyə , xidmət işə salınma prosesindədir. // İş parçasını sinxronlaşdırmaq üçün hadisə yaradılır, // bunun üçün bir hadisə yaradılır. hSendStartPending = CreateEvent(NULL, TRUE, FALSE, NULL); hSendStartThread ələ keçirin; DWORD dwThreadId; hSendStartThread = CreateThread(NULL, 0, SendStartPending, NULL, 0, &dwThreadId); //Bütün xidmətin işə salınması burada edilir. InitService(); SetEvent(hSendStartPending); if(WaitForSingleObject(hSendStartThread, 2000) != WAIT_OBJECT_0) ( TerminateThread(hSendStartThread, 0); ) CloseHandle(hSendStartPending); CloseHandle(hSendStartThread); hWork = CreateEvent(NULL, TRUE, FALSE, NULL); hServiceThread = CreateThread(NULL, 0, ServiceFunc, 0, 0, &dwThreadId); sStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hSS, &sStatus); ) // SCM-ə bildirişlər göndərən mövzu funksiyası // başlatma prosesinin davam etdiyi barədə hər saniyə. // funksiyası hSendStartPending // hadisəsi təyin edildikdə bitir. DWORD WINAPI SendStartPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_START_PENDING; sStatus.dwWaitHint = 2000; // 1 saniyə üçün "Yuxu". Əgər 1 saniyədən sonra hadisə bitməmişsə //P vəziyyəti (xidmətin işə salınması // bitmədi), növbəti bildirişi göndərin, // maksimum vaxt intervalını // 2 saniyəyə təyin edin, beləliklə, növbəti bildirişin (doğru) olacağı vaxta qədər vaxt boşluğu var. SetServiceStatus(hSS, &sStatus .dwCheckPoint++); Məlumatların oxunması, // yaddaşın ayrılması və s. void InitService() ( ... ) // Xidmət kodunu ehtiva edən funksiya. DWORD WINAPI ServiceFunc(LPVOID) ( isə (doğru) (əgər (!bPause) ( // Bu, adətən // bir növ siklik əməliyyatları yerinə yetirən kodu ehtiva edir... ) əgər (WaitForSingleObject(hWork, 1000))!=WAIT_TIMEOUT ) break; ) return 0; ) // SCM void WINAPI ServiceHandler (DWORD dwCode) ( keçid (dwCode) ( case SERVICE_CONTROL_SHUTDOWN: ReportStatusToSCMgr(SERVICE_STOPERP,h)SERVICE_STOPS00); bitmə = Hadisə Yaradın (NULL, TRUE, FALSE, NULL hSendStopThread = CreateThread(NULL, 0, SendStopPending, NULL, 0, & dwThreadId if (WaitForSingleObject(hServiceThread, 1000) !=T0TThre(WAIT_OBSt)); ) SetEvent(hSendStopPending) ; CloseHandle(hServiceThread); fasilə; DWORD WINAPI SendStopPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_STOP_PENDING; sStatus.dwWaitHint = 2000; isə (doğru) (SetServiceStatus (Status.W, Status.W) üçün; ingleObject) (hSendStopPending, 1000 ) =WAIT_TIMEOUT) fasilə sStatus.dwCheckPoint = 0;