Powershell – Sprawdzanie stanu usługi na zdalnych komputerach

Jakiś czas temu opisałem zarządzanie usługami w Windows za pomocą Powershella. Było o listowaniu, tworzeniu, kasowaniu i kontroli (start, stop, pause). Dzisiaj, na prośbę jednego z czytelników, wykorzystamy zdobytą widzę w bardzo praktycznym scenariuszu: jak na wielu komputerach sprawdzić stan jakiejś usługi (my pójdziemy o krok dalej i włączymy usługi na tych komputerach na których nie działają :)).

Oczywiście do sprawdzenia stanu usługi, wykorzystuje się cmdlet „get-service”
get-service
…w którym jak wiecie, można sprecyzować nazwę usługi – na przykład „winrm”.

Cmdlet ten pozwala podać nazwę jednego lub wielu komputerów jako paramter (computername localhost, Serwer01, Serwer02) (bardziej zaawansowaną pętlę przedstawiam na końcu).

get-service -name winrm -computername localhost, Serwer01, Serwer02

Oczywiście wynik takiej komendy będzie mało czytelny, więc warto go sformatować (więcej o formatowaniu znajdziecie tutaj):

get-service -name winrm -computername localhost, Serwer01, Serwer02 | format-table -property MachineName, Status, Name, DisplayName -auto
get-service

A jak wyświetlić na przykład tylko te maszyny, na których dana usługa jest włączona (running)? Wykorzystajmy dodatkowy filtr „where-object”:

get-service -name winrm -computername localhost, Serwer01, Serwer02 | where-object {$_.Status -eq „Running”} | format-table -property MachineName, Status, Name, DisplayName -auto

Analogicznie, tak wyświetlimy listę maszyn, na których dana usługa jest wyłączona (stopped):

get-service -name winrm -computername localhost, Serwer01, Serwer02 | where-object {$_.Status -eq „Running”} | format-table -property MachineName, Status, Name, DisplayName -auto

Na koniec, znajdźmy i włączmy te, które nie są włączone:

get-service -name winrm -computername localhost, Serwer01, Serwer02 | where-object {$_.Status -eq „Stopped”} | start-service

Pętla czytająca nazwy komputerów z pliku

A teraz najlepsze. Wykorzystamy trochę bardziej zaawansowaną pentlę, która wczyta nazywy maszyn z pliku TXT (nazwy podajemy w osobnej linii), a następnie uruchomi usługe WINRM wszędzie tam, gdzie nie jest uruchomiona:

cls
Clear
$ErrorActionPreference = ‚silentlycontinue’
Remove-Variable [a..z]* -Scope Global
Remove-Variable [1..9]* -Scope Global
$ScriptPath = $MyInvocation.MyCommand.Path
$Dir = Split-Path $ScriptPath
Push-Location $Dir

$lista = get-Content -Path „C:\SPECE.IT\powershell\komputery.txt”
foreach ($maszyna in $lista)
{
get-service -name winrm -computername $maszyna | where-object {$_.Status -eq „Stopped”} | start-service

}

Genialne, prawda?

Łukasz Skalikow

Obecnie Manager IT. Przez lata byłem Inżynierem systemów. Jestem entuzjastą i specem od vSphere, Windows serwer, GPO. Od zawsze byłem zwolennikiem wiersza poleceń i automatyzacji. Obecnie, ze względu na pracę, rodzinę i wyjazdy służbowe, dużo mniej udzielam się na blogu, ale mam nadzieję, że pośród kilkuset porad opublikowanych na spece.it, wiele osób znajdzie dla siebie coś przydatnego :)

Przeczytaj także...

Dodaj komentarz