Makale Özeti

Bir önceki makalede geliştirdiğimiz servisi bilgisayara yüklemek için kurulum oluşturmayı, güvenlik ile ilgili tanımlamaları yapmayı ve windows servislerinin bilgisayara kurulumunu ve kaldırılmasını ele almıştık, bu makalede ise yerel ve uzaktaki bilgisayarlarda yer alan servislerin hem SCM aracılığıyla hem de programatik olarak yönetimini ele alıyor olacağız.

Makale

Service Control Manager’ın Kullanımı
Service Control Manager aracını şu amaçlarla kullanırız;

·          Bir servisin durumunu değiştirmek

·          Bir servisin ne şekilde başlayacağını belirlemek

·          Failure durumunda yapılacak kurtarma işlemlerini tanımlamak

·          Servis için bir kullanıcı hesabı tanımlamak

·          Servis bağımlılıklarını görüntülemek

Service Control Manager aracına Denetim Masası à Yönetimsel Araçlar à Services yolunu izleyerek erişebilirsiniz.

Services ekranı (Şekil 1:1) bilgisayara yüklenmiş olan servisleri listeler. Bir servisin durumunu değiştirmek için ilgili servisi sağ tuşla tıklayarak açılan menüdeki komutları kullanırız.

Şekil 1:1 :: Services Ekranı

SCM aracılığıyla servisin ne şekilde başlayacağını da belirleyebiliriz. Servisin ne şekilde başlayacağını belirlemek için aşağıdaki adımları takip ederiz.

1.      İlgili servisi sağ tuşla tıklayarak açılan menüden Properties komutunu veririz.

2.      Açılan diyaloğun General sekmesindeki Start-up Type bölümünden servisin ne şekilde başlayacağını seçerek Ok butonunu tıklarız.

SCM ile bir servisin çalışması sırasında hata oluşması durumunda yapılacakları da tanımlayabiliriz. Bunu yapmak için aşağıdaki adımları takip ederiz.

1.      İşlem yapacağımız servisi seçip, özellikler ekranını açtıktan sonra Recovery sekmesini açarız.

2.      Birinci hata, ikinci hatave tekrarlayan hatalar oluşması durumunda yapılmasını istediğimiz işlemleri listeden seçeriz ve Ok butonunu tıklayarak ekranı kapatırız.

Servisin oturum açarken hangi kullanıcı hesabını kullanacağını belirtmek için ilgili servisi sağ tuşla tıklayarak özellikler ekranını açtıktan sonra Log On sekmesine geçerek kullanmak istediğimiz kullanıcı hesabını belirtiriz.

ServiceController Sınıfının Kullanımı

ServiceController sınıfı çalışmakta olan bir bilgisayarın servislerine bağlanarak yönetmemizi sağlar. SCM aracında olduğu gibi servis üzerinde standart komutları verebileceğiniz gibi SCM’den farklı olarak servis uygulamasına özel komutlar da gönderebilirsiniz. ServiceController sınıfı bize şu işlemleri yapabilme imkanı sunmaktadır.

 

·          Bilgisayara yüklenmiş olan servislerin listesini almak

·          Bir servisi çalıştırmak, durdurmak, beklemeye almak ve devam ettirmek

·          Servisin özelliklerini görüntülemek

·          Servise özel bir komut göndermek

Mini Servis Yöneticisi

Yazı dizisinin son bölümünde, belirtilen bilgisayara bağlanarak, bilgisayar üzerinde yüklenmiş olan servisleri yönetecek bir servis yönetim programı geliştireceğiz.

İlk olarak yeni bir windows uygulaması oluşturarak Form1 üzerine ToolBox’ın Components bölümünden bir adet ServiceController bileşeni ekliyoruz ve form1’i aşağıdaki şekilde tasarlıyoruz:

Uygulamamızın çalışma anındaki görünümü ise aşağıdaki gibi olacaktır.

Uygulamamızın kodları ise şu şekilde:

// belirtilen bilgisayardaki servislerin listesi alınarak
// listbox'ta görüntüleniyor
private void button1_Click(object sender, System.EventArgs e)
{
      if (textBox1.Text != "")
      {
            sc = new System.ServiceProcess.ServiceController(textBox1.Text);
            listBox1.Items.Clear();
            System.ServiceProcess.ServiceController[] services = System.ServiceProcess.ServiceController.GetServices();
            IEnumerator enumerator   = services.GetEnumerator();
            while (enumerator.MoveNext())
            {
listBox1.Items.Add(((ServiceController)enumerator.Current).ServiceName);
            }
      }
}

// listBox'ta yapılan seçim değiştiğinde groupbox2'nin başlığı güncelleniyor
// ve seçilen servis ile ilgili detaylar görüntüleniyor
private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
      groupBox2.Text = "Selected Service: " + listBox1.SelectedItem.ToString();
      serviceDetails(listBox1.SelectedItem.ToString());

