wmismail Posted August 10, 2008 Share Posted August 10, 2008 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. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.