Merhaba, bu yazıda sizlere ServiceController sınıfını kullanarak arka planda çalışan servisleri, bu servislerin temel bilgilerini ve anlık durumunu görüntüleyen ve müdahele edebilen basit bir proje paylaşacağım.
Öncelikle projemizi oluşturalım ve formumuza (frmMain) 1 adet ListBox (lbxServices), 2 adet GroupBox (gbxInfo, gbxStatus), 3 adet Label (lblDisplayName, lblServiceName, lblServiceType), 3 adet RadioButton (rbtnRunning, rbtnStopped, rbtnPaused), 1 adet Button (btnContinue), 1 adet de Timer (timer1) ekleyelim.
Alttaki resimde görüldüğü gibi formumuzu düzenleyelim.
Uyarı: Yaptığımız uygulamanın servislere tam erişimini sağlayabilmek için yönetici olarak çalıştırmamız gerekiyor. Uygulamanın varsayılan olarak yönetici olarak çalışması için projemize yeni form ekler gibi (Ctrl+Shift+A) Application Manifest File ekleyelim.
Eklediğimiz app.manifest dosyasında requestedExecutionLevel'i bulup level tanımına requierAdministrator yazalım.
Şimdi geri dönüp kodlarımızı yazmaya başlayalım.
using System;
using System.ServiceProcess; //ServiceController sınıfının bulunduğu kütüphaneyi ekleyelim
using System.Windows.Forms;
namespace ServiceControllerDemo
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
lbxServices.Sorted = true; //Servis listesi alfabetik sıralansın
timer1.Interval = 1000;
btnContinue.Visible = false; //Sadece seçilen servis duraklatıldığı durumlarda kullanılabilmesi için buton devre dışı
this.StartPosition = FormStartPosition.CenterScreen;
this.MaximizeBox = false;
this.ShowIcon = false;
}
private void frmMain_Load(object sender, EventArgs e)
{
foreach (ServiceController services in ServiceController.GetServices())
{
//Tüm servisleri çekip listboxa yazdırdım
lbxServices.Items.Add(services.DisplayName);
}
lbxServices.SelectedIndex = 0;
}
//ServiceController sınıfımdan nesnemi oluşturdum
ServiceController service = new ServiceController();
private void LbxServices_SelectedIndexChanged(object sender, EventArgs e)
{
service.DisplayName = lbxServices.SelectedItem.ToString();
lblDisplayName.Text = "Görünen Ad: " + service.DisplayName;
lblServiceName.Text = "Servis Adı: " + service.ServiceName;
lblServiceType.Text = "Servisin Tipi: " + service.ServiceType.ToString();
if (service.CanPauseAndContinue == false) //Servis durdurulup, devam ettirilebiliyor mu?
rbtnPaused.Enabled = false;
else
rbtnPaused.Enabled = true;
timer1.Enabled = true;
}
void StatusInfo()
{
if (service.Status == ServiceControllerStatus.Running)
{
rbtnRunning.Checked = true;
btnContinue.Visible = false;
}
else if (service.Status == ServiceControllerStatus.Stopped)
{
rbtnStopped.Checked = true;
btnContinue.Visible = false;
}
else if (service.Status == ServiceControllerStatus.Paused)
{
rbtnPaused.Checked = true;
btnContinue.Visible = true;
}
}
private void RbtnRunning_CheckedChanged(object sender, EventArgs e)
{
if (rbtnRunning.Checked == true && service.Status != ServiceControllerStatus.Running)
{
try
{
service.Start(); //Servis başlatılsın
//Servis başlatılana kadar program bekletilsin
service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(3));
//Servisin başlatılamama ihtimaline karşı program donmasın diye max 3 saniyelik zaman verdim
MessageBox.Show("Servis başlatıldı!","Bilgi",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
catch (Exception)
{
MessageBox.Show("Servis başlatılamadı", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
lbxServices.Select();
}
private void RbtnStopped_CheckedChanged(object sender, EventArgs e)
{
if (rbtnStopped.Checked == true && service.Status != ServiceControllerStatus.Stopped)
{
try
{
service.Stop(); //Servis durdurulsun
service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(3));
MessageBox.Show("Servis durduruldu", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception)
{
MessageBox.Show("Servis durdurulamadı ", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
lbxServices.Select();
}
private void RbtnPaused_CheckedChanged(object sender, EventArgs e)
{
if (rbtnPaused.Checked == true && service.Status != ServiceControllerStatus.Paused)
{
try
{
service.Pause(); //Servis duraklatılsın
service.WaitForStatus(ServiceControllerStatus.Paused, TimeSpan.FromSeconds(3));
MessageBox.Show("Servis duraklatıldı", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception)
{
MessageBox.Show("Servis duraklatılamadı ", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
lbxServices.Select();
}
private void Timer1_Tick(object sender, EventArgs e)
{
try
{
StatusInfo();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
timer1.Enabled = false;
}
}
//Sadece program duraklatıldığında çalışacağı için buton aksi durumlarda gizli kalacak
private void BtnContinue_Click(object sender, EventArgs e)
{
if (rbtnPaused.Checked == true && service.Status == ServiceControllerStatus.Paused)
{
try
{
service.Continue(); //Servis çalışmaya devam ettirilsin
service.WaitForStatus(ServiceControllerStatus.Running);
MessageBox.Show("Servis çalışmaya devam ediyor", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception)
{
MessageBox.Show("Servis devam ettirilemedi ", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}
Uygulamamızı çalıştıralım.
Görüldüğü gibi uygulamamız sorunsuz çalışıyor. Sorularınızı yorumlarda belirtebilirsiniz.
Talipte kalın efendim, iyi forumlar 😉