Makale Özeti

Merhabalar, Bu makalemizin konusu Windowsdaki servislerin bulunup, bir liste şeklinde gösterilmesi ve istediğiniz servisi, durdurup, yeniden başlatıp, restart edebileceğiniz bir program... Amaç Windows Servislerini ve yapabileceğiniz işlemleri biraz daha tanımak.

Makale

Windows Servislerinin Görüntülenip Yönetilmesi

Merhabalar, Bu makalemizin konusu Windowsdaki servislerin bulunup, bir liste şeklinde gösterilmesi ve istediğiniz servisi, durdurup, yeniden başlatıp, restart edebileceğiniz bir program... Amaç Windows Servislerini ve yapabileceğiniz işlemleri biraz daha tanımak.

 

İlk önce Windows servisleri nedir bunu inceleyelim. Servisler, Windows 2000 ve daha sonra gelen işletim sistemlerinde (Windows XP ve Windows 2003) mevcuttur. Servisler arkada çalışan, bilgisayarınız açıldığı anda (bir kullanıcının bilgisayara login olması gerekmeden) çalışan ve siz Windows u kapatana kadar arkada çalışabilecek programlardır. Örneğin hepimizin bildiği IIS, bir servistir. Siz bilgisayarınızı açtığınızda çalışmaya başlar ve sizin makinenize HTTP ile bağlanan kullanıcılara siz bir işlem yapmadan cevap verir.

 

Servislerin durdurulma, başlatılma, durdurup başlatılma, duraklatılma (Pause) gibi özel işlemleri vardır. İşte bizim programımızda bunları yapacak. Programımız servisleri bir listede (ListView) gösterecek ve bu listeden servisinizi seçip, durdurup başlatmak gibi yukarıda saydığım işlemleri yapmanızı sağlayacak.

 

Ama önce Windowsun servislerinin nereden görebileceğinize bakalım. Bilgisayarınıza kurulu servisleri görmek için Desktop daki My Computer (Bilgisayarım) a sağ tuş tıklayarak Manage (Yönet) a basın. Daha sonra açılacak pencerede sol taraftan Services (Hizmetler) bölümüne tıklayın. Sağ bölmede şu anda Windowsda olan servisler görüntülenir. Benim makinemde aşağıdaki şekilde.

Başlamadan önce bilmemiz gereken son şey ise her servise duraklat (pause) işlemini yapamayacağımızdır ve her servisin direk başlayamadığı bazı servislerin başlaması için bir parametreye ihtiyaç duyduğudur.

 

İlk önce bu servisleri listeleyecek programımızı yazalım. Yeni bir Windows Application açın ve adına WinSerMan yazın. Açılan formunuzun üstüne şimdilik sadece bir ListView yerleştirin, en yukarıyada Servis işlemlerini daha hızlı yapabilmemiz için System.ServiceProcess namespacesini import edin ve aşağıdaki kodları formun Load olayına yazın.

 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ListView1.View = View.Details

        ListView1.FullRowSelect = True

        ListView1.CheckBoxes = False

        ListView1.GridLines = True

        ListView1.Columns.Add("Servis Adi", -2, HorizontalAlignment.Left)

        ListView1.Columns.Add("Açıklama Yazisi", -2, HorizontalAlignment.Left)

        ListView1.Columns.Add("Durumu", -2, HorizontalAlignment.Left)

        Dim servis As ServiceProcess.ServiceController = New ServiceProcess.ServiceController

 

        For Each servis In ServiceProcess.ServiceController.GetServices

            Dim item As New ListViewItem(servis.ServiceName)

            item.SubItems.Add(servis.DisplayName)

            If servis.Status = ServiceProcess.ServiceControllerStatus.Running Then

                item.SubItems.Add("Calisiyor")

            ElseIf servis.Status = ServiceProcess.ServiceControllerStatus.Stopped Then

                item.SubItems.Add("Durmus")

            ElseIf servis.Status = ServiceProcess.ServiceControllerStatus.Paused Then

                item.SubItems.Add("Durdurulmus")

            End If

            ListView1.Items.Add(item)

        Next

 

        ListView1.SmallImageList = New ImageList

        ListView1.LargeImageList = New ImageList

    End Sub

 

