TopShelf İle Windows Servis Uygulaması | C#

Merhaba, Windows açılışında bazı uygulamaların otomatik başlaması için bir ufak konsol uygulaması yazdım.
Bunu da Tolshelf kullanarak Windows Servisi’ne çevirdim.
Örnek kodlar şu şekilde:

Program.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using Topshelf;

namespace ConsoleWinSrvBatStart
{
    public class Program
    {
        /// <summary>
        /// ConsoleWinSrvBatStart install diyerek kuruyoruz.
        /// ConsoleWinSrvBatStart uninstall diyerek kaldiriyoruz.
        /// </summary>
        /// <param name="args"></param>
        public static void Main(string[] args)
        {
            try
            {
                ayarlariYukle();
                HostFactory.Run(hostConfig =>
                {
                    hostConfig.Service<BaslangicService>(serviceConfig =>
                    {
                        serviceConfig.ConstructUsing(() => new BaslangicService());
                        serviceConfig.WhenStarted(s => s.Start());
                        serviceConfig.WhenStopped(s => s.Stop());
                    });
                    hostConfig.RunAs(@".\Administrator", @"Admin şifresi....");
                    hostConfig.StartAutomaticallyDelayed();
                    hostConfig.SetServiceName("BaslangicUygulamaCalistirmaServisi");
                    hostConfig.SetDisplayName("Baslangic Uygulama Calistirma Servisi");
                    hostConfig.SetDescription("Baslangic Uygulama Calistirma Servisi .Net 4.8 ve Topshelf kullanildi.");

                    hostConfig.OnException(ex =>
                    {
                        File.AppendAllText(Sabitler.UygulamaDizini + "/ServiceLogg.txt", Environment.NewLine + DateTime.Now.ToString("yyyyMMddHHmmss") + " : " + ex.ToString());
                    });
                });
            }
            catch (Exception ex)
            {
                File.AppendAllText(Sabitler.UygulamaDizini + "/ServiceLogg.txt", ex.ToString());
            }
        }

        static void ayarlariYukle()
        {
            Sabitler.LstUygulama = new List<Uygulama>();
            XmlDocument xmlAyarlar = new XmlDocument();
            xmlAyarlar.Load(Sabitler.UygulamaDizini + "/Settings.xml");
            XmlNodeList lstUygulama = xmlAyarlar.SelectNodes("/KOK/Uygulama");
            foreach (XmlNode node in lstUygulama)
            {
                string tur = node.Attributes["Turu"].Value;
                int beklemeSuresi = Convert.ToInt32(node.Attributes["BeklemeSuresi"].Value);
                string yol = node.Attributes["Yolu"].Value;
                if (!string.IsNullOrEmpty(yol))
                {
                    Sabitler.LstUygulama.Add(new Uygulama() { Turu = tur, BeklemeSuresi = beklemeSuresi, Yolu = yol });
                }
            }
        }
    }
}

Settings.xml

Settings.xml
<?xml version="1.0" encoding="utf-8" ?>
<KOK>
  <Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\iasRmiRegistry.bat" />
  <Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\iasControl.bat" />
  <Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\iasServer-S1.bat" />
  <Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\iasServer-S2.bat" />
  <Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\iasServer-S3.bat" />
  <Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\iasLoadbalancer.bat" />
  <Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\5-iasWebSrv.bat" />
  <Uygulama Turu="EXE" BeklemeSuresi="10" Yolu="" />
  <Uygulama Turu="SERVICE" BeklemeSuresi="10" Yolu="" />
</KOK>

BaslangicService.cs

using System;
using System.Diagnostics;
using System.IO;
using System.ServiceProcess;
using System.Threading;