// seçilen servisin detaylarını görüntüleyen prosedür
private void serviceDetails(string serviceName)
{
      sc.ServiceName = serviceName;
      label9.Text = sc.ServiceName;
      label13.Text = sc.ServiceType.ToString();
      label14.Text = sc.Status.ToString();
      if (label14.Text == "Running")
      {
            label10.Text = sc.CanPauseAndContinue.ToString();
            label11.Text = sc.CanShutdown.ToString();
            label12.Text = sc.CanStop.ToString();               
      }
      else if(label14.Text == "Paused")
      {
            label10.Text = "Service is Currently Paused";
            label11.Text = "Service is Currently Paused";
            label12.Text = "Service is Currently Paused";                    }
      else if(label14.Text == "Stopped")
      {
            label10.Text = "Service is Currently Stopped";
            label11.Text = "Service is Currently Stopped";
            label12.Text = "Service is Currently Stopped";                  
}

       if (label14.Text == "Running")
     {
            btnStart.Enabled = false;
            btnResume.Enabled = false;
            if (sc.CanStop == true) { btnStop.Enabled = true; }
            if (sc.CanPauseAndContinue == true) { btnPause.Enabled = true; }           
      }

      else if(label14.Text == "Stopped")
      {
            btnStop.Enabled = false;
            btnPause.Enabled = false;
            btnResume.Enabled = false;
            btnStart.Enabled = true;          
      }

      else if(label14.Text == "Paused")
      {
            btnResume.Enabled = true;
            btnStart.Enabled = false;
            btnPause.Enabled = false;
            if (sc.CanStop == true) {btnStop.Enabled = true; }                          }
}

 

// form yüklendiği anda metin kutusuna uygulamanın çalıştığı

// bilgisayarın adını yazdırıyoruz

private void Form1_Load(object sender, System.EventArgs e)

{          

      textBox1.Text = Environment.MachineName.ToString();

}

// servisi çalıştıran prosedür

private void startService(string serviceName)

{

      try

      {

            sc.ServiceName = serviceName;

            sc.Start();

            serviceDetails(serviceName);

            MessageBox.Show("Servis Başlatıldı");

      }

      catch (Exception ex)

      {

            serviceDetails(serviceName);

            MessageBox.Show(ex.Message.ToString());

      }

}

 

// servisi durduran prosedür

private void stopService(string serviceName)

{

      try

      {

            sc.ServiceName = serviceName;

            sc.Stop();

            serviceDetails(serviceName);

            MessageBox.Show("Servis Durduruldu");

      }

      catch (Exception ex)

      {

            serviceDetails(serviceName);

            MessageBox.Show(ex.Message.ToString());

      }

}

 

// servisi beklemeye alan prosedür

private void pauseService(string serviceName)

{

      try

      {

            sc.ServiceName = serviceName;

            sc.Pause();

            serviceDetails(serviceName);

            MessageBox.Show("Servis Beklemeye Alındı");

      }

      catch (Exception ex)

      {

            serviceDetails(serviceName);

            MessageBox.Show(ex.Message.ToString());

      }

}

 

// servisi sürdüren prosedür

private void resumeService(string serviceName)

      {

      try

      {

            sc.ServiceName = serviceName;

            sc.Continue();

            serviceDetails(serviceName);

            MessageBox.Show("Servis Sürdürüldü");

      }

      catch (Exception ex)

      {

            serviceDetails(serviceName);

            MessageBox.Show(ex.Message.ToString());

      }          

}

// servisi durdur

private void btnStop_Click(object sender, System.EventArgs e)

{

      stopService(listBox1.SelectedItem.ToString());

}

// servisi çsürdür

private void btnResume_Click(object sender, System.EventArgs e)

{

      resumeService(listBox1.SelectedItem.ToString());

}

// servisi beklemeye al

private void btnPause_Click(object sender, System.EventArgs e)

{

      pauseService(listBox1.SelectedItem.ToString());

}

// servisi çalıştır

private void btnStart_Click(object sender, System.EventArgs e)

{

      startService(listBox1.SelectedItem.ToString());

}

 

Özel Komutlar

Yazı dizisinin başından bu yana sözünü ettiğimiz özel komutlara geldi sıra. Servisimiz üzerinde özel komutlar çalıştıracağız. Bunun için önce, yazı dizimiz boyunca geliştirdiğimiz servis uygulamamızı özel komutları kabul edebilmesini sağlayacak şekilde güncelliyoruz. Bunun için aşağıdaki kod bloğunu servis uygulamamıza ekliyoruz.

protected override void OnCustomCommand(int cmd)
{
      if (cmd == 100)
      {
            EventLog.WriteEntry("Servise 100 kodlu komut gönderildi.");
      }
      else if (cmd==200)
      {
            EventLog.WriteEntry("Servise 200 kodlu komut gönderildi.");
      }
      else
      {
      EventLog.WriteEntry("Servise tanımsız bir komut gönderildi.");
      }
}

Böylelikle servisimizi özel komutları kabul edebilir hale getirdik ve 100 ve 200 kodlu komutlar geldiğinde yapılacak işlemleri tanımlamış olduk. Aynı zamanda tanımsız komut geldiğinde servisimizin ne yapması gerektiğini belirttik.

Bu noktada Mini Service Manager uygulamamızı servislere özel komut gönderebilecek şekilde güncelliyoruz. Bunun için görsel tasarımı aşağıdaki şekilde güncelliyoruz:

Sonrasında aşağıdaki kodu ekleyerek geliştirdiğimiz servis uygulamamıza özel komut gönderebilecek hale getiriyoruz.

private void button2_Click(object sender, System.EventArgs e)
{
      if (textBox2.Text != "")
      {
            sc.ExecuteCommand(int.Parse(textBox2.Text));
      }
}

 

Ve son olarak servisimizi ve Mini Service Manager’ı test ediyoruz:

Windows servislerini ele aldığımız yazı dizimizin sonuna geldik.  Gördüğünüz gibi arkaplanda sessizce çalışan bu servislerin geliştirilmesi ve yönetilmesi son derece basit.

 

Kaynaklar:
. Microsoft Developers Network (http://msdn.microsoft.com)
. Technet (http://technet.microsoft.com/)
. Developing XML Web Services and Server Components with Microsoft Visual Basic .NET and Microsoft Visual C# .NET ()