Burada yaptığımız işlemleri adım adım inceleyelim. İlk bölümler ListView ile alakalı olduğundan çok fazla değinmeyeceğim ama temel olarak yaptığımız şey ListView kontrolüne 3 tane kolon eklemek ve bu 3 kolonda servisimizin detaylarını listelemek. Sonraki adımda servis isimli bir değişken yaratıyorum, bu değişkenin ServiceController dan türetildiğine dikkat edin. Böylece aslında ben temel olarak bir servis oluşturuyorum. For Each ile bu servis değişkenime ServiceController classının GetServices metodu ile bütün servisleri tek tek alıp servis değişkenime atıyorum. Daha sonraki For Each in içindeki bölümlerde ise o anda servis değişkenime atadığım servisin bilgilerini ListView e ekliyorum. İlk eklediğim bilgi Servisin ismi (ServiceName), ikinci eklediğim bilgi ise servisin görüntülenen ismi (DisplayName), servis isminden daha fazla açıklamaya sahip olan ismi, son bölüm ise o andaki durumu (Status). Bir servis normal bir zamanda ya çalışıyor (Runing) durumda olur, ya durdurulmuş durumda (Stoped) olur yada duraklatılmış durumda (Paused) olur. Bunun dışında servislerin durudurulmayı bekleyen (PausePending), çalıştırılmayı bekleyen (StartPending) gibi başka durumlarıda vardır. İsterseniz kodunuza bu durumlarıda ekleyebilirsiniz. Kodun en son bölümünde ise ListView de nesnelerimin görüntülenmesi için iki tane boş ImageList yarattım, eğer bu iki ImageList i eklemezseniz ListView de servislerinizin bilgileri görüntülenmez.

Servislerimizi gördük şimdi bu servislerimize biz bazı işlemler yaptıracağız. Bunun için formunuza ListView in altına 5 tane buton ekleyin. Butonları aşağıdaki görüntüdeki gibi isimlendirin ki sonradan bir karışıklık çıkmasın.

Adım adım yapacağımız işlemleri inceleyelim... ilk olarak ben bir enum oluşturdumki yapılacak işlemleri belirleyebileyim diye, daha sonra kullanıcı ListView den bir servis seçtikten sonra, seçili sevrisi bulduruyorum ve kullanıcının bastığı butona göre seçtiği servise bir işlem yaptırıyorum. Yukarıdaki kodunuza aşağıdaki kodları ekleyin.

 

    Public Enum Gorev

        durdur = 0

        duraklat = 1

        baslat = 2

    End Enum

 

    Public Sub IsYap(ByVal serviceName As String, ByVal neyap As Gorev, Optional ByVal BaslangicParametre As String = "")

        Dim servis As ServiceProcess.ServiceController = New ServiceProcess.ServiceController

        Try

            For Each servis In ServiceProcess.ServiceController.GetServices

                If serviceName = servis.ServiceName Then

                    If neyap = Gorev.baslat Then

                        If BaslangicParametre = "" Then

                            servis.Start()

                        Else

                            servis.Start(New String() {BaslangicParametre})

                        End If

                    ElseIf neyap = Gorev.duraklat Then

                        servis.Pause()

                    ElseIf neyap = Gorev.durdur Then

                        servis.Stop()

                    End If

                    Exit For

                End If

            Next

        Catch ex As Exception

            MsgBox("Hata oluştu, Hata Mesajı = " & ex.Message)

        End Try

        System.Threading.Thread.Sleep(3000)

        Call Yenile()

    End Sub

 

    Public Function ServisAdiBul() As String

        Dim secili As ListView.SelectedListViewItemCollection = Me.ListView1.SelectedItems

        Dim servisAdi As String

        For Each item As ListViewItem In secili

            servisAdi = (item.SubItems(0).Text)

        Next

        Return servisAdi

    End Function

 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        IsYap(ServisAdiBul, Gorev.durdur)

    End Sub

 

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim parametre As String

        parametre = InputBox("Baslangic Parametresi girmek istiyormusunuz", "parametre?")

        IsYap(ServisAdiBul, Gorev.baslat, parametre)

    End Sub

 

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        Dim sonuc As DialogResult = MessageBox.Show("Her servis duraklatilamaz" & vbNewLine & "Yinede denemek istiyormsunuz ?", "Durdurma", MessageBoxButtons.YesNo, MessageBoxIcon.Information)

        If sonuc = DialogResult.Yes Then

            IsYap(ServisAdiBul, Gorev.duraklat)

        End If

    End Sub

 

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

        Button1_Click(sender, e)

        Button2_Click(sender, e)

    End Sub

 

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

        Call Yenile()

    End Sub

 

    Private Sub Yenile()

        ListView1.Clear()

        Form1_Load(Nothing, Nothing)

    End Sub

