İnternet. Bilgisayar. Yardım. Tavsiye. Tamirat

Hangi Windows hizmetlerine ihtiyaç vardır ve hangileri devre dışı bırakılabilir? Bir uygulama Windows hizmeti olarak nasıl çalıştırılır Hizmetler Windows'ta hangi kullanıcı altında çalışır?

Bir uygulamayı Windows hizmeti olarak çalıştırma

Bir istemci uygulamasını hizmet olarak çalıştırmak mümkün mü? Bunlardan birinde standart işletim sistemi araçlarını kullanarak Windows hizmeti oluşturmanın yollarını anlattım. Ancak her konsol uygulaması hizmet olarak çalışamaz ve grafik arayüze sahip programlar prensip olarak bu şekilde çalışamaz. Ancak uygulamayı hizmet olarak çalıştırmak yine de mümkündür ve orijinal adı taşıyan bir program bu konuda bize yardımcı olacaktır. Emmeyen Servis Yöneticisi.

NSSM ücretsiz ve açık kaynaklı bir yazılımdır ve Windows 2000'den Windows 8'e kadar tüm Microsoft işletim sistemlerini destekler. NSSM kurulum gerektirmez, yalnızca indirip sıkıştırmasını açmanız yeterlidir. Dağıtım, 32 ve 64 bit işletim sistemlerine yönelik sürümleri içerir. Programı nssm.cc sitesinden edinebilirsiniz, şu an için son stabil sürüm 2.21.1, onu kullanacağım.

NSSM'nin yeteneklerini göstermek için Windows Not Defteri'ni Windows 8.1'de bir hizmet olarak çalıştırmayı deneyelim.

Hizmet Oluşturma

Adlı bir hizmet oluşturmak için not defteri komut konsolunu başlatın, paketlenmemiş NSSM'nin (64 bit Windows için) bulunduğu klasöre gidin ve NSSM grafik yükleyici penceresini açan nssm install notepad komutunu girin. Bir hizmet oluşturmak için Yol alanında yürütülebilir dosyanın yolunu belirtmeniz ve "Hizmeti yükle" düğmesini tıklamanız yeterlidir. Ayrıca Seçenekler alanında hizmeti başlatmak için gereken tuşları belirleyebilirsiniz.

Yeni bir hizmet oluştururken bazı ek parametreleri de belirtebilirsiniz.

Kapatma sekmesi, uygulama normal şekilde kapatıldığında veya çöktüğünde kullanılan kapatma yöntemlerini ve zaman aşımlarını listeler. NSSM bir durdurma komutu aldığında (örneğin bir uygulama kapatıldığında), kontrol edilen uygulamayı normal bir şekilde durdurmaya çalışır. Uygulama yanıt vermezse NSSM, bu uygulamanın tüm süreçlerini ve alt süreçlerini zorla sonlandırabilir.

Uygulamayı kapatmanın dört adımı vardır ve bunlar varsayılan olarak bu sırayla kullanılacaktır:

İlk aşamada NSSM bir olay oluşturup göndermeye çalışır. Ctrl+C. Bu yöntem, konsol uygulamaları veya komut dosyaları için iyi çalışır ancak grafiksel uygulamalar için geçerli değildir;
NSSM daha sonra uygulama tarafından oluşturulan tüm pencereleri algılar ve onlara bir WM_CLOSE mesajı göndererek uygulamanın kapanmasına neden olur;
Üçüncü adım, NSSM'nin uygulama tarafından oluşturulan tüm iş parçacıklarını hesaplaması ve onlara, uygulamanın bir iş parçacığı mesaj kuyruğuna sahip olması durumunda alınacak olan bir WM_QUIT mesajı göndermesidir;
Son çare olarak NSSM, TerminateProcess() yöntemini çağırarak uygulamayı sonlandırmaya zorlayabilir.

Yöntemlerden bazılarını veya hatta tümünü devre dışı bırakmak mümkündür, ancak farklı uygulamalar için farklı yöntemler işe yarar ve uygulamanın doğru şekilde kapatıldığından emin olmak için her şeyin olduğu gibi bırakılması önerilir.

Varsayılan olarak, bir hizmet çöktüğünde NSSM onu yeniden başlatmaya çalışır. "Eylemlerden çık" sekmesinde, uygulama anormal şekilde sonlandırıldığında otomatik eylemi değiştirebilir, ayrıca uygulama otomatik olarak yeniden başlatılmadan önce bir gecikme ayarlayabilirsiniz.

“Giriş/Çıkış (G/Ç)” sekmesinde, uygulama girişi/çıkışının belirli bir dosyaya yeniden yönlendirilmesini ayarlayabilirsiniz.

"Ortam" sekmesinde hizmet için yeni ortam değişkenleri ayarlayabilir veya mevcut olanları geçersiz kılabilirsiniz.

Ayrıca grafik kabuğunu kullanamaz ve aşağıdaki komutla konsolda hemen bir hizmet oluşturamazsınız:

nssm not defterini yükleyin ″C:\Windows\system32\notepad.exe″

Servis Yönetimi

NSSM kullanarak hizmeti oluşturduktan sonra Hizmetler ek bileşenine gidin ve not defteri hizmetini bulun. Gördüğünüz gibi görünüş olarak diğer hizmetlerden hiçbir farkı yok; başlatabiliyor, durdurabiliyor veya başlatma modunu değiştirebiliyoruz. Ancak, yürütülebilir dosya olarak nssm.exe'nin listelendiğini unutmayın.

Ve Görev Yöneticisine gittiğimizde şu resmi göreceğiz: NSSM ana (ana) süreç olarak çalışıyor, not defteri servisi onun alt süreci olarak çalışıyor ve Notepad uygulaması da bu alt süreçte zaten çalışıyor.

Bir hizmeti kaldırma

Bir hizmeti kaldırmak için nssm not defterini kaldır komutunu girin ve kaldırılmasını onaylayın. Ve nssm kaldır not defterini onayla komutunu girerek onay almadan yapabilirsiniz.

Etkileşimli olarak bir hizmet başlatın

Bir kullanıcı uygulaması ile bir hizmet arasındaki temel fark, bir kez başlatıldığında uygulamanın çalışmaya devam etmek için bir düğmeye basmak veya bir komut girmek gibi ek kullanıcı eylemleri gerektirebilmesidir. Bunu yapmak için, ona erişmeniz gerekiyor, ki bunun yapılması o kadar kolay değil.

Bir hizmeti etkileşimli modda başlatmak için, Hizmetler ek bileşeninde özelliklerini açmanız ve "Oturum Açma" sekmesinde "Masaüstüyle etkileşime izin ver" onay kutusunu işaretlemeniz gerekir.

Ve sonra mucizeler başlıyor :) Etkileşimli modda başlatılan bir hizmet, yalıtılmış bir oturumda (oturum 0) açılıyor. Bu oturuma yalnızca bilgisayardaki etkileşimli hizmetlerin başlatılmasını izleyen ve bir uyarı veren Etkileşimli Hizmetler Algılama Hizmeti (ui0detect) kullanılarak erişilebilir. Windows 7\Server 2008'de bu hizmet varsayılan olarak etkindir, ancak Windows 8\Server 2012'de devre dışıdır ve Hizmetler grafik ek bileşeninde görünmez (en azından orada bulamadım). Üstelik bu gizemli hizmeti bulup başlatmayı denerseniz bir hata mesajı alırsınız.

Ancak gerçek şu ki, onu çalıştırmak için bilgisayarınızda etkileşimli hizmetlerin çalışmasına izin vermelisiniz. Bu nedenle, kayıt defteri düzenleyicisini açın, HKLM\System\CurrentControlSet\Control\Windows bölümünde adlı DWORD tipi parametreyi bulun. EtkileşimliHizmet Yok ve değerini şu şekilde ayarlayın: 0 .

Ardından PowerShell konsolunu açın ve bulma hizmetini şu komutla başlatın:

Başlat-Hizmet -Ad ui0detect

Tespit servisinin çalıştığından emin olduktan sonra notepad servisini yeniden başlatıyoruz ve bu pencereyi alıyoruz. “Mesajı görüntüle”yi seçin

ve kendimizi uygulamamızın çalıştığı boş oturumda buluyoruz. Daha sonra onunla gerekli işlemleri yapıp geri dönüyoruz.

Bu, uygulamaları Windows hizmetleri olarak çalıştırmak için ilginç bir çözümdür. En güzeli değil ama ismiyle oldukça tutarlı :)

Hizmetlerin çalışmasını özel bir Windows yöneticisinde yapılandırabilirsiniz. Açmak için Windows + R tuş kombinasyonunu kullanın, beliren satıra services.msc yazın ve Enter tuşuna basın. Aynı veya benzer pencereyi göreceksiniz (eski işletim sistemi sürümlerinden birine sahipseniz):

Yönetici hizmetleri tablo biçiminde görüntüler. Burada mevcut hizmetlerin listesini görüntüleyebilir, kısa açıklamalarını okuyabilir ve mevcut durumlarını öğrenebilirsiniz. Özellikle önemli olan “Başlangıç ​​Türü” sütunudur. Belirli bir hizmetin etkin olup olmadığını ve sistem tarafından hangi modda başlatıldığını gösteren kişidir.

Hizmetlerden birine çift tıkladığınızda, onu devre dışı bırakabileceğiniz bir pencere açılacaktır. Sadece “Başlangıç ​​Türü” öğesini açın, “Devre Dışı” seçeneğini seçin ve “Tamam”a tıklayın. Ancak diğer başlatma seçeneklerinin yanı sıra "Manuel" değeri de vardır. Güvenlik nedeniyle, devre dışı bırakmak istediğiniz tüm hizmetler için bunu seçin. Bu, sistemin gerçekten ihtiyaç duyulduğunda hizmetleri başlatmasına ve geri kalan zamanda bunlarla zaman kaybetmemesine olanak tanıyacaktır.

Hizmetleri tamamen devre dışı bırakmayın, yalnızca manuel moda geçirin.

Aşağıda listelenen hizmetler sistemin çalışması için kritik değildir ve birçok kullanıcı onlarsız da yapabilir. Bu nedenle bu servisleri manuel moda ayarlayabilirsiniz. Sizin için önemli olan hizmetleri kesintiye uğratmamak için değişiklik yapmadan önce özeti okuduğunuzdan emin olun.

Listemizdeki bazı hizmetler bilgisayarınızda zaten tamamen devre dışı bırakılmış olabilir veya başlangıçta manuel modda çalışıyor olabilir. Bu durumda onları atlayın.

Hizmetlerin yapılandırılması sürecinde yanlış eylemler sistemin yanlış çalışmasına neden olabilir. Değişiklik yaparak sorumluluğu üstlenirsiniz.

Değişikliklerin etkili olması için yapılandırmadan sonra bilgisayarınızı yeniden başlattığınızdan emin olun.

Manuel moda geçirilebilen Windows hizmetleri

Bu listedeki bazı hizmetlerin Rusça adları, bilgisayarınızda gördüğünüz adlardan farklı olabilir. Ancak bu yalnızca ifadeler için geçerlidir. İhtiyacınız olan hizmeti tam adıyla bulamıyorsanız, anlam bakımından benzer olan seçenekleri arayın.

Windows 10

  • Bağlı kullanıcılar ve telemetri için işlevsellik (Bağlantılı Kullanıcı Deneyimleri ve Telemetri).
  • Teşhis Takip Hizmeti.
  • dmwappushsvc.dll
  • İndirilen Haritalar Yöneticisi - Haritalar uygulamasını kullanmıyorsanız.
  • Klavye ve El Yazısı Paneli Hizmeti'ne dokunun.
  • Windows Defender Hizmeti.

Windows 8/8.1

  • Teşhis Politikası Hizmeti.
  • Dağıtılmış Bağlantı İzleme İstemcisi - bilgisayar herhangi bir ağa bağlı değilse.
  • IP Yardımcısı - IPv6 bağlantısı kullanmıyorsanız.
  • Program Uyumluluk Asistanı Hizmeti.
  • Yazdırma Biriktiricisi - yazıcınız yoksa.
  • Uzak Kayıt Defteri - bu hizmet tamamen devre dışı bırakılabilir.
  • İkincil oturum açma.
  • Güvenlik Merkezi.
  • TCP/IP üzerinden NetBIOS destek modülü (TCP/IP NetBIOS Yardımcısı).
  • Windows Hata Raporlama Hizmeti.
  • Windows Görüntü Alma (WIA) - tarayıcınız yoksa.
  • Windows Arama - Windows Arama'yı kullanmıyorsanız.

Windows 7

  • Bilgisayar Tarayıcısı - bilgisayar herhangi bir ağa bağlı değilse.
  • Teşhis Politikası Hizmeti.
  • Dağıtılmış Bağlantı İzleme İstemcisi - bilgisayar herhangi bir ağa bağlı değilse.
  • IP Yardımcısı - IPv6 bağlantısı kullanmıyorsanız.
  • Çevrimdışı Dosyalar.
  • Taşınabilir Cihaz Numaralandırma Hizmeti.
  • Yazdırma Biriktiricisi - yazıcınız yoksa.
  • Korumalı Depolama.
  • Uzak Kayıt Defteri - bu hizmet tamamen devre dışı bırakılabilir.
  • İkincil oturum açma.
  • Güvenlik Merkezi.
  • Sunucu - bilgisayar sunucu olarak kullanılmıyorsa.
  • TCP/IP üzerinden NetBIOS destek modülü (TCP/IP NetBIOS Yardımcısı).
  • Windows Hata Raporlama Hizmeti.
  • Windows Arama - Windows Arama'yı kullanmıyorsanız.

Windows Vista

  • Bilgisayar Tarayıcısı - bilgisayar herhangi bir ağa bağlı değilse.
  • Masaüstü Pencere Yöneticisi Oturum Yöneticisi - Aero temasını kullanmıyorsanız.
  • Teşhis Politikası Hizmeti.
  • Dağıtılmış Bağlantı İzleme İstemcisi - bilgisayar herhangi bir ağa bağlı değilse.
  • Çevrimdışı Dosyalar.
  • Taşınabilir Cihaz Numaralandırma Hizmeti.
  • Yazdırma Biriktiricisi - yazıcınız yoksa.
  • ReadyBoost.
  • Uzak Kayıt Defteri - bu hizmet tamamen devre dışı bırakılabilir.
  • İkincil oturum açma.
  • Güvenlik Merkezi.
  • Sunucu - bilgisayar sunucu olarak kullanılmıyorsa.
  • Tablet PC Giriş Hizmeti.
  • TCP/IP üzerinden NetBIOS destek modülü (TCP/IP NetBIOS Yardımcısı).
  • Temalar - klasik Windows temasını kullanıyorsanız.
  • Windows Hata Raporlama Hizmeti.
  • Windows Media Center Hizmet Başlatıcısı.
  • Windows Arama - Windows Arama'yı kullanmıyorsanız.

Windows XP

  • Uyarıcı.
  • Bilgisayar Tarayıcısı - bilgisayar herhangi bir ağa bağlı değilse.
  • Dağıtılmış Bağlantı İzleme İstemcisi - bilgisayar herhangi bir ağa bağlı değilse.
  • Dizin Oluşturma Hizmeti - Windows Arama'yı kullanmıyorsanız.
  • İnternet Güvenlik Duvarı (ICF) / İnternet Bağlantı Paylaşımı (ICS).
  • Mesajlaşma hizmeti.
  • Uzak Kayıt Defteri - bu hizmet tamamen devre dışı bırakılabilir.
  • İkincil oturum açma.
  • Sunucu - bilgisayar sunucu olarak kullanılmıyorsa.
  • Sistem Geri Yükleme hizmeti.
  • TCP/IP üzerinden NetBIOS destek modülü (TCP/IP NetBIOS Yardımcısı).
  • Kesintisiz güç kaynağı.
  • Yükleme Yöneticisi.
  • Kablosuz yapılandırma (Kablosuz Sıfır Yapılandırma).

Son güncelleme: 31.10.2015

Windows işletim sisteminin en önemli bileşenlerinden biri hizmetlerdir. Aslında bunlar grafik arayüzü olmayan ve arka planda çeşitli görevleri yerine getiren ayrı uygulamalardır. Hizmetler, işletim sistemi başlatıldığında veya kullanıcının çalıştığı herhangi bir zamanda başlatılabilir. Hizmetlerin yaygın bir örneği, bağlantılar için arka planda belirli bir bağlantı noktasını dinleyen ve bağlantılar varsa onlarla etkileşime giren çeşitli web sunucularıdır. Uygulamanın yeni bir sürümünün olup olmadığını öğrenmek için sunucuyla iletişim kuran diğer yüklü programlar için çeşitli yardımcı güncelleme hizmetleri de olabilir. Genel olarak, hizmetler panelini açabilir ve kurulu ve çalışan tüm hizmetleri kendimiz görebiliriz:

C#'ta kendi hizmetlerinizi nasıl oluşturacağınıza bakalım. Uygulanacak görev olarak dosya sistemindeki belirli bir klasördeki değişiklikleri izlemeyi seçeceğiz. Şimdi bunu çalıştıracak bir servis oluşturalım.

Öncelikle Windows Service türünde olacak yeni bir proje oluşturalım. Projeyi FileWatcherService olarak adlandıralım:

Visual Studio daha sonra ihtiyacınız olan her şeye sahip bir proje oluşturur. Bu tür bir projeyi seçmemize gerek olmasa da, bir sınıf kütüphanesi projesi oluşturabilir ve daha sonra bu projedeki gerekli tüm sınıfları tanımlayabiliriz.

Yani yeni proje şöyle görünüyor:

Ayrıca Program.cs dosyası ve Service1.cs gerçek hizmet düğümü de vardır.

Hizmet normal bir uygulamayı temsil eder ancak kendi kendine başlamaz. Tüm aramalar ve ona erişim, servis kontrol yöneticisinden (Servis Kontrol Yöneticisi veya SCM) geçer. Bir hizmet, sistem başlangıcında otomatik olarak veya manuel olarak başlatıldığında, SCM, Program sınıfındaki Main yöntemini çağırır:

Statik sınıf Program ( static void Main() ( ServiceBase ServicesToRun; ServicesToRun = new ServiceBase ( new Service1() ); ServiceBase.Run(ServicesToRun); ) )

Main yöntemi, varsayılan olarak ServicesToRun dizisinde tanımlanan birden çok hizmeti aynı anda çalıştıracak şekilde tanımlanır. Ancak, varsayılan olarak proje yalnızca bir hizmet içerir: Hizmet1. Başlatmanın kendisi Çalıştır yöntemi kullanılarak gerçekleştirilir: ServiceBase.Run(ServicesToRun) .

Başlatılmakta olan hizmet, Service1.cs düğümü tarafından temsil edilir. Ancak bu aslında basit bir kod dosyası değil. Bu node’u açarsak Service1.Designer.cs servis tasarım dosyasını ve Service1 sınıfını göreceğiz.

Service1 sınıfı aslında hizmeti temsil eder. Varsayılan olarak aşağıdaki koda sahiptir:

Sistemin Kullanımı; System.Collections.Generic'i kullanarak; System.ComponentModel'i kullanarak; System.Data'yı kullanarak; System.Diagnostics'i kullanarak; System.Linq'i kullanarak; System.ServiceProcess'i kullanarak; System.Text'i kullanarak; System.Threading.Tasks'ı kullanma; ad alanı FileWatcherService ( genel kısmi sınıf Service1: ServiceBase ( public Service1() (InitializeComponent(); ) korumalı geçersiz kılma void OnStart(string args) ( ) korumalı geçersiz kılma void OnStop() ( ) ))

Hizmet sınıfı, ServiceBase temel sınıfından miras almalıdır. Bu sınıf bir dizi yöntemi tanımlar; bunların en önemlileri hizmet tarafından gerçekleştirilen eylemleri başlatan OnStart() yöntemi ve hizmeti durduran OnStop() yöntemidir.

SCM, Main yöntemini çağırıp hizmeti kaydettikten sonra doğrudan OnStart yöntemi çalıştırılarak çağrılır.

Hizmetler konsolundan veya komut satırından bir hizmeti durdurmak için bir komut gönderdiğimizde SCM, hizmeti durdurmak için OnStop yöntemini çağırır.

Hizmet sınıfındaki bu iki yönteme ek olarak, ServiceBase temel sınıfının birkaç yöntemini daha geçersiz kılabilirsiniz:

    OnPause: Hizmet duraklatıldığında çağrılır

    OnContinue: Bir hizmet askıya alındıktan sonra devam ettirildiğinde çağrılır

    OnShutdown: Windows kapatıldığında çağrılır

    OnPowerEvent: Güç modu değiştiğinde çağrılır

    OnCustomCommand: Bir hizmet, Hizmet Kontrol Yöneticisinden (SCM) özel bir komut aldığında çağrılır

Service1 sınıfının yapıcısında, Service1.Designer.cs tasarım dosyasında tanımlanan InitializeComponent() yöntemi çağrılır:

Ad alanı FileWatcherService ( kısmi sınıf Service1 ( özel System.ComponentModel.IContainer bileşenleri = null; korumalı geçersiz kılma void Dispose(bool disposing) ( if (disposing && (components != null)) ( Components.Dispose(); ) base.Dispose(disposing) ); ) özel voidInitializeComponent() (bileşenler = yeni System.ComponentModel.Container(); this.ServiceName = "Service1"; )) )

Burada dikkat edilmesi gereken tek şey servis adının (ServiceName özelliği) ayarlanmasıdır:

This.ServiceName = "Hizmet1";

Bu, bu hizmeti yükledikten sonra hizmetler konsolunda görüntülenecek addır. Değiştirebiliriz ya da olduğu gibi bırakabiliriz.

Şimdi servis kodunu şu şekilde değiştirelim:

Sistemin Kullanımı; System.ServiceProcess'i kullanarak; System.IO kullanarak; System.Threading'i kullanarak; ad alanı FileWatcherService ( genel kısmi sınıf Service1: ServiceBase ( Logger logger; public Service1() ( InitializeComponent(); this.CanStop = true; this.CanPauseAndContinue = true; this.AutoLog = true; ) korumalı geçersiz kılma void OnStart(string args) ( logger = new Logger(); loggerThread = new Thread(new ThreadStart(logger.Start)); korumalı geçersiz kılma void OnStop() ( logger.Stop(); Thread.Sleep(1000); ) ) class Logger ( FileSystemWatcher watcher; object obj = new object(); bool etkin = true; public Logger() ( watcher = new FileSystemWatcher("D:\\Temp"); watcher.Deleted += Watcher_Deleted; watcher.Created + = Watcher_Created; watcher.Changed += Watcher.Renamed += Watcher_Renamed; ) public void Start() ( watcher.EnableRaisingEvents = true; while(enabled) ( Thread.Sleep(1000); ) ) public void Stop() ( watcher.EnableRaisingEvents = false; etkin = false; ) // dosyaların yeniden adlandırılması özel void Watcher_Renamed(nesne gönderen, RenamedEventArgs e) ( string fileEvent = "yeniden adlandırıldı " + e.FullPath; string dosyaPath = e.OldFullPath; RecordEntry(fileEvent, filePath); ) // dosyaları değiştirme özel void Watcher_Changed(object sender, FileSystemEventArgs e) ( string fileEvent = "değişti"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // dosyalar oluşturma özel void Watcher_Created(object sender, FileSystemEventArgs) e) ( string fileEvent = "oluşturuldu"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // dosyalar siliniyor özel void Watcher_Deleted(nesne gönderen, FileSystemEventArgs e) ( string fileEvent = "silindi"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); özel void RecordEntry(string fileEvent, string filePath) ( lock (obj) ( kullanma (StreamWriterwriter = new StreamWriter("D:\\templog.txt", true)) ( yazar .WriteLine(String.Format("(0) dosya (1), (2) idi", DateTime.Now.ToString("dd/MM/yyyy ss:dd:ss"), filePath, fileEvent)); )) )) ))

Tüm işlevleri kapsayan anahtar sınıf Logger sınıfıdır. FileSystemWatcher nesnesini kullanarak klasördeki değişiklikleri izleyecektir. D://Sıcaklık. Start() yöntemi, FileSystemWatcher nesnesi aracılığıyla değişiklikleri izleyeceğimizi belirtir. Ve etkin boolean değişkeni true olduğu sürece tüm çalışmalar devam edecektir. Ve Stop() yöntemi sınıfın sonlandırılmasına izin verecektir.

FileSystemWatcher olayları, izlenen bir klasördeki tüm değişiklikleri izlemenize olanak tanır. Bu, templog.txt dosyasındaki değişiklikleri kaydedecektir. Değişikliklerin kaydedildiği templog.txt dosyası için kaynak yarışını önlemek amacıyla, kayıt prosedürü kilit(obj) saplaması tarafından engellenir.

Sonuç olarak, oluşturduktan, değiştirdikten, yeniden adlandırdıktan ve sildikten sonra günlük dosyası şunun gibi bir şey içerecektir:

30.07.2015 12:15:40 D:\Temp\Yeni metin belgesi.txt dosyası oluşturuldu 30.07.2015 12:15:46 D:\Temp\Yeni metin belgesi.txt dosyası D:\ olarak yeniden adlandırıldı Temp\hello.txt 30.07.2015 12:15:55 D:\Temp\hello.txt dosyası 30.07.2015 12:15:55 D:\Temp\hello.txt dosyası 30.07'de değiştirildi /2015 12:16:01 D: \Temp\hello.txt dosyası silindi

Service1 hizmet sınıfının kendisinde, yapıcıda bir dizi seçenek ayarlanır:

This.CanStop = true; // servis bu şekilde durdurulabilir.CanPauseAndContinue = true; // hizmet durdurulup daha sonra devam ettirilebilir. AutoLog = true; // servis günlüğe yazabilir

OnStart() yönteminde, Logger nesnesini başlatmak için yeni bir iş parçacığı çağrılır:

Korumalı geçersiz kılma void OnStart(string args) ( logger = new Logger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); )

Yeni iş parçacığı gereklidir çünkü geçerli iş parçacığı yalnızca SCM komutlarını işler ve OnStart yönteminden mümkün olan en kısa sürede geri dönmesi gerekir.

Hizmeti durdurmak için SCM'den bir komut alındığında, logger.Stop() yöntemini çağıran OnStop yöntemi tetiklenir. Ek gecikme, günlükçü iş parçacığının durmasına olanak tanır:

Korumalı geçersiz kılma void OnStop() ( logger.Stop(); Thread.Sleep(1000); )

Ancak hizmet sınıfının kendisi yeterli değildir. Ayrıca bir hizmet yükleyicisi oluşturmamız gerekiyor.

Yazılım uyumluluğu açısından. Dolayısıyla hizmetleri Windows 7 bağlamında tartışmaya geri dönmemiz çok doğal. Ancak bu sefer Windows 7'de mevcut olan hizmetleri optimize etmenin bazı yararlarından bahsedeceğiz. Bu makale Windows 7'deki yeni bir özellik hakkındadır - Başlatma Hizmetlerini Tetikleyin. Ancak API'ye bakmadan önce hizmetlerin büyük resmine bir göz atalım.

Hizmetler nelerdir?

Hizmet, Windows işletim sisteminde yerleşik bir iç mekanizmadır. Hizmetleri, mevcut kullanıcı bağlamından bağımsız olarak çalışan özel uygulamalar olarak düşünebilirsiniz. Hizmetler, sistemin açıldığı (önyüklendiği) andan kapanana kadar kullanıcının varlığına gerek kalmadan çalışacak şekilde yapılandırılabilmesi açısından normal uygulamalardan farklıdır. Yani, kullanıcı oturum açmamış olsa bile hizmetler çalışabilir.

Hizmetleri, arka planda çalışan ve kullanıcı işlemlerini etkilemeyen görevlerin yürütülmesi olarak düşünmeyi tercih ediyoruz. Windows'taki hizmetler, Uzaktan Yordam Çağrısı (RPC), Yazıcı Biriktiricisi ve Ağ Konumu Farkındalığına kadar her türlü arka plan etkinliğinden sorumludur.

Yıllar geçtikçe Windows büyüdü ve hizmetlerin sayısı da arttı. Dürüst olalım, Windows'taki arka plan hizmetleri biraz zahmetlidir; işletim sistemi, kutudan çıktığı gibi pek çok hizmetle birlikte gelir. Ayrıca bağımsız yazılım geliştiricileri (ISV'ler) ve uygulamaları daha da fazla hizmet ekliyor. Örneğin yazılım güncelleme hizmetleri. Bununla birlikte, bazı hizmetler kritik öneme sahiptir ve önyükleme işlemi sırasında gereklidir; diğerlerine ise daha sonra belirli bir kullanıcı oturum açtığında ihtiyaç duyulur ve diğerlerinin çağrılana kadar başlatılması gerekmez. Buna rağmen halihazırda çalışan servislerin listesine baktığınızda 7x24 çalışması gerekmeyen birçok nesne görüyorsunuz.

Haftanın 7 günü, günün 24 saati çalışan hizmetlerin nesi var?

7x24 hizmetlerle ilgili çeşitli sorunlar vardır. Öncelikle, eğer ihtiyaç duyulmuyorsa neden bir şey (arka planda bile) çalışıyor olsun ki? Çalışan herhangi bir işlem (hizmetler dahil), diğer uygulamalar ve hizmetler için kullanılabilecek değerli bellek ve CPU kaynaklarını kullanır. Belirli bir anda çalışan tüm hizmetleri sayarsanız, bunların önemli miktarda bellek, tanıtıcı, iş parçacığı ve CPU kullanımı oluşturduğunu görürsünüz. Tüm bu "boşa harcanan" kaynaklar bilgisayarın genel performansını düşürür, yanıt verme hızını azaltır ve bilgisayarın yavaş ve yavaş görünmesine neden olur. Ayrıca birçok hizmet otomatik olarak başlayacak (sistem başlatıldığında çalışmaya başlayacak) şekilde yapılandırıldığından bilgisayarın önyükleme süresini etkiler.

İkincisi, israf edilen bu kaynakların enerji tüketimi üzerinde doğrudan etkisi vardır. CPU üzerindeki yük ne kadar büyük olursa, bilgisayar o kadar fazla güç tüketir. Bu, dizüstü bilgisayarlarda kritik olabilir ve pil ömrünü birkaç saat azaltabilir.

Üçüncüsü, verimsiz yazılımların sürekli çalıştırılması bellek sızıntılarına ve genel sistem kararsızlığına yol açabilir. Bu, uygulamaların ve sonuçta bilgisayarın başarısız olmasına yol açar.

Son olarak, eğer hizmet 7/24 çalışıyorsa ve iyi bilinen bir hizmetse (PDF Reader gibi her popüler uygulamanın sahip olabileceği), bu durum geniş bir saldırı yüzeyi oluşturur. Saldırgan, belirli bir popüler uygulamanın 7/24 hizmet yüklediği bilgisini kullanabilir ve bilgisayara erişim sağlamak için onu hacklemeye çalışabilir.

Bütün bunlarla birlikte, başka bir seçeneğe sahipken neden bu kadar çok geliştiricinin hizmetlerini her zaman çalışacak şekilde ayarladığını merak ediyor olabilirsiniz. Windows 7'den önce bile hizmetleri başlatmak için çeşitli seçenekler mevcuttu:

  • Engelli bir hizmeti tamamen devre dışı bırakır ve bu hizmetin ve bağımlı hizmetlerin başlatılmasını engeller; bu, kullanıcının hizmeti Denetim Masası'ndan veya Komut İstemi'nden manuel olarak etkinleştirmesi gerektiği anlamına gelir
  • Manuel aşağıda gösterildiği gibi, gerektiğinde (diğer hizmetlerin bağımlılıkları nedeniyle) veya hizmet uygun API'ler kullanılarak uygulamadan çağrıldığında bir hizmeti başlatır
  • Otomatik Giriş yapıldığında bir hizmet başlatır
  • Otomatik Gecikmeli– Windows Vista'da tanıtılan, hizmetin önyükleme tamamlandıktan ve ilk işlemler tamamlandıktan sonra başlatıldığı, sistemin başlatılmasını hızlandıran daha yeni bir başlatma türü.

Ne yazık ki birçok ISV (Microsoft'un kendisi de dahil) hizmetlerini Otomatik veya Otomatik Gecikmeli olarak ayarlamaya devam ediyor çünkü bu herkes için en basit çözüm gibi görünüyor. Hizmet 7x24 çalışır ve her zaman kullanılabilir durumda olduğundan bağımlılıkları veya hizmetin çalışıp çalışmadığını kontrol etme ihtiyacını ortadan kaldırır.

7x24 çalışmadan çok daha az kaynak kullanabilen ve daha güvenli hale gelebilen mevcut hizmetlerin birçok örneği vardır. Örneğin, bir uygulamanın yeni güncellemelerini kontrol eden bir güncelleme hizmetini düşünün. Bilgisayar ağa bağlı değilse ve IP adresi yoksa neden çalışması gerekir? Hiçbir şey yapamaz, öyleyse neden hiçbir şey yapmayan bir programı çalışır durumda bırakasınız ki? Grup İlkelerini değiştirirken veya bir bilgisayar bir etki alanına katıldığında veya etki alanından ayrıldığında kullanılan İlke Yönetimi Hizmetini düşünün, ancak artık bilgisayar ev ağıma bağlandığı için hizmet yine boş olarak çalışıyor.

Tetikleyici tabanlı hizmetlerin ortaya çıkışı

Yukarıdaki sorunların çözümü, hizmeti "her zaman açık durumdan" çıkarıp, zamanlanmış görevler veya tetiklenen hizmetler gibi diğer arka plan etkinliği türlerine taşımaktır. Bu makale Windows 7 Tetikleyici Başlatma Hizmetleri hakkındadır. Sonraki makalelerde yapılacak olan Windows 7 Zamanlanmış Görevler hakkında pek çok ilginç şey söylenebilir.

Bir istemci uygulamasını hizmet olarak çalıştırmak mümkün mü? Her konsol uygulaması hizmet olarak çalışamayacaktır ve grafik arayüze sahip programlar prensip olarak bu şekilde çalışamaz. Ancak uygulamayı hizmet olarak çalıştırmak yine de mümkündür ve orijinal adı taşıyan bir program bu konuda bize yardımcı olacaktır. Emmeyen Servis Yöneticisi.

NSSM ücretsiz ve açık kaynaklı bir yazılımdır ve tüm işletim sistemlerini destekler Microsoft, Windows 2000 ile başlayıp . NSSM kurulum gerektirmez, sadece indirin ve paketini açın. Dağıtım, 32 ve 64 bit işletim sistemlerine yönelik sürümleri içerir. Programı nssm.cc sitesinden edinebilirsiniz, şu an için son stabil sürüm 2.21.1, onu kullanacağım.

NSSM'nin yeteneklerini göstermek için Notepad'i .

Hizmet Oluşturma

Adlı bir hizmet oluşturmak için not defteri komut konsolunu başlatın, paketlenmemiş NSSM'nin (64 bit Windows için) bulunduğu klasöre gidin ve NSSM grafik yükleyici penceresini açan nssm install notepad komutunu girin. Bir hizmet oluşturmak için, Yol alanında yürütülebilir dosyanın yolunu belirtmeniz ve "Hizmeti yükle" düğmesini tıklamanız yeterlidir. Ayrıca Seçenekler alanında hizmeti başlatmak için gereken tuşları belirleyebilirsiniz.

Yeni bir hizmet oluştururken bazı ek parametreleri de belirtebilirsiniz.

"Kapatma" sekmesi, uygulama normal şekilde kapatıldığında veya çöktüğünde kullanılan kapatma yöntemlerini ve zaman aşımlarını listeler. NSSM bir durdurma komutu aldığında (örneğin bir uygulama kapatıldığında), kontrol edilen uygulamayı normal bir şekilde durdurmaya çalışır. Uygulama yanıt vermezse NSSM, bu uygulamanın tüm süreçlerini ve alt süreçlerini zorla sonlandırabilir.

Uygulamayı kapatmanın dört adımı vardır ve bunlar varsayılan olarak bu sırayla kullanılacaktır:

İlk aşamada NSSM bir olay oluşturup göndermeye çalışır. Ctrl+C. Bu yöntem, konsol uygulamaları veya komut dosyaları için iyi çalışır ancak grafiksel uygulamalar için geçerli değildir;
NSSM daha sonra uygulama tarafından oluşturulan tüm pencereleri algılar ve onlara bir WM_CLOSE mesajı göndererek uygulamanın kapanmasına neden olur;
Üçüncü adım, NSSM'nin uygulama tarafından oluşturulan tüm iş parçacıklarını hesaplaması ve onlara, uygulamanın bir iş parçacığı mesaj kuyruğuna sahip olması durumunda alınacak olan bir WM_QUIT mesajı göndermesidir;
Son çare olarak NSSM, TerminateProcess() yöntemini çağırarak uygulamayı sonlandırmaya zorlayabilir.

Yöntemlerden bazılarını veya hatta tümünü devre dışı bırakmak mümkündür, ancak farklı uygulamalar için farklı yöntemler işe yarar ve uygulamanın doğru şekilde kapatıldığından emin olmak için her şeyin olduğu gibi bırakılması önerilir.

Varsayılan olarak, bir hizmet çöktüğünde NSSM onu yeniden başlatmaya çalışır. "Eylemlerden çık" sekmesinde, uygulama anormal şekilde sonlandırıldığında otomatik eylemi değiştirebilir, ayrıca uygulama otomatik olarak yeniden başlatılmadan önce bir gecikme ayarlayabilirsiniz.

"Giriş/Çıkış (G/Ç)" sekmesinde, uygulama girişi/çıkışının belirli bir dosyaya yeniden yönlendirilmesini ayarlayabilirsiniz.

"Ortam" sekmesinde hizmet için yeni ortam değişkenleri ayarlayabilir veya mevcut olanları geçersiz kılabilirsiniz.

Ayrıca grafik kabuğunu kullanamaz ve aşağıdaki komutla konsolda hemen bir hizmet oluşturamazsınız:

nssm not defterini yükleyin ″C:\Windows\system32\notepad.exe″

Servis Yönetimi

NSSM kullanarak hizmeti oluşturduktan sonra Hizmetler ek bileşenine gidin ve not defteri hizmetini bulun. Gördüğünüz gibi görünüş olarak diğer hizmetlerden hiçbir farkı yok; başlatabiliyor, durdurabiliyor veya başlatma modunu değiştirebiliyoruz. Ancak, yürütülebilir dosya olarak nssm.exe'nin listelendiğini unutmayın.

Ve Görev Yöneticisine gittiğimizde şu resmi göreceğiz: NSSM ana (ana) süreç olarak çalışıyor, not defteri servisi onun alt süreci olarak çalışıyor ve Notepad uygulaması da bu alt süreçte zaten çalışıyor.

Bir hizmeti kaldırma

Bir hizmeti kaldırmak için nssm not defterini kaldır komutunu girin ve kaldırılmasını onaylayın. Ve nssm not defterini kaldır onayla komutunu girerek onay almadan yapabilirsiniz.

Etkileşimli olarak bir hizmet başlatın

Bir kullanıcı uygulaması ile bir hizmet arasındaki temel fark, uygulamanın başlatıldıktan sonra kullanıcıdan çalışmaya devam etmek için bir düğmeye basmak veya bir komut girmek gibi ek eylemler gerektirebilmesidir. Bunu yapmak için, ona erişmeniz gerekiyor, ki bunun yapılması o kadar kolay değil.

Bir hizmeti etkileşimli modda başlatmak için, Hizmetler ek bileşeninde özelliklerini açmanız ve "Oturum Açma" sekmesinde "Masaüstüyle etkileşime izin ver" onay kutusunu işaretlemeniz gerekir.

Ve mucizeler başlıyor. Etkileşimli modda çalışan bir hizmet için sistem ayrı bir izole oturum (oturum 0) açıyor. Bu oturuma yalnızca bilgisayardaki etkileşimli hizmetlerin başlatılmasını izleyen ve bir uyarı veren Etkileşimli Hizmetler Algılama Hizmeti (ui0detect) kullanılarak erişilebilir. Windows 7\Server 2008'de bu hizmet varsayılan olarak etkindir, ancak Windows 8\Server 2012'de devre dışıdır ve Hizmetler grafik ek bileşeninde görünmez (en azından orada bulamadım). Üstelik bu gizemli hizmeti bulup başlatmayı denerseniz bir hata mesajı alırsınız.

Ancak gerçek şu ki, onu çalıştırmak için bilgisayarınızda etkileşimli hizmetlerin çalışmasına izin vermelisiniz. Bu nedenle, kayıt defteri düzenleyicisini açın, HKLM\System\CurrentControlSet\Control\Windows bölümünde adlı DWORD tipi parametreyi bulun. EtkileşimliHizmet Yok ve değerini şu şekilde ayarlayın: 0 .

Ardından PowerShell konsolunu açın ve bulma hizmetini şu komutla başlatın:

Başlat-Hizmet -Ad ui0detect

Tespit servisinin çalıştığından emin olduktan sonra notepad servisini yeniden başlatıyoruz ve bu pencereyi alıyoruz. "Mesajı görüntüle"yi seçin

ve kendimizi uygulamamızın çalıştığı boş oturumda buluyoruz. Daha sonra onunla gerekli işlemleri yapıp geri dönüyoruz.

Bu, uygulamaları Windows hizmetleri olarak çalıştırmak için ilginç bir çözümdür. En güzeli değil ama ismiyle oldukça tutarlı

Makaleyi beğendin mi? Arkadaşlarınla ​​paylaş!
Bu makale yardımcı oldu mu?
Evet
HAYIR
Geri bildiriminiz için teşekkürler!
Bir şeyler ters gitti ve oyunuz sayılmadı.
Teşekkür ederim. Mesajınız gönderildi
Metinde bir hata mı buldunuz?
Seçin, tıklayın Ctrl + Enter ve her şeyi düzelteceğiz!