PowerShell ile Windows Hizmetleri Nasıl Yönetilir?
Windows hizmetlerini yalnızca services.msc ek bileşeninden veya sc.exe komut satırı aracından değil, PowerShell kullanarak da yönetebilirsiniz. Bu makalede, Windows hizmetlerini PowerShell ile yönetmenin farklı senaryolarını ele alacağız.
Windows Hizmetlerini Yönetmek için Kullanılan PowerShell Cmdlet'leri
Windows hizmetlerinin durumunu görüntülemek ve yönetmek için sekiz temel Hizmet cmdlet'i vardır. Hizmet yönetimi cmdlet'lerinin tam listesini almak için şu komutu çalıştırın:
Get-Help \*-Service-
Get-Service — yerel veya uzak bir bilgisayarda hem çalışır durumda hem de durdurulmuş durumda hizmetlerin alınmasına olanak tanır;
Yeni Hizmet - bir hizmet oluşturur. Cmdlet, kayıt defterinde ve hizmet veritabanında bir Windows hizmeti için yeni bir girdi oluşturur;
Restart-Service - bir hizmeti yeniden başlatır. Cmdlet, yeniden başlatma mesajını Windows Hizmet Denetleyicisi aracılığıyla gönderir;
Hizme Devam Ettir - bir hizmeti devam ettirir. Cmdlet, Windows Service Manager'a bir özgeçmiş iletisi gönderir;
Set-Service — durumu, açıklaması, görüntülenen adı veya başlangıç modu dahil olmak üzere yerel veya uzak bir hizmetin ayarlarını değiştirir. Bu cmdlet'i bir hizmeti başlatmak, durdurmak veya askıya almak için de kullanabilirsiniz;
Hizmeti Başlat - bir hizmeti başlatır;
Hizmeti Durdur - bir hizmeti durdurur (cmdlet, Windows Hizmet Yöneticisine bir durdurma mesajı gönderir);
Hizmeti Askıya Al - bir hizmeti askıya alır. Askıya alınmış bir hizmet hala çalışıyor, ancak (örneğin, Resume-Service cmdlet'i ile) kullanılarak sürdürülene kadar hiçbir şey yapmıyor.
Belirli bir cmdlet'i Get-Help ile kullanmanın ayrıntılı açıklamasını ve örneklerini alabilirsiniz:
Get-Help Start-ServiceGet-Service ile Windows Hizmet Durumu Nasıl Kontrol Edilir?
Get-Service cmdlet'ini kullanarak yerel veya uzak bir bilgisayardaki hizmetlerin listesini ve durumlarını (Çalışıyor/Durduruldu) alabilirsiniz. -Ad parametresi, hizmetlerin ada göre seçilmesini sağlar. Hizmet adı, joker karakteri kullanılarak belirtilebilir.
*.
Tam hizmet adını bilmiyorsanız, -GörünenAdı parametresini kullanarak görüntülenen adıyla bulabilirsiniz. Değerler ve joker karakterler listesini kullanabilirsiniz.
Uzak bir bilgisayarda hizmet durumunu almak için -ComputerName parametresiyle Get-Service cmdlet'ini kullanın. Adlarını virgülle ayırarak belirterek birden çok uzak bilgisayardaki hizmet durumunu aynı anda sorgulayabilirsiniz. Örneğin, aşağıda gösterilen komut, ny-prnt1 ve ny-prnt2 uzak bilgisayarlarında Biriktirici hizmet durumunu alır.
Get-Service spooler -ComputerName ny-prnt1,ny-prnt2Status Name DisplayName
------ ---- -----------
Running spooler Print Spooler
Stopped spooler Print SpoolerBir hizmetin tüm özelliklerini görüntülemek için Nesne Seç cmdlet'ini kullanın:
Get-Service spooler | Select-Object *Select-Object cmdlet'i, bir hizmetin belirli özelliklerini almaya izin verir. Örneğin, Biriktirici hizmetinin adını, durumunu ve kullanılabilir seçeneklerini görüntülemek istiyorsunuz:
Get-Service Spooler | Select DisplayName,Status,ServiceName,Can*
Get-Service cmdlet'inde, hizmet bağımlılıklarını görüntülemenizi sağlayan iki parametre bulunur:
-DependentServices, verilen hizmete bağlı hizmetlerin görüntülenmesini sağlar
-RequiredServices verilen hizmetin bağlı olduğu hizmetleri gösterir
Aşağıdaki komut, Biriktirici hizmetini başlatmak için gereken hizmetleri görüntüler:
Get-Service -Name Spooler -RequiredServicesAşağıdaki komut, Biriktiriciye bağlı olan hizmetleri gösterir:
Get-Service -Name Spooler -DependentServicesBelirli durum veya parametrelere sahip hizmetleri bulmak istiyorsanız Where-Object cmdlet'ini kullanın. Örneğin, çalışan servislerin listesini alalım:
Get-Service | Where-Object {$_.status -eq 'running'}Hizmetleri manuel başlatma türüyle görüntülemek için şu komutu çalıştırın:
Get-Service | Where-Object {$_.starttype -eq 'Manual'}Geçerli bir bilgisayarda belirli bir Windows hizmeti olup olmadığını kontrol etmek için aşağıdaki PowerShell betiğini kullanın:
if (Get-Service "ServiceTest" -ErrorAction SilentlyContinue)
{
Write-host "ServiceTest exists"
}PowerShell ile Hizmet Nasıl Durdurulur, Başlatılır veya Yeniden Başlatılır?
Stop-Service cmdlet'ini kullanarak bir hizmeti durdurabilirsiniz. Biriktiriciyi durdurmak için şu komutu çalıştırın:
Stop-Service -Name spoolerStop-Service cmdlet'i yürütmeden sonra hiçbir şey göstermez. Sonucu görmek için -PassThru parametresini kullanın.
Lütfen her hizmetin durdurulamayacağını unutmayın. Herhangi bir bağımlı hizmet varsa, bir hata görürsünüz:
Cannot stop service because it has dependent services. It can only be stopped if force flag set.Bir hizmeti durmaya zorlamak için -Zorla parametresini kullanın. Tüm bağımlı hizmetlerin de duracağını unutmamalısınız:
Stop-Service samss -Force -PassthruAşağıdaki komut, "Çalışıyor" durumundaysa, belirtilen hizmetleri (bitler, biriktirici) durduracaktır:
get-service bits,spooler | where {$_.status -eq 'running'} | stop-service -passthruBazen hizmetler "Duruyor" durumunda takılır ve zorla öldürülmesi gerekir.
Start-Service cmdlet'i durdurulan bir hizmeti başlatır:
Start-Service -Name spooler -PassThruBir hizmet, bağımlı hizmetlerinden herhangi biri durdurulursa başlamaz. Bunları bulmak ve başlatmak için aşağıdaki tek satırlık PowerShell'i kullanın:
get-service samss | Foreach { start-service $_.name -passthru; start-service $_.DependentServices -passthru}Suspend-Service cmdlet, hizmetleri bu durumu destekliyorsa duraklatabilir. Bir hizmetin askıya alınıp alınamayacağını öğrenmek için Get-Service cmdlet'ini CanPauseAndContinue özelliğiyle kullanın.
Get-Service samss | Format-List name, canpauseandcontinueDuraklatılmış olabilecek tüm hizmetlerin listesini görüntülemek için şu komutu çalıştırın:
Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"}SQLBrowser hizmetini askıya alalım:
Suspend-Service -Name SQLBrowserAskıya alınan bir hizmeti sürdürmek için Hizmeti Sürdür cmdlet'ini kullanın:
Resume-Service -Name SQLBrowserAşağıdaki komut askıya alınan tüm hizmetleri devam ettirecektir:
get-service | where-object {$_.Status -eq "Paused"} | resume-serviceRestart-Service cmdlet'i bir hizmeti yeniden başlatır:
Restart-Service -Name spoolerBu komut, bir bilgisayarda durdurulan tüm ağ hizmetlerini başlatır:
get-service net* | where-object {$_.Status -eq "Stopped"} | restart-serviceBu komutların -BilgisayarAdı parametresi yoktur, ancak bunları Invoke-Command cmdlet'i veya bir kanal kullanarak uzak bir bilgisayarda çalıştırabilirsiniz.
Örneğin, ny-prnt1 uzak bilgisayarında bir yazdırma biriktiricisini yeniden başlatmak için şu komutu çalıştırın:
Get-Service Spooler -ComputerName ny-prnt1 | Start-ServiceVarsayılan olarak, yalnızca yöneticiler Windows hizmetlerini başlatabilir/durdurabilir, ancak yönetici olmayan kullanıcılara belirli bir hizmette başlatma/durdurma/yeniden başlatma izinleri verebilirsiniz.
Hizmet Ayarlarını Değiştirmek için Set-Service Kullanma
Set-Service cmdlet'i, yerel veya uzak bir bilgisayardaki bir hizmetin tüm parametrelerini veya ayarlarını değiştirmenize olanak tanır. Bir hizmetin durumu bir özellik olduğundan, bir hizmeti başlatmak, durdurmak veya askıya almak için bu cmdlet'i kullanabilirsiniz. Set-Service, bir hizmetin başlangıç türünü değiştirmeye izin veren -StartupType parametresine sahiptir.
Biriktirici başlangıç türünü otomatik olarak değiştirelim:
Set-Service spooler -startuptype automatic -passthruManuel başlatma türünü ayarlayabilirsiniz:
Set-Service spooler -startuptype manual -passthruPowerShell ile Windows Hizmeti Nasıl Oluşturulur veya Silinir?
New-Service - Windows'ta yeni bir hizmet oluşturmak için kullanılan bir cmdlet'tir. Yeni hizmet için adı ve yürütülebilir dosyayı belirtin (Windows hizmeti olarak bir PowerShell betiğini bile çalıştırabilirsiniz).
TestSvc adında yeni bir servis oluşturalım:
new-service -name TestSvc -binaryPathName "C:\WINDOWS\System32\svchost.exe -k netsvcs"Get-WmiObject cmdlet'ini kullanarak hizmetin başlangıç türü ve açıklaması hakkında bilgi edinin.
get-wmiobject win32_service -filter "name='testservice'"Aşağıdaki komutu kullanarak yeni hizmetin ayarlarını değiştirebilirsiniz:
Set-Service -Name TestSvc -Description ‘My Service’ -StartupType ManualBir hizmeti silmek için şu komutu çalıştırın:
(Get-WmiObject win32_service -Filter ″name=′TestSvc′″).delete()Windows Hizmetini Çalıştıran Kullanıcı Hesabını Değiştirme
Bir hizmeti başlatmak için kullanılan kullanıcı hesabını değiştirmek için PowerShell'i kullanabilirsiniz. TestSvc'yi başlatmak için kullanılan hesabın adını alın:
get-wmiobject win32_service -filter "name='TestSvc'" | Select name,startnameBir Windows Hizmetinin kullanıcı adını ve parolasını değiştirmek için aşağıdaki komutları çalıştırın:
$svc = get-wmiobject win32_service -filter "name='TestSvc'"
$svc.GetMethodParameters("change")Change() yöntemi parametrelerinin listesi görüntülenir. StartName ve StartPassword parametrelerinin nerede olduğunu sayın: sırasıyla 20th ve 21st sıralarında bulunurlar.
$svc | Invoke-WmiMethod -Name Change -ArgumentList @ ($null,$null,$null,$null,$null,$null,$null, $null,$null,$null,$null,$null,$null,$null,$null,$null, $null,$null,$null,"Administrator","!123Pa$$w0rd")Veya bir gMSA hesabının adını girebilirsiniz (bu durumda hesap şifresi belirtilmez).
Gördüğünüz gibi PowerShell, Windows hizmetlerini yönetmeyi kolaylaştırıyor. Hizmetleri oluşturabilir, durdurabilir, başlatabilir veya devam ettirebilir ve özelliklerini değiştirebilirsiniz. Çoğu cmdlet, uzak bilgisayarlardaki hizmetleri yönetmeye izin verir.


