End Class

 

İlk bölüm enum, burada yapacağım işlemleri birbir tanımladım, ileride bu işlemleri kullanacağım.

 

İkincisi ise IsYap metodum, bu metod servislerin durdurulması, başlatılması gibi işlemleri yapıyor. Üç tane parametre alıyor ilk parametre servisin ismi, böylece hangi servise işlem yapmam gerektiğini buluyorum, servisin ismini bulan metod ise hemen aşağıda. İkinci parametre ise görevi anlatıyor az önce tanımladığım enum türünden, son parametre ise optional bir parametre burada servis başlatılırken servisin başlatılması ile ilgili bir parametre soruyor kullanıyca bu parametrenin servise aktarılmasına yarıyor. Diğer kodlar ise aslında ilk yazdığımız kodlara çok benziyor. Servis değişkenimi oluştuyorum ve For Each döngüsü ile Windows daki bütün servisleri benim servisimi bulana kadar tek tek inceliyorum. Eğer kullanıcının seçtiği servis ile For Each ın o anda getirdiği servisin ismi aynı ise bu servise kullanıcının veridiği göreve göre bir işlem yaptırıyorum. Eğer başlat görevini vermişse servisin Start metodunu kullanıyorum, bu metot bir parametre alabiliyor, kullanıcı eğer servisi başatırken bir parametre vermişse bu parametreyi aktatıyorum. Diğer bölümler ise servisin duraklatılması ve durdurulması ile alakalı. Eğer benim aradığım servisi bulmuşsa For Each döngüsünden Exit For ile çıkıyorum ki diğer servisleride tek tek incelemesin ve boşuna programı yavaşlatmasın.

Try Catch bloğunun hemen altında bir Thread bloğu var, bu blok programın belli bir süre beklemesini sağlıyor, ben yarın saniye kadar programı bekletiyorum, böylece servisin sizin verdiğiniz komutu yapmasını sağlıyorum. Son olarakta verdiğiniz komuta göre servisleri tekrar listeletmek için Yenile metodunu çağarıyorum.

 

Bu bölümden sonraki metot ise bir fonksiyon, kullanıcının hangi servisi seçtiğini buluyor. ListView ile alakalı olduğundan dolayı ben bu bölüme değinmeyeceğim.

 

Diğer bölümler ise kullanıcının iş yapmak için kullandığı butonlar ilk buton Durdur butonuydu IsYap metodumu çağarıyorum ve parametrelerine servisin adı ve görevi beliriyorum. İkinci buton ise Başlat butonuydu kullanıcının bir parametre verip vermeyeceğini öğreniyorum ve ona göre IsYap fonksiyonumu çağarıyorum. Üçüncü buton ise Duraklat butonum, ilk önce kullanıcıya her Servisin duraklatılamayacağı ile ilgili bir uyarı verip, hala duraklatmayı isterse IsYap fonksiyonumu çağarıyorum. Dördüncü buton Durdur Başlat butonum burada sırasıyla ilk önce durdurma işlemini yapacak olan Buton1_Click metodunu çağarıyorum, daha sonra ise başlatma işlemini yapacak olan Button2_Click işlemini çağarıyorum.

 

Son buton ise yavaş bilgisayarlarda işlemi yaptıktan sonra hemen görüntülenmiyorsa Yenile metodunu çağaracak olan Yenile butonu.

En son fonksiyon ise Yenile fonksiyonu, bu fonksiyonda ilk önce ListView i temizliyorum daha sonra tekrar dolduruyorum.

Bu makalemizde Windows Servislerinin ne olduğunu, nasıl listeleneceğini ve nasıl bu servislere işlem yapacağınız inceledik. Eğer "şu kodlar bi yerde olsada yazmam şimdi" diye düşünüyorsanız kodları buradan indirebilirsiniz :)

 

Bu makale ile ilgili herhangi bir sorunuzda bana mail yollayabilirsiniz.

 

Levent Cenk Çağlar

cenkc@yazgelistir.com