Asp.Net İle Windows Servis Çalıştırma / Durdurma

Web programlama yaparken Windows Servisler yazarak iş akışlarını daha kolay yönetebiliriz. Windows servisleri belli sıklıklarla çalıştırarak, gerekli görevleri düzenli olarak yaptırabiliriz. Büyük CRM ve ERP projelerinde servisleri çoğunlukla kullanmaktayım.

Bu yazımda asp.net ile yapılmış bir site üzerinden; Windows servislerin listelenmesi ve servis durumlarını öğreneceğiz. Ayrıca bu servisleri çalıştırıp durdurabileceğiz. Bunun için gerekli izinleri vereceğiz ve yetki alacağız.

Benim bu servisleri yönetmek için yaptığım en kolay ve hızlı çözüm; IIS tarafından izin vermeye dayanıyor.  Normalde asp.net üzerinden bir servise ulaşmak istediğinizde izniniz olmadığı için Exception hatası alırsınız. Her web sitesi bir ApplicationPool üzerinde çalışması gerektiğinden varsayılan yetkiler kısıtlıdır.

Ama bu izinleri vererek sistem üzerinde bazı kapıları açmış oluyoruz. (güvenlik olarak. Örneğin sitenizin hacklenmesi durumunda, asp.net kodları çalıştıran bir kişi sunucunuz üzerinde bir çok alanda yetkiye sahip olacaktır. 🙂 )

  • “Boş Bir Asp.Net” projesi oluşturuyoruz.
  • Servis dosyalarının bilgilerinin tutulduğu basit bir sınıf yazalım.
public class WServices
{
    private string _serviceName;
    private ServiceControllerStatus _serviceStatus;

    public WServices(string serviceName, ServiceControllerStatus serviceStatus)
    {
        this._serviceName = serviceName;
        this._serviceStatus = serviceStatus;
    }

    public string ServiceName
    {
        get
        {
            return _serviceName;
        }
    }
    public string ServiceStatus
    {
        get
        {
            switch (_serviceStatus)
            {
                case ServiceControllerStatus.ContinuePending:
                    goto default;
                case ServiceControllerStatus.Paused:
                    goto default;
                case ServiceControllerStatus.PausePending:
                    goto default;
                case ServiceControllerStatus.Running:
                    return "Çalışıyor";
                case ServiceControllerStatus.StartPending:
                    goto default;
                case ServiceControllerStatus.Stopped:
                    return "Çalışmıyor";
                case ServiceControllerStatus.StopPending:
                    goto default;
                default:
                    return "Bekliyor";
            }
        }
    }
}
  • Tüm servislerimizi sistemden çekelim. ServiceController sınıfından yararlanacağız.
var servicesList = new List<WServices>();
ServiceController.GetServices().ToList()
.ForEach(delegate(ServiceController controller)
    {
        servicesList.Add(new WServices(controller.ServiceName,controller.Status));
    });

rptServiceList.DataSource = servicesList;
rptServiceList.DataBind();
  • Servislerimizin ayrıntılarını göstermek için, Repeater nesnesi yeterli olacaktır.
<asp:Repeater ID="rptServiceList" runat="server">
<ItemTemplate>
<p><%#Eval("ServiceName") %> - <%#Eval("ServiceStatus") %></p>
</ItemTemplate>
</asp:Repeater>
  • Herhangi bir servisi başlatmak için aşağıdaki basit kodu kullanıyoruz.
ServiceController svcController = new ServiceController("MSSQLSERVER");
if (svcController.Status == ServiceControllerStatus.Stopped)
{
svcController.Start();
}
  • Herhangi bir servisi durdurmak için ise aşağıdaki kodu kullanabiliriz.
ServiceController svcController = new ServiceController("MSSQLSERVER");
if (svcController.Status == ServiceControllerStatus.Running)
{
    if (svcController.CanStop) svcController.Stop();
    svcController.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 30));
}

Çok büyük bir ihtimal servisleri çalıştırmak ve durdurmak için kodları çalıştırdığınızda “Access is denied” hatası alacaksınız.

windows_services_access_denied

Eğer visual studio ile test ediyorsanız bu hatayı Administrator rolünde Visual Studio çalıştırarak çözebilirsiniz. Ama siteyi Publish edip, sunucu üzerinde çalıştırdığınızda problemlerle karşılacaksınız. Bu “Access is denied” hatasının birçok çözümünü internette bulabilirsiniz.

Sahte bir login oluşturup işlem yapıp çözebileceğiniz gibi bazı web.config düğümleri ekleyerek de çözebilirsiniz.

Ama bence en kolay yolu; Application Pool’ a yetki vermek olarak görüyorum.

Bunun içinde Application Pool Identity alanını düzenlemeliyiz.

IIS 6 Üzeri

İlgili Application Pool dosyamıza sağ tıklayıp “Advanced Settings” tıklıyoruz.

windows_services_iis_advanced_settings

Process Model düğümünün altında ki Identity alanını LocalSystem olarak değiştiriyoruz.

Sonrasında ilgili Application Pool servisini durdurup yeniden başlatıyoruz.

Elbette bunu yapmak ekstra güvenlik açıklarına sebep verecektir. Bunları atlamamak lazım.

IIS 6 İçin

IIS –> Application Pools alanından ilgili Application Pool seçilip, sağ tıklanır ve Properties ekranı açılır.

Identity Sekmesinden Local System seçilir, ilgili pool yeniden başlatılır.

Hepsi bu kadar. 🙂

This entry was posted in Asp.Net, Visual C# .Net, Windows 2003 and tagged , , . Bookmark the permalink.

One Response to Asp.Net İle Windows Servis Çalıştırma / Durdurma

  1. Mahmut says:

    Güzel bir paylaşım olmuş. Sahte login veya web.config ile uğraşmak yerine App. Pool daha basit olacaktır.

    Teşekkürler…

Leave a Reply

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