namespace ConsoleWinSrvBatStart
{
    public class BaslangicService
    {
        public void Start()
        {
            foreach (Uygulama item in Sabitler.LstUygulama)
            {
                switch (item.Turu)
                {
                    case Sabitler.UygulamaTuruBat:
                        string batFilePath = item.Yolu;
                        ProcessStartInfo processInfo = new ProcessStartInfo();
                        processInfo.FileName = "cmd.exe";
                        processInfo.Arguments = $"/c \"{batFilePath}\"";
                        processInfo.RedirectStandardOutput = true;
                        processInfo.RedirectStandardError = true;
                        processInfo.UseShellExecute = false;
                        processInfo.CreateNoWindow = false;
                        processInfo.WorkingDirectory = Path.GetDirectoryName(batFilePath); ;  // BAT dosyasının bulunduğu dizin

                        Process processStartBat = new Process();
                        processStartBat.StartInfo = processInfo;
                        processStartBat.Start();
                        break;
                    case Sabitler.UygulamaTuruExe:
                        Process processStart = new Process();
                        processStart.StartInfo.FileName = item.Yolu;
                        processStart.Start();
                        break;
                    case Sabitler.UygulamaTuruServis:
                        ServiceController controller = new ServiceController(item.Yolu);
                        if (controller.Status == ServiceControllerStatus.Stopped || controller.Status == ServiceControllerStatus.Paused)
                            controller.Start();
                        break;
                    default:
                        break;
                }
                Thread.Sleep(item.BeklemeSuresi * 1000);
            }
        }

        public void Stop()
        {
            foreach (Uygulama item in Sabitler.LstUygulama)
            {
                Process[] allProcesses = Process.GetProcesses();
                try
                {
                    switch (item.Turu)
                    {
                        case Sabitler.UygulamaTuruBat:
                            // Batlari Windows Servis uygulamasi ile baslatinca BAT isimlerinde yakalayamiyoruz maalesef.
                            foreach (Process processBat in allProcesses)
                            {
                                if (processBat.ProcessName == "conhost"
                                    || processBat.ProcessName == "cmd"
                                    || processBat.ProcessName == "java")
                                {
                                    try
                                    {
                                        if (!processBat.HasExited)
                                        {
                                            processBat.Kill();
                                            processBat.WaitForExit();
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        File.AppendAllText(Sabitler.UygulamaDizini + "/ServiceLogg.txt", Environment.NewLine + DateTime.Now.ToString("yyyyMMddHHmmss") + " : Process Name : " + processBat.ProcessName + ", Id : " + "" + processBat.Id + ", " + ex.ToString());
                                    }
                                }
                            }

                            // Eger isimden yakalamak mumkun olsaydi asagidaki sekilde yakalayip sonlandirabiliyorduk.

                            //////foreach (Process process in cmdProcesses)
                            //////{
                            //////    if (process.MainWindowTitle.Contains(Path.GetFileName(item.Yolu)))
                            //////    {
                            //////        ///Once alt islemleri halledelim...
                            //////        ManagementObjectSearcher searcher = new ManagementObjectSearcher($"SELECT * FROM Win32_Process WHERE ParentProcessId={process.Id}");
                            //////        foreach (ManagementObject obj in searcher.Get())
                            //////        {
                            //////            int childProcessId = Convert.ToInt32(obj["ProcessId"]);
                            //////            Process childProcess = Process.GetProcessById(childProcessId);
                            //////            childProcess.Kill();
                            //////        }
                            //////        ///Sonra ana islemi...
                            //////        process.Kill();
                            //////    }
                            //////}
                            break;
                        case Sabitler.UygulamaTuruExe:
                        case Sabitler.UygulamaTuruServis:
                            string islemAdi = item.Turu == Sabitler.UygulamaTuruServis ? item.Yolu : Path.GetFileName(item.Yolu);
                            foreach (Process servisProcess in allProcesses)
                            {
                                if (servisProcess.ProcessName == islemAdi)
                                {
                                    try
                                    {
                                        if (!servisProcess.HasExited)
                                        {
                                            servisProcess.Kill();
                                            servisProcess.WaitForExit();
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        File.AppendAllText(Sabitler.UygulamaDizini + "/ServiceLogg.txt", Environment.NewLine + DateTime.Now.ToString("yyyyMMddHHmmss") + " : Process Name : " + servisProcess.ProcessName + ", Id : " + "" + servisProcess.Id + ", " + ex.ToString());
                                    }
                                }
                            }
                            break;
                        default:
                            break;
                    }
                }
                catch (Exception ex)
                {
                    File.AppendAllText(Sabitler.UygulamaDizini + "/ServiceLogg.txt", DateTime.Now.ToString("yyyyMMddHHmmss") + " : " + ex.ToString());
                }
            }
        }
    }
}

Selamlar.

Leave a Reply

Your email address will not be published. Required fields are marked *