Get-Service w PowerShell, jakiś czas temu, przedstawiłem 10 najpopularniejszych poleceń PowerShell, w tym chciałbym przyjrzeć się dokładniej jednemu z nich, czyli Get-Service.
Usługi w systemie Windows są jedną z najważniejszych części systemu operacyjnego. Wcześniej, aby uzyskać stan usługi w systemie Windows, trzeba było użyć graficznej przystawki services.msc lub narzędzia wiersza polecenia sc.exe (na przykład zapytania sc.exe wuauserv). W tym artykule przyjrzymy się, jak sprawdzić status usługi w systemie Windows za pomocą PowerShell.
Możesz użyć polecenia cmdlet Get-Service PowerShell, aby uzyskać listę wszystkich usług zainstalowanych w systemach operacyjnych Windows, ich stan i typ uruchamiania. Ten i inne polecenia cmdlet, które służą do uzyskiwania statusu i zarządzania usługami Windows, po raz pierwszy pojawiły się w PowerShell 1.0. W tym artykule pokażę typowe przykłady użycia cmdletu Get-Service do uzyskania statusu usługi na komputerach lokalnych lub zdalnych (uruchomiona lub zatrzymana). Przedstawię również typ uruchamiania usług o zależności pomiędzy usługami.
Listę usług na komputerze lokalnym lub zdalnym można uzyskać za pomocą polecenia cmdlet Get-Service. Uruchomienie polecenia Get-Service bez parametrów zwraca listę wszystkich usług na komputerze lokalnym.
Aby uzyskać pełną składnię polecenia cmdlet Get-Service, uruchom polecenie:
1 |
Get-Help Get-Service |
Użyj Get-Service, aby sprawdzić stan usługi Windows
To polecenie wyświetli listę wszystkich lokalnych usług Windows, ich status (uruchomiony, zatrzymany lub wstrzymany) i nazwę wyświetlaną:
1 |
Get-Service |
Polecenie cmdlet zwraca listę usług posortowanych według nazwy. Lista zawiera następujące właściwości usługi Windows:
Stan (State) — pokazuje, czy serwer jest uruchomiony, czy zatrzymany.
Nazwa (Name)— wyświetla skróconą nazwę usługi (używaną najczęściej).
Wyświetlana nazwa (DisplayName) — pełna nazwa usługi (bardziej opisowa i czytelna dla człowieka).
Aby zapisać listę usług w pliku tekstowym do późniejszego zbadania, użyj polecenia cmdlet Out-File:
1 |
Get-Service | Out-File "C:\temp\Local_Services.txt" |
Aby uzyskać dwa lub więcej stanów usługi, musisz podać ich nazwy rozdzielone przecinkami:
1 |
Get-Service bits, wuauserv |
Jeśli chcesz wyświetlić tylko uruchomione usługi, użyj tego polecenia:
1 |
Get-Service | Where-Object {$_.Status -EQ "Running"} |
Operator potoku (|) przekazuje wyniki do polecenia cmdlet Where-Object, które wybiera tylko te usługi, dla których parametr Status ma wartość „Running”. Jeśli chcesz wyświetlić tylko zatrzymane usługi, określ „Stopped”.
Możesz uzyskać wszystkie właściwości obiektu usługi za pomocą metody Get-Member.
1 |
Get-Service | Get-Member |
Jak widać, obiekty te mają nazwę typu — System.ServiceProcess.ServiceController. Zrzut ekranu pokazuje wszystkie dostępne właściwości i metody obiektów usług w systemie Windows (większość z nich nie jest używana podczas wyświetlania domyślnie).
Możesz wyświetlić właściwości określonej usługi. Na przykład musimy wyświetlić nazwę wyświetlaną (DisplayName), status i funkcje usługi Windows Update (wuauserv):
1 |
Get-Service wuauserv | select Displayname,Status,ServiceName,Can* |
Możesz znaleźć wszystkie usługi, które można wstrzymać i wznowić bez ponownego uruchamiania systemu Windows:
1 |
Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"} |
Na przykład, aby uzyskać typ uruchamiania usług Windows, uruchom polecenie (działa w PowerShell 5.1, wprowadzonym w Windows 10/Windows Server 2016):
1 |
Get-Service | select -property name,starttype |
Jeśli chcesz uzyskać tylko typ uruchomienia usługi, uruchom:
1 |
(Get-Service -Name wuauserv).StartType |
Istnieją 4 możliwe stany, w których mogą znajdować usługi:
Automatyczne (Automatic) — automatyczne uruchamianie podczas uruchamiania systemu Windows.
(Automatyczny opóźniony start) Automatic Delayed Start — uruchamianie po starcie systemu.
Ręczny (Manual) — uruchamianie ręczne.
Wyłączona (Disabled)— usługa jest wyłączona.
Możesz filtrować listę usług według nazwy usługi, używając gwiazdki jako symbolu wieloznacznego:
1 |
Get-Service wi* |
Należy również zauważyć, że PowerShell nie rozróżnia wielkości liter. Oznacza to, że następujące polecenia zwrócą równe wyniki:
1 2 3 |
Get-Service win* Get-Service WIN* |
Aby wykluczyć niektóre usługi z wynikowej listy, możesz użyć opcji -Exclude:
1 |
Get-Service -Name "win*" -Exclude "WinRM" |
Możesz sortować usługi w porządku malejącym według wartości właściwości Status (usługi uruchomione są wyświetlane wcześniej niż zatrzymane):
1 |
Get-Service s* | sort-object status – Descending |
Dość częstym zadaniem administratora podczas rozwiązywania problemów z systemem Windows jest sprawdzenie, które z usług systemu Windows, które powinny być uruchamiane automatycznie, są obecnie zatrzymane. Możesz użyć opcji FilterScript, aby wyszukać usługi, które mają typ automatycznego uruchamiania i nie są aktualnie uruchomione:
1 |
Get-Service | where -FilterScript {$_.Status -ne 'Running' -and $_.StartType -eq 'Automatic'} | ft 'Name','StartType','Status' |
Należy również zauważyć, że PowerShell Core 7.x wprowadza dodatkowe właściwości Get-Service, które nie są dostępne w Windows PowerShell 5.1 (na przykład UserName, BinaryPathName, StartType). Wartość tych właściwości można uzyskać w konsoli pwsh.exe (PowerShell 7.x).
1 |
Get-Service wuauserv | select Username,Starttype,BinaryPathName |
Jak sprawdzić, czy określona usługa istnieje za pomocą PowerShell?
Jeśli chcesz sprawdzić, czy dana usługa Windows aktualnie istnieje, możesz użyć następujących poleceń (zwykle to sprawdzenie jest używane w różnych skryptach):
1 2 3 4 5 6 7 8 9 |
$servicename = "wuauserv" if (Get-Service $servicename -ErrorAction SilentlyContinue) { Write-Host "$servicename exists" } Else { Write-Host ” $servicename doesn't exists” } |
Możesz sprawdzić, czy określona usługa Windows istnieje na liście zdalnych komputerów/serwerów. Aby wykonać to zadanie, musisz zapisać listę komputerów zdalnych w pliku tekstowym computers.txt w prostym formacie:
1 2 3 4 5 6 7 8 9 |
server01 server02 server03 PC021 PC034 |
Teraz uruchom następujący skrypt PowerShell:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$servicename = "wuauserv" $list = get-content "c:\temp\computers.txt” foreach ($server in $list) { if (Get-Service $servicename -computername $server -ErrorAction 'SilentlyContinue') { Write-Host "$servicename exists on $server " } else {write-host " $servicename not found on $server."} } |
Użyj programu PowerShell, aby sprawdzić stan usługi na komputerze zdalnym
Możesz użyć polecenia cmdlet Get-Service, aby uzyskać status usług nie tylko na komputerach lokalnych, ale także na komputerach zdalnych. W tym celu użyj parametru –ComputerName. Jako nazwy komputera można użyć nazwy NetBIOS, nazwy FQDN lub adresu IP. Połączenie z komputerami zdalnymi jest nawiązywane nie przez PowerShell Remoting (WinRM), ale przez Service Manager (podobnie jak polecenie sc.exe).
1 |
Get-Service wuauserv -ComputerName remotePC01 |
W PowerShell v3 możesz uzyskać status usług na wielu zdalnych komputerach jednocześnie (ich nazwy muszą być oddzielone przecinkami).
1 |
Get-Service spooler -ComputerName remotePC01,remotePC02, remotePC03| format-table Name,Status,Machinename –autosize |
W tym przykładzie użyj polecenia cmdlet format-table, aby uzyskać wygodniejszą tabelę z listą stanu usług.
Możesz także sprawdzić stan usługi na liście komputerów zdalnych. Jest przechowywany w zwykłym pliku tekstowym:
1 2 3 |
$list = get-content "c:\temp\computers.txt" Get-Service -Computername (Get-Content -path "c:\temp\computers.txt") -Name spooler | Select-Object MachineName,Name,Displayname,Status | Sort-Object Status |
Lub możesz sprawdzić stan usługi na wszystkich komputerach w określonej jednostce organizacyjnej AD:
1 2 3 4 5 6 7 8 9 |
$Computers = (Get-ADComputer -SearchBase 'OU=Servers,OU=PL,DC=beitadminpl,DC=local').names foreach ($computer in $computers) { Get-Service -ComputerName $computer.Name -Name wuauserv | Where-Object {$_.status -eq "running"} | select status,name,machinename } |
Aby ponownie uruchomić usługę na komputerze zdalnym, użyj następującego polecenia:
1 |
Get-Service wuauserv -ComputerName server1| Restart-Service |
WAŻNE
Polecenie cmdlet Get-Service w PowerShell Core (PowerShell 6.x i 7.x), w przeciwieństwie do Windows PowerShell 5.1, nie ma parametru ComputerName, więc nie można go używać do sprawdzania stanu usług na komputerach zdalnych.
Aby uzyskać dostęp do komputerów zdalnych z programu PowerShell Core, należy użyć usługi PowerShell Remoting za pośrednictwem usługi WinRM. Na przykład możesz sondować stan usług na wielu komputerach zdalnych za pomocą polecenia Invoke-Command. Na przykład:
1 2 3 |
$cred = Get-Credential Invoke-Command -ComputerName dc03,dc02 {get-service wuauserv} -Credential $cred |
Użyj Get-Service, aby wyświetlić zależności usług
Polecenie cmdlet Get-Service ma dwa inne przydatne parametry, których można użyć podczas zarządzania usługami systemu Windows. Parametr DependentServices zwraca usługi zależne od tej usługi. Parametr RequiredServices zwraca usługi, od których zależy ta usługa.
Następujące polecenie odbiera usługi, które należało uruchomić przed uruchomieniem usługi LanmanWorkstation:
1 |
Get-Service -Name LanmanWorkstation –RequiredServices |
Następne polecenie zwraca usługi zależne, które wymagają usługi LanmanWorkstation:
1 |
Get-Service -Name LanmanWorkstation -DependentServices |
Jeśli ręcznie zatrzymasz wszystkie usługi zależne, nie będziesz mógł uruchomić swojej usługi. Aby automatycznie uruchamiać wszystkie usługi zależności, użyj następującego jednolinijkowego programu PowerShell:
1 |
Get-Service wuauserv| Foreach {start-service $_.name -passthru; start-service $_.DependentServices -passthru} |
Zarządzanie usługami Windows za pomocą PowerShell
W module PowerShell dostępne są inne przydatne polecenia cmdlet do zarządzania usługami. Aby wyświetlić listę wszystkich dostępnych poleceń PowerShell używanych do zarządzania usługami Windows, uruchom:
1 |
Get-Command -Noun Service |
Za pomocą tych poleceń cmdlet można uruchamiać, zatrzymywać, ponownie uruchamiać lub zmieniać typ uruchamiania usługi.
Aby zarządzać usługami, uruchom program powershell.exe jako administrator. Musisz uruchomić, zatrzymać, ponownie uruchomić lub zmienić typ uruchamiania usługi.
Zatrzymaj usługę:
1 |
Stop-Service -Name Windefend |
Gdy zatrzymasz niektóre usługi, może pojawić się błąd:
Stop-Service: Cannot stop service ‘SQL Server (MSSQLSERVER) (MSSQLSERVER)’ because it has dependent services. It can only be stopped if the Force flag is set.
Aby wymusić zatrzymanie tej i usługi zależnej, użyj parametru -Force:
1 |
Stop-Service –Name MSSQLSERVER -Force |
Uruchom usługę:
1 |
Start-Service -Name Windefend |
Uruchom ponownie usługę:
1 |
Restart-Service -Name Windefend |
Jeśli chcesz zmienić typ uruchamiania usługi (na przykład z automatycznego na wyłączony), uruchom:
1 |
Set-Service 'WinRM' -StartupType Disabled |
Niektóre usługi systemu Windows można zawiesić za pomocą polecenia Suspend-Service:
1 |
Get-Service -Name 'wuauserv'|Suspend-Service |
Jeśli spróbujesz zawiesić usługę, która nie obsługuje tej metody, pojawi się błąd:
Suspend-Service : Service ‘Windows Update (wuauserv)’ cannot be suspended because the service does not support being suspended or resumed.
Aby znaleźć usługi systemu Windows, które możesz wstrzymać, uruchom polecenie:
1 |
Get-Service | where CanPauseAndContinue | select -Property Name,CanPauseAndContinue,DisplayName |
Polecenie Resume-Service służy do uruchamiania zawieszonej usługi:
1 |
Get-Service -Name 'Winmgmt' | Suspend-Service | Resume-Service |
Aby utworzyć nową usługę za pomocą komendy New-Service, należy podać jej nazwę i ścieżkę do pliku binarnego:
1 |
New-Service -Name 'MyService' -BinaryPathName 'C:\temp\test.exe' |
Aby usunąć usługę:
1 |
Remove-Service -Name 'MyNewService' |
WAŻNE
Polecenie cmdlet Remove-Service jest dostępne w programie PowerShell Core 6.x +.
Podsumowanie
Get-Service pozwala na zaawansowane zarządzanie usługami systemu Windows. Zarządzanie dotyczy zarówno usług, które działają lokalnie, jak i tych działających na innych maszynach (zdalnie).
Z jego pomocą możliwe jest zatrzymywanie usług, wznawianie a także tworzenie własnych usług.
Myślę, że Get-Service warto znać, aby pomagał w codziennej pracy w usługami.
Dziękuję Ci, za poświęcony czas na przeczytanie tego artykułu. Jeśli był on dla Ciebie przydatny, to gorąco zachęcam Cię do zapisania się na mój newsletter, jeżeli jeszcze Cię tam nie ma. Proszę Cię także o “polubienie” mojego bloga na Facebooku oraz kanału na YouTube – pomoże mi to dotrzeć do nowych odbiorców. Raz w tygodniu (niedziela punkt 17.00) otrzymasz powiadomienia o nowych artykułach / projektach zanim staną się publiczne. Możesz również pozostawić całkowicie anonimowy pomysł na wpis/nagranie.
Link do formularza tutaj: https://beitadmin.pl/pomysly
Pozostaw również komentarz lub napisz do mnie wiadomość odpisuję na każdą, jeżeli Masz jakieś pytania:).