Windows Servislerini Resetleme

Geliştirdiğimiz uygulama Windows servislerine yada kendi geliştirdiğimiz bir servise bağımlı ise uygulamamızın çalışır durumda ayakta kalabilmesi, bu servislerin durumuna bağlı oluyor. Servisler uygulama için hayati önem arzediyorsa, schedule edilmiş harici bir exe ile bu servisler kontrol edilip durmuş servisler başlatılabilir yada belirlediğimiz servisler restart edilebilir.

Servisler üzerinde işlem yapabilmek için ServiceController sınıfını kullanırız. Bu sınıf System.ServiceProcess namespace’inde bulunur. ServiceController  sınıfını kullanabilmemiz için projemize System.ServiceProcess.dll dosyasını referans olarak eklememiz gerekmektedir.

System.ServiceProcess.dll Download

Sonrasında projemizin using kısmına System.ServiceProcess‘i eklememiz gerekmektedir.

using System.ServiceProcess;

Service Controller Status Özelliği

Status özelliğini kullanarak sorguladığımız servis hakkında bilgi sahibi olabiliriz. Status özelliği ServiceControllerStatus, enum tipinde değer döndürür.

Statü Adı Açıklama
ContinuePending Servis durdurulmuş ve başlatılıyor.
Paused Servis durdurulmuş.
PausePending Servis durduruluyor.
Running Servis çalışıyor.
StartPending Servis başlatılıyor.
Stopped Servis çalışmıyor.
StopPending Servis durduruluyor.

Uzak Makinadaki Bir Servisin Durumunu Belirleme

Aşağıdaki kod bloğu ile  “UzakSunucuAdı” isimli uzak sunucudaki “servisadı” isimli servisin çalışırlığı kontrol edilir.  Eğer kontrol edilen servis local bir sunucu ise 2. parametre olan uzak sunucu adı yazmaya gerek kalmaz.

ServiceController service = new ServiceController("servisadı""UzakSunucuAdı");
if (service .Status == ServiceControllerStatus.Running)
{
 MessageBox.Show("Servis Çalışıyor");
}

Servisleri Restart Etme

Belirlediğimiz servisleri bir döngü ile önce stop edip sonra tekrar start ederek restart edebiliriz. Stop komutu verildikten sonra  statü “Stopped” olana kadar beklenir.  Ardından Start komutu verilir ve tekrar statü “Running” olana kadar beklenir. Bu işlemin ardından ilgili servis restart edilmiş olur.

Aşağıdaki kod bloğu srvc  dizisi içerisinde tanımlanmış servisleri restart etmektedir.

public void service_restart()
{

string[] srvc = { “servicename1”, “servicename2”, “servicename3″ };

for (int i = 0; i < srvc .Length; i++)
{
ServiceController service = new ServiceController(srvc [i],);
TimeSpan timeout = TimeSpan.FromMilliseconds(30000);

try
{
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
Console.WriteLine(srvc[i] + ” Servisi Durduruldu”);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message + ” Servis Durdurma Hatası. Servis Adı: ” + subservice[i]);
}

try
{
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
Console.WriteLine(subservice[i] + ” Servisi Başlatıldı”);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + ” Servis Başlatma Hatası Servis Adı: ” + subservice[i]);
}
}
}