Windows Servislerini yönetmek için Get-service, Set-Service, New-Service gibi komutları görmüştük. Şimdi de WMI kullanarak servis yönetimi nasıl yapılır ona bir bakalım.
WMI çok kuvvetli bir platform. Dolayısıyla Powershell içerisinden WMI kullanarak Windows içinde sayısız görevi yerine getirebilirsiniz.
Biz konumuza yani servislere geri dönelim. Öncelikle tüm servisleri listelemek için WMI şu şekilde kullanılmalıdır.
Get-WmiObject win32_Service
Ben biraz daha düzgün görünümlü olması için sadece servis ismini ve durumunu çektim.
Get-WmiObject win32_Service | ft name,state
Get-WMiobject komutu ile kullanabileceğim member listesi için (property, method vs.) hemen komutun sonuna Get-Member’i ekliyorum.
Get-WmiObject win32_Service | Get-Member
Kullanabileceğim tüm property ve method’lar çıktı. Artık komutumla birlikte kullanacağım servisimin hangi özelliklerini görüntüleyebiliyorum, hangilerini değiştirebiliyorum artık biliyorum. Property olanlar özelliklerinden her birini gösterirken, method olanlar ise verebileceğim komutları ifade ediyor. Örneğin; bir servisin ismi Name adlı Property ile ifade ediliyor. Bu property’yi çağırdığımda servisin ismini öğrenebiliyorum. Çünkü bu bir Property.
Method ile ise örneğin bir servisi durdurabiliyorum. Çünkü bir method ile bir eylem gerçekleştirilir.
Şimdi örnek olarak WinRM servisini ele alıyoruz ve önce bu servisi listeliyoruz.
Get-WmiObject -Query "select * from win32_service where name='WinRM'"
Bir başka yolu da Filter parametresini kullanmak.
Get-WmiObject win32_Service -Filter "name='WinRM'"
Daha basit bir şekilde yapamaz mıyız?
Get-WmiObject win32_service | where{$_.name –eq "WinRM"}
Evet görüldüğü gibi her 3 şekilde de WinRM servisinin listelendiğini görüyorum.
Şimdi servise ait property’lerden 2-3 tanesini çağırayım ve bir değişkene atayarak göstereyim.
Görülüğü gibi komutun tamamını parantez içine alarak sonra nokta işareti ve dilediğim Property’yi yazarak sadece o bilgiyi çekebiliyorum.
Powershell’in en önemli özelliklerinden ve en yaygın kullanım alanlarından biri de budur işte. Mesela bana acilen WinRM servisinin o anki durumu gerekiyorsa bunu bulmak için yukarıdaki komutu bie değişkene atayıp daha sonra ihtiyacın olduğunda çağırabilirim.
$winrm_servisinin_durumu=(Get-WmiObject win32_service | where{$_.name –eq "WinRM"}).state
Artık “$winrm_servisinin_durumu” isimli değişkeni her çağırışımda aşağıdaki gibi bana WinRM servisinin o anki durumunu verecektir.
Running!
Şimdi biraz da Method’ları kullanalım ve servisin ayarlarını değiştirelim.
Servisin başlangıç tipini Manual olarak belirleyelim
(Get-WmiObject win32_service | where{$_.name –eq "WinRM"}).changestartmode("Manual")
Servisin başlangıç tipini Automatic olarak belirleyelim
(Get-WmiObject win32_service | where{$_.name –eq "WinRM"}).changestartmode("Automatic")
Servisi başlatalım
(Get-WmiObject win32_service | where{$_.name –eq "WinRM"}).Startservice()
Servisi durduralım
(Get-WmiObject win32_service | where{$_.name –eq "WinRM"}).stopservice()
Konumuzun dışlında olabilir ancak komut satırından da (cmd.exe) SC komutuyla servislerinizi yönetebilirsiniz. Elbette powershell kadar esnek değil.
Sorular için bakionur@bakionur.com