Usługi systemu pod kontrolą
Za pomocą środowiska Windows PowerShell możesz zarządzać praktycznie każdą funkcją Windows, na przykład usługami systemowymi. Ich odpowiednia konfiguracja uczyni twój komputer szybszym i bezpieczniejszym.
W poprzednich numerach PC Formatu dowiedziałeś się, czym jest Windows PowerShell (a także skąd pobrać oprogramowanie i jak je zainstalować; jeżeli masz Windows 7, to masz już PowerShella wbudowanego) i co to są polecenia cmdlets. Poznałeś sposób na wyłączenie ograniczeń uniemożliwiających uruchamianie skryptów. Napisałeś także swój pierwszy skrypt, za którego pomocą możesz uzyskać raport informujący o uruchomionych procesach (archiwalne artykuły znajdziesz na naszej stronie internetowej).
Tym razem dowiesz się, w jaki sposób możesz – za pomocą poleceń i skryptów PowerShell – zarządzać usługami Windows. Warto wiedzieć, jakie usługi są uruchomione, żeby uczynić komputer szybszym i bezpieczniejszym.
Stosowanie poleceń informujących o usługach Windows
Chcąc otrzymać pełną listę usług systemowych w twoim systemie operacyjnym, nie musisz tworzyć całego skryptu. Informacje o usługach łatwo uzyskasz za pomocą dwóch przydatnych poleceń PowerShella: Get-Service oraz Get-WmiObject. Przećwiczymy ich działanie w praktyce.
Krok 1
Uruchom środowisko Windows PowerShell ISE (skrót do Windows PowerShell ISE znajdziesz w menu Start). Następnie w oknie Windows PowerShell ISE wpisz (w dolnej części) polecenie Get-Service i wciśnij klawisz [Enter].
Krok 2
W środkowej części okna zobaczysz wynik z konsoli. Jest to podzielona na trzy kolumny lista wszystkich usług obecnych w systemie. O stanie każdej usługi masz informację (kolumna ; usługa może być np. uruchomiona lub zatrzymana Stopped), nazwę wewnętrzną (systemową) usługi (kolumna Name; wg tej kolumny jest posortowana cała lista) oraz nazwę wyświetlaną (kolumna DisplayName).
Krok 3
Sam spis usług, i to niezależnie od ich stanu, nie jest szczególnie użyteczny. Spis wszystkich usług otrzymasz również, korzystając z systemowej konsoli administracyjnej Usługi. Znacznie użyteczniejszą i prostą wskazówką, że coś się dzieje z usługami, jest choćby zmiana ich liczby. Zliczanie usług za pomocą wygodnej konsoli Usługi jest dość kłopotliwe. Znacznie lepiej posłużyć się poznanym właśnie poleceniem wzbogaconym o tzw. właściwość Length (z ang. długość). W oknie Windows PowerShell ISE (w dolnej części) wpisz tym razem (Get-Service).length i wciśnij [Enter].
Krok 4
Zamiast długiej listy usług otrzymasz tym razem jedną liczbę (w naszym przykładzie była to liczba 173) określającą, ile jest usług w systemie. Użycie nawiasów wymusza najpierw wykonanie polecenia w nich zamkniętego, a dopiero potem następuje „odpytanie” właściwości Length, która w tym przypadku zlicza liczbę obiektów zwracanych przez polecenie GetService.
Krok 1
Zakładamy, że środowisko PowerShell ISE masz już uruchomione, wpisz w dolnej części polecenie Get-WmiObject win32_service i wciśnij [Enter].
Krok 2
Na wyjściu konsoli (środkowa część okna Windows PowerShell ISE) zobaczysz długą listę kolejno opisanych usług systemowych. Każdy zbiór danych dotyczących pojedynczej usługi zawiera nie tylko nazwę (wewnętrzną) usługi, ale m.in. identyfikator procesu, w którego ramach dana usługa działa – ProcessId, tryb uruchomienia usługi – StartMode czy aktualny stan usługi – State. Już przy domyślnych parametrach polecenie zwraca znacznie więcej danych niż Get-Service, ale prawdziwa siła polecenia Get-WmiObject polega na tym, że pozwala ono wydobyć, a także zmodyfikować informacje dotyczące każdego obiektu zarządzanego przez podsystem WMI (Windows Management Instrumentation).
Krok 3
Zapewne zauważyłeś, że oprócz polecenia Get-WmiObject trzeba również podać nazwę klasy (tu: win32_service), za której pośrednictwem polecenie pobierze informacje na temat obiektów (tu: usług systemowych). Liczba metod i właściwości tej klasy jest na tyle bogata, że możesz uzyskać bardzo rozbudowany zestaw informacji na temat usług systemowych. Zainteresowanych szczegółami odsyłamy do zamieszczonego w serwisie MSDN – Windows Dev Center referencyjnego opisu tej klasy wraz z jej metodami i właściwościami pod adresem http://pcformat.pl/u/222.
Krok 4
Oczywiście do samego wylistowania usług, czy zliczenia ich, znacznie łatwiej posługiwać się poznanym wcześniej poleceniem GetService. Potencjał Get-WmiObject lepiej wykorzystasz przy tworzeniu rozbudowanych raportów lub skryptów zmieniających konfigurację usług, to jednak materiał na odrębny artykuł. W bieżącym posłużymy się jak najprostszymi poleceniami PowerShell.
Skrypt: prosty raport z uruchomionych usług
Za pomocą poniższego skryptu będziesz mógł w dowolnym momencie otrzymać raport (w formie pliku TXT) zawierający listę aktualnie uruchomionych w systemie usług.
Krok 1
Uruchom środowisko PowerShell ISE i w górnej części okna wpisz pokazany tu skrypt:
Krok 2
W pierwszych dwóch liniach wprowadzasz do skryptu potrzebne zmienne i przyporządkowujesz im wartości. Pierwsza zmienna będzie oznaczała poszukiwany stan usług (running, czyli uruchomione), natomiast druga określa ścieżkę dostępu do wynikowego pliku. Uwaga, folder, w którym wynikowy plik będzie zapisany (tu: C:\PShell) musi już istnieć na dysku.
Krok 3
Pozostałe linie zawierają trzy polecenia oddzielone tzw. znakami potoku (pionowa kreska widoczna na końcu wiersza 4 i 5). Wyjaśnienie tego fragmentu kodu jest następujące: najpierw żądasz pobrania informacji o usługach. Do tego celu wykorzystujesz znane ci już polecenie Get-Service. Nie interesuje cię jednak informacja o wszystkich usługach, lecz tylko uruchomionych, dlatego wynik działania Get-Service przekazujesz (znak potoku) do kolejnego polecenia Where-Object.
Krok 4
Polecenie Where-Object pozwala filtrować otrzymane dane. W nawiasie klamrowym widoczna jest konstrukcja filtru. Najpierw z bieżącego potoku danych wyłapywane są wartości określające stan (ang. status) usługi (zmienna $_.status; zmienna $_ jest w PowerShell zmienną specjalną odwołującą się do bieżącego elementu potoku). Następnie za pomocą operatora porównania oznaczającego równość (-eq) informujesz system, by poszukiwał tylko takich obiektów, które mają stan określony przez zmienną $stanuslugi, czyli w naszym przykładzie: uruchomionych usług. Po zamknięciu nawiasu klamrowego widoczny jest kolejny znak potoku, co oznacza, że wynik działania filtra jest przekierowany do kolejnego polecenia.
Krok 5
Za pomocą ostatniego polecenia skrypt wygeneruje plik wynikowy w miejscu wskazywanym przez zmienną $wynik.
Skrypt: zatrzymywanie niepotrzebnych usług
Proponujemy skrypt korzystający z polecenia Stop-Service, za którego pomocą zatrzymasz dowolną liczbę usług za jednym razem. Dla przejrzystości przekazu w pokazanym tu skrypcie zatrzymane zostaną jedynie dwie usługi: Bufor wydruku (Spooler) i Rejestr zdalny (RemoteRegistry), ale w analogiczny sposób możesz zatrzymać więcej usług. Oczywiście ze zrozumiałych względów zalecamy bardzo dużą ostrożność w manipulacji usługami i ograniczenie się jedynie do tych, co do których jesteś pewien, że ich zatrzymanie nie spowoduje problemów w działaniu systemu, oprogramowania i sprzętu.
Krok 1
Ponieważ manipulacje działaniem usług systemowych wymagają praw administratora, musisz uruchomić środowisko PowerShell ISE z odpowiednimi uprawnieniami. Najprościej to zrobisz, klikając prawym klawiszem myszy skrót do programu i wybierając z menu kontekstowego Uruchom jako administrator.
Krok 2
W górnej części okna wpisz pokazany tu skrypt:
Krok 3
W pierwszej linii widzisz zmienną, której jest przypisana nie jedna, lecz kilka wartości. To przykład dwuelementowej tablicy. W taki sposób możesz tworzyć w skryptach PowerShell tablice zawierające wiele obiektów, na których później przeprowadzane są działania.
Krok 4
W kolejnej linii 2 widzisz instrukcję foreach. Stanowi ona początek pętli, która zostanie powtórzona tyle razy, ile elementów ma utworzona wcześniej tablica obiektów. W tej linii pojawia się też zmienna $Usluga, której nie przypisujemy ręcznie żadnej wartości. Jest to tzw. zmienna licznikowa, która przechowuje aktualnie pobrany element tablicy, czyli w przypadku tego skryptu nazwę zatrzymywanej usługi.
Krok 5
Linie od 3 do 6 to treść pętli, której liczbę iteracji wyznacza liczba elementów tablicy utworzonej w pierwszym wierszu. Pętla składa się z dwóch poleceń. Polecenie Write-Host wyświetla komunikat zawarty w cudzysłowach, natomiast polecenie Stop-Service zatrzymuje usługę, której nazwa jest przechowywana przez zmienną licznikową. Każda usługa w systemie Windows ma dwie nazwy: wewnętrzną (systemową), i z tej właśnie korzystaliśmy w opisywanym skrypcie, oraz tzw. nazwę wyświetlaną, bardziej „ludzką” w brzmieniu. W skrypcie stosujemy nazwy systemowe ze względu na to, że są po prostu krótsze. Nic jednak nie stoi na przeszkodzie, byś użył nazw wyświetlanych. Wtedy w tablicy musiałbyś zadeklarować „Bufor wydruku” i „Rejestr zdalny”, a parametr -Name w poleceniu Stop-Service zastąpić parametrem -DisplayName.
Krok 6
W linii 5 znajduje się jeszcze jeden parametr: -Force. Jest to przełącznik wymuszający zatrzymanie usługi nawet wtedy, gdy istnieją elementy od niej zależne. W tym przypadku dotyczy to usługi Bufor wydruku (Spooler), od której zależy element o nazwie Faks.
Krok 7
Ostatnia linia skryptu to po prostu wyświetlenie komunikatu informującego o zatrzymaniu wybranych usług.
Krok 8
Na koniec jeszcze jedna podpowiedź: możesz użyć niemal identycznego skryptu do uruchamiania usług. Oto, co musiałbyś zmienić: zastąpić polecenie Stop-Service poleceniem Start-Service, usunąć parametr -Force i oczywiście dla porządku zmodyfikować treść wyświetlanych komunikatów oraz wpisać nazwy usług, które chcesz włączyć do tablicy w pierwszym wierszu.