Windows Service Projesini Debug Etme ve Harici Exe Çalıştırma

Husamettin Elalmis

Merhaba arkadaşlar, bu yazıda sizlere Windows Service Projeini Debug etme ve service içerisinden harici exe çalıştırma yönteminden bahsedeceğim.

Windows Service nedir?

  • Windows Service, geri planda işletim sistemi üzerinde çalışır, "services" komutu ile çalışan servisleri görebiliriz

  • Windows Service, .net ortamında geliştirilebilen bir proje türüdür.

Windows Service'in Install Edilmesi (Sisteme Tanıtılması)

  • Projemizi "release" modda build ettikten sonra aşağıdaki folder yapısına benzer bir görünüm elde ederiz

  • Administrator olarak CommandPromptu açarız ilgili klasöre cd komutu ile gideriz

  • sc create Easy2PatchService binpath="C:\Projects\Arge\ArkSoft\Tumark\TumarkClientService\bin\Release\TumarkClientService.exe" komutu ile servisi sisteme kurmuş oluruz (servisi services modül listesinden focuslanıp manuel olarak elle başlatmamız gerekmektedir, default olarak manuel kurulur)

    • Not: sc komutunun alternatifi "installutil.exe" komutudur. İkisi de aynı kapıya çıkar. Aralarında çok hafif farklar vardır. Sc komutu daha çok tercih ediliyor.

    • Bu işlemler için .bat dosyası kullanıyorum, cs.bat (createService.bat) bu komutu otomatik olarak çalıştırmaktadır

  • Çalışan servisi komut satırından durdurmak için

    • sc stop Easy2PatchService komutunu gireriz

  • Durdurulmuş servisi komut satırından kaldırmak için (servisin önce durdulmuş olması gerekmektedir)

    • sc delete Easy2PatchService komutunu gireriz

  • Stop ve Delete işlemini ard arda yapması için ds.bat (deleteService.bat) hazırladım, bu şekilde hızlıca kullanabiliyorum

    • Geliştirilen servis projelerinde release folder altında cs.bat ve ds.bat komutlarını hazırda bulundurmak iyidir, zaman tasarrufu sağlar

Windows Service Hakkında Bilinmesi Gerekenler

  • Bir service projesi, bünyesinde birden fazla service barındırabilir. Bu nedenle yeni oluşturulan bir service projesinde array şeklinde çalışmasının sebebi budur (birden fazla servisi yönetmek ve iş akışlarını parçalama amaçlı kullanmak üzere)

  • Servis projeleri, geri planda çalışır. Release modda olmak zorundadır.

  • Servisi runtime'da çalıştırabilmek için sisteme kurulması ve start edilmesi gerekmektedir.

  • Servis uygulamalarında, Winform UI elementleri kullanılamamaktadır (servis uygulamalarının UI ile bağlantı kurabilmesi mümkün olmamaktadır)

  • Normal şartlarda servis, dışarıdan bir harici uygulamayı çalıştıramamaktadır (Dışarıdan harici bir uygulamayı çalıştırmak için kullanılan Process.Run komutu, service accountunun scopu ile ilgili bir durumdur. Her durumda dışarıdan bir uygulamayı çalıştırma işlemi istersek kernel seviyesinde çalıştırabilmek mümkün olduğu görülmüştür. Process.Run komutu yeterli olmamaktadır.

  • Normal şartlarda, service projesi debug edilememektedir. Bu genel yaşanan bir sıkıntıdır. Ancak, reflection yöntemlerini kullanarak debug modda çalıştırmak mümkün olmaktadır. Bunun nasıl yapılabildiğini göstereceğim.

Helper Classlarının Hazırlanması

  • Windows service projemizde evladiyelik kullanabileceğimiz bazı helper classlarını önceden hazırlamış olmamız gerekmektedir, bunlardan temel olanları

    • Singleton classı : Classlarımıza singleton patternini uygulamak için kullanırız.

    • FileHelper classı: Bu projemizde dosyaya log yazdırmak için kullanırız.

    • ServiceHelper classı: Servisimizi debug modda çalıştırabilmek (kod iz sürmek ve akış takibi yapmak için) kullanırız

    • ProcessStart classı: Harici uygulamayı çağırabilmek için (kernel seviyesinde) kullanırız

Singleton Classı

FileHelper Classı

ServiceHelper Classı

ProcessHandler Classı

Output Ayarının Setlenmesi

  • Service projesinin outputtype tipi ConsoleApplication seçilir

Program.cs

  • Debug modda run (F5) yaptığımızda servisimizin OnStart başlangıç metoduna düştüğünü görebiliriz, F10-F11 tuş kombinasyonları ile adım adım kod iz sürülebilir

  • Böylece, mevcut methodların debug için ayrı, release için ayrı kopyalarını çıkartmak zorunda kalmıyoruz

  • Release modda çalıştırıp, eventViewer loglarına girdilerin yapılıp hangi değer neymiş gibi bakmamıza gerek kalmayacak.

  • Kod daha stabil hale gelmiş olacak, debugda çalışan bir akışın releaseda da çalışıyor olmasını bekliyor olacağız

Service1.cs

Sonuç

  • Burada bahsi geçen kodların tamamı örnek proje yapılarak uygulanmış ve hem debug hem release modda çalıştığı görülmüştür

  • Bu projedeki arge şunu hedeflemiştir,

    • Service uygulaması kod seviyesinde Debug edilebilsin

    • MFA simulasyonu yapabilsin (service dışarıdaki bir harici uygulamayı çalıştırabilsin)

    • Çalıştırılan harici uygulamadaki keyboard eventslar argelenebilsin (tuş takımı kilitlemeleri vb.)

    • Lock ve Unlock durumlarını algılasın, Unlock yapıldığında MFA formu ekrana gelsin vb.

  • Windows Service projelerinde burada bahsi geçen temel bilgileri ve helper classlarını standard halde kullanabiliriz (Easy2Patch projesinde bu şekilde kullandım, sessionLimit ve diğer servislerde de aynı yapı kullanılabilir)

Saygılarımla,

Hüsamettin ELALMIŞ – 07.08.2021

[email protected]

Last updated