Etykiety

sobota, 7 stycznia 2017

Wstęp do Windows PowerShell

Czemu taki artykuł


Wielokrotnie pytano mnie, czemu na moim blogu wszystko kręci się wokół Linuxa. Otóż od kilkunastu lat moja praca polega na administrowaniu tego typu systemami oraz projektowaniu i rozwijaniu zarówno prostych aplikacji, jak i złożonych systemów informatycznych, głównie w tym właśnie środowisku. Obiecywałem jednak, że jako posiadacz tytułu Microsoft Certified Systems Engineer, zacznę pisać artykuły związane z systemami Microsoft. Niniejszy artykuł jest pierwszym z tej właśnie serii.

Czym jest PowerShell


Windows PowerShell to interpreter poleceń rodem z Microsoft, ściśle zintegrowany ze środowiskiem .NET Framework i o wiele bardziej rozbudowany niż wcześniejsze interpretery poleceń COMMAND.COM i cmd.exe, opracowane przez tą samą firmę. Windows PowerShell jest potężnym narzędziem, przeznaczonym głównie do wykonywania zadań administracyjnych, także sieciowych, za pomocą poleceń zwanych cmdletami, z ang. cmdlets. Windows PowerShell cechuje się logiką obiektową, co oznacza iż wynikiem wykonywanego polecenia cmdlet nie jest ciąg znaków, lecz obiekt, co stanowi bardzo dużą różnicę w odniesieniu do innych interpreterów poleceń zarówno Microsoft jak i Linux. Historia tego interpretera poleceń sięga roku 2002. Od czasów Windows 7 PowerShell stanowi integralną część systemu operacyjnego, natomiast obecnie system Windows 10 zawiera PowerShell w wersji 5.0.

Po co polecenia?


Wielu z Was zada sobie kluczowe pytanie: po co w ogóle korzystać z interpretera poleceń w systemach Microsoft, skoro "wszystko" da się zrobić w GUI, czyli w środowisku graficznym? Na to pytanie jest bardzo prosta odpowiedź. Stwierdzenie, że wszystko da się zrobić w środowisku graficznym, nie jest, na dzień dzisiejszy, zupełnie zgodne z rzeczywistością. Prawdą jest owszem, że tak było kiedyś, lecz obecnie, w związku ze zmianą podejścia firmy Microsoft do tej kwestii i wynikającym z tej decyzji rozwojem PowerShell'a, sytuacja jest zupełnie odwrotna! Wiele zadań administracyjnych jest praktycznie niemożliwych do wykonania w systemie Windows bez korzystania z PowerShell'a lub wyspecjalizowanej aplikacji, natomiast inne zadania można wykonywać znacznie sprawniej z wiersza poleceń. Wyobraźcie sobie przykładowo, że Waszym zadaniem jest utworzenie kilkuset kont użytkowników na zdalnych serwerach. Korzystanie z interfejsu graficznego sprawiałoby w tym przypadku spore utrudnienie, natomiast PowerShell przynosi w tym obszarze niesamowite możliwości i elastyczność działania.

PowerShell cmdlets


Polecenia PowerShell, cmdlets, to wyspecializowane klasy środowiska .NET Framework, których instancje są tworzone i wywoływane przez runtime PowerShell'a. Nazwy cmdletów zą tworzone na zasadzie Czasownik-Rzeczownik, co pozwala na precyzyjne określenie ich działania, a zarazem zwiększa wygodę korzystania z poleceń. Przykładowo, polecenie Get-ChildItem zwraca listę elementów (na przykład listę plików i katalogów) zawartych w określonym kontenerze (np. w katalogu systemu plików lub lokalizacji rajestru systemu), która domyślnie jest bieżącym kontenerem. A oto kilka innych przykładów poleceń Windows PowerShell, które wszystkie, jak widać, trzymają się tych zasad notacji:

Get-Date Get-Service Get-Command Set-Location Get-Module

W odróżnieniu od poprzednich interpreterów poleceń firmy Microsoft, PowerShell jest o wiele bardziej przyjazny dla użytkownika. Komendy są interaktywnie podświetlane w trakcie ich wpisywania, co pozwala użytkownikowi szybko orientować się czy ciąg znaków pasuje do istniejących komend, a klawiszem TAB można błyskawicznie kompletować wprowadzane polecenia (TAB completion), podobnie jak ma się to w interpreterach systemu Linux.

W dalszej części tego artykułu będę stosował określenie PowerShell w odniesieniu do wersji PowerShell 5.0, dostępnej w środowisku Windows 10.

Jak zacząć korzystać z PowerShell'a


Dostępnych jest obecnie wiele aplikacji stanowiących interfejs między interpreterem PowerShell a użytkownikiem, pozwalających korzystać z potęgi PowerShell'a. Jednym ze sposobów na rozpoczęcie korzystania z omawianego tutaj interpretera polecen jest wyszukanie aplikacji Windows PowerShell w pasku wyszukiwania Windows i uruchomienie jej z uprawnieniami Administratora, korzystając z menu opcji wyświetlanego po kliknięciu prawego przycisku myszki nad dostępną w wynikach wyszukiwania aplikacją Windows PowerShell. Alternatywnie, aby korzystać w PowerShell'a można wybrać aplikację Windows PowerShell ISE. Obecnie można znaleźć w sieci sporą ilość rozmaitych aplikacji umoliwiających korzystanie z dobrodziejstw Windows PowerShell, niekiedy bardzo rozbudowanych, tak jak przykładowo Sapien Technologies PowerShell Studio.

Windows PowerShell - uruchamianie
Przykładowy sposób uruchamiania Windows PowerShell


Pierwsze kroki w PowerShell


Po uruchomieniu wybranej przez nas aplikacji, umożliwiającej wydawanie poleceń PowerShell, możemy zacząć korzystać z potężnego interpretera poleceń Microsoft.

Dobrą wiadomością dla osób zaznajomionych z poprzednią wersją interpretera poleceń Microsoft, jest to, iż polecenia znane z cmd.exe, będą generalnie działać w środowisku PowerShell. A to już dobry początek:

PS C:\> mkdir c:\katalog1 Directory: C:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2017-01-06 15:58 katalog1 PS C:\> cd c:\katalog1 PS C:\katalog1> date > plik1.txt PS C:\katalog1> dir Directory: C:\katalog1 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2017-01-06 15:58 66 plik1.txt PS C:\katalog1> type plik1.txt 6 stycznia 2017 15:58:39 PS C:\katalog1> del plik1.txt


Aliasy


Z powyższego przykładu można łatwo zauważyć, że polecenia znane nam ze starszego interpretera Microsoft wydają się bezproblemowo działać w środowisku Windows Powershell. Jednak, nie jest to do końca prawdą, a zobaczmy dokładnie o co chodzi. Przykładowo, próba wydania znanego nam z poprzednich interpreterów Microsoft polecenia DIR, wraz z jakąkolwiek opcją, na przykłąd opcją /L, w środowisku Windows PowerShell skutkuje błędem:

PS C:\katalog1> dir /L dir : Cannot find path 'C:\L' because it does not exist. At line:1 char:1 + dir /L + ~~~~~~ + CategoryInfo : ObjectNotFound: (C:\L:String) [Get-ChildItem], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

Czemu tak się dzieje? Otóż dlatego, że polecenie DIR jest, w środowisku PowerShell, tylko aliasem, czyli alternatywną nazwą dla natywnego polecenia cmdlet Get-ChildItem, o którym wstępnie już wspomniałem, a nie poleceniem samym w sobie. Dlatego też, natywny cmdlet PowerShell, wywoływany przez zdefiniowany dla niego alias, nie jest w stanie przyjać przekazywanych w ten sposób dodatkowych opcji, których cmdlet w sumie nie jest w stanie interpretować. Ciekawostką jest też to, iż cmdlet Get-ChildItem może być także wywołany aliasem o nazwie ls, a więc nazwą w stylu Linuksa:

PS C:\katalog1> ls Directory: C:\katalog1 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2017-01-06 16:57 66 data.txt -a---- 2017-01-06 16:57 13 data1.txt

Zobaczmy teraz, przykładowo, wszystkie aliasy zdefiniowane dla cmdleta Get-ChildItem:

PS C:\katalog1> Get-Alias -definition Get-ChildItem CommandType Name Version Source ----------- ---- ------- ------ Alias dir -> Get-ChildItem Alias gci -> Get-ChildItem Alias ls -> Get-ChildItem

Polecenia PowerShell mogą być niekiedy zapodawane z wieloma rozmaitymi parametrami. Często, w zależności od polecenia, dostępnych parametrów może być bardzo dużo. Jeśli nie pamiętamy nazwy danego parametru, wówczas nie ma się czym przejmować, ponieważ PowerShell może nam ją automatycznie podpowiedzieć. W tym celu wystarczy zapodać nazwę polecenia, a następnie znak parametru '-' oddzielony spacją od polecenia, po czym, aby wyświetlić wszystkie dostępne dla danego polecenia parametry wystarczy wciskać klawisz tabulatora. Dla przykładu, w przypadku cmdletu Get-ChildItem, parametr -Directory ogranicza listę wyświetlanych wyników do katalogów:

PS C:\WINDOWS\system32> Get-ChildItem -Directory

Z pomocą w doborze odpowiednich parametrów dla stosowanych cmdletów przychodzi nam również kombinacja klawiszy Ctrl+Spacja tuż po wpisaniu znaku minus oznaczającego parametr polecenia, co skutkuje wyświetleniem wszystkich możliwych parametrów, po których następnie możemy przechodzić strzałkami. Aby wybrać bieżący parametr klikamy ENTER:

Windows PowerShell - Dobór parametrów polecenia
Windows PowerShell - Dobór parametrów polecenia


Dodam tutaj, iż także w przypadku doboru wartości parametrów można niekiedy, w analogiczny sposób, korzystać z klawisza TAB, w zależności od wartości przyjmowanych przez dany parametr.

Popularne przykładowe cmdlety PowerShell


Oprócz wspomnianego wcześniej polecenia Get-ChildItem, jednym z najbardziej ogólnych i najbardziej przydatnych cmdletów PowerShell'a jest polecenie Get-Command, które domyślnie wyświetla listę wszystkich dostępnych w systemie cmdletów. Ponieważ ilość dostępnych cmdletów, w zależności od zainstalowanych w systemie modułów PowerShell, może być imponująca, warto jest ograniczać ilość wyświetlanych wyników wyszukiwania:

Windows PowerShell Get-Command
Windows PowerShell - Przykładowy wynik cmdleta Get-Command Get-Smb*


Kolejnym, bardzo ważnym poleceniem Windows PowerShell jest Get-Module. Wyświetla ono obecnie załadowane do pamięci moduły. Od wersji PowerShell 3.0 potrzebne moduły są automatycznie ładowane do pamięci operacyjnej w miarę potrzeby, co oznacza, iż wywołanie cmdletów wymagających konkretnych modułów, powoduje ich automatyczne załadowanie do pamięci, jeśli jeszcze ich tam nie ma.

S C:\WINDOWS\system32> Get-Module ModuleType Version Name ExportedCommands ---------- ------- ---- ---------------- Manifest 3.1.0.0 Microsoft.PowerShell.Management {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Con... Manifest 3.1.0.0 Microsoft.PowerShell.Utility {Add-Member, Add-Type, Clear-Variable, Compare-Object...} Script 1.1 PSReadline {Get-PSReadlineKeyHandler, Get-PSReadlineOption, Remove-PS...

Warto tutaj także wymienić cmdlet o nazwie Get-Process, za pomocą którego możemy uzyskać informacje o procesach. Dla przykładu:

PS Env:\> get-Process boinc Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id SI ProcessName ------- ------ ----- ----- ----- ------ -- -- ----------- 195 18 8400 14804 94 3,80 13208 2 boinc

Polecenie Get-Service wyświetla informacje o usługach. Jeśli chcemy uzyskać informacje o konkretnej usłudze, przykładowo o usłudze Bonjour, wystarczy wprowadzić polecenie z nazwą usługi:

PS Env:\> get-service 'Bonjour Service' Status Name DisplayName ------ ---- ----------- Running Bonjour Service Usługa Bonjour

Bardzo przydatnym poleceniem PowerShell, o którym również warto wpomnieć, jest cmdlet o nazwie Get-EventLog, który umożliwia nam dostęp do zawartości dzienników zdarzeń. Przykładowo, jeśli interesuje nas 5 najnowszych zdarzeń, które zostały zapisane w dzienniku aplikacji, możemy tę informację uzyskać w następujący sposób:

PS Env:\> get-eventLog -LogName Application -Newest 5 Index Time EntryType Source InstanceID Message ----- ---- --------- ------ ---------- ------- 48560 sty 07 13:09 Information Software Protecti... 1073742890 Stan zainicjowania obiektów usługi.... 48559 sty 07 13:09 Information Software Protecti... 1073742724 Usługa ochrony oprogramowania jest uruchamiana.... 48558 sty 07 13:08 0 Software Protecti... 1073742727 Usługa ochrony oprogramowania została zatrzymana.... 48557 sty 07 13:08 Information Software Protecti... 1073758208 Zaplanowano restart usługi ochrony oprogramowania o 2116-12-14T12:08:29Z. Przyczyna: RulesEngine. 48556 sty 07 13:07 0 Software Protecti... 1073742726 Usługa ochrony oprogramowania została uruchomiona....

Providery PowerShell


Providery PowerShell'a umożliwiają poruszanie się w zbiorach danych różnego rodzaju (np. systemy plików na dyskach, rejestr systemu Windows, środowisko systemowe) w sposób taki, jaki ma miejsce w przypadku prawdziwego systemu plików. Z tej właśnie przyczyny dla przykładowego, wspomnianego wcześniej cmdleta o dziwnej nazwie Get-ChildItem wybrano bardziej uniwersalną nazwę niż np. dir czy list, nazwę która nie ogranicza jego stosowania wyłącznie do prawdziwego systemu plików. To przykładowe polecenie PowerShell, jak wiele innych, dzięki providerom PowerShell okazuje się przydatne nie tylko w przypadku systemów plików, lecz także w przypadku każdego innego rodzaju danych, obsługiwanego przez providery PowerShell. Zobaczmy teraz w jaki sposób można uzyskać listę dostępnych providerów Windows PowerShell:

PS C:\WINDOWS\system32> Get-PSProvider Name Capabilities Drives ---- ------------ ------ Registry ShouldProcess, Transactions {HKLM, HKCU} Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess, Credentials {C, E, D} Function ShouldProcess {Function} Variable ShouldProcess {Variable}

Tak więc, dzięki providerom Windows PowerShell, możemy przykładowo przejść do rejestru HKCU, poruszać się w nim, oglądać jego zawartość, korzystając z tych samych sposóbów i narzędzi, które są dostępne w przypadku struktury systemu plików:

PS C:\WINDOWS\system32> set-location HKCU: PS HKCU:\> Get-ChildItem

A oto przykładowy wynik powyższych poleceń:

Windows PowerShell - Poruszanie się w strukturze rejestru HKCU
Windows PowerShell - Poruszanie się w strukturze rejestru HKCU

Także dzięki providerom, jak wiadać z wyników polecenia Get-PSProvider, można w podobny sposób dostać się do zmiennych środowiskowych Windows (Environment Variables). A więc, wchodzimy do zmiennych środowiskowych, niczym do systemu plików:

Windows PowerShell - Zmienne Środowiskowe Windows
Windows PowerShell - Zmienne Środowiskowe Windows

Pomocy!


Windows PowerShell cechuje się bardzo rozbudowanym systemem pomocy. Można w nim błyskawicznie uzyskać pomoc dotyczącą każdego dostępnego cmdleta. Przed rozpoczęciem korzystania z pomocy warto jednak ściągnąć z sieci aktualizację pomocy. Aby to zrobić wystarczy wydać polecenie:

PS C:\WINDOWS\system32> Update-Help

W wyniku powyższego polecenia PowerShell ściąga z serwerów Microsoft dostępne aktualizacje systemu pomocy:

Windows PowerShell - Aktualizowanie systemu pomocy
Windows PowerShell - Aktualizowanie systemu pomocy

Aby uzyskać pomoc dotyczącą konkretnej komendy wystarczy wprowadzić polecenie o nazwie Get-Help, lub jego alias w linuksowym stylu, o nazwie man, z nazwą polecenia, dla którego jest nam potrzebna pomoc. Przykładowo:

PS C:\WINDOWS\system32> Get-Help Get-RestorePoint

Jeśli nie pamiętamy dokładnej nazwy polecenia, możemy zastosować wildcardy, czyli gwiazdki. Przykładem może być:

PS C:\WINDOWS\system32> Get-Help *smb*


Windows PowerShell - Pomoc
Windows PowerShell - Pomoc


Co ciekawe, dodatkowym ułatwieniem jest fakt, iż pomoc może być wyświetlana w okienku GUI, w przypadku zapodania cmdletu Get-Help z parametrem -ShowWindow. Wówczas wyszukiwanie może stać się o wiele bardziej przyjemne:

Windows PowerShell - Pomoc w GUI
Windows PowerShell - Pomoc w GUI


Można także uzyskać dostęp do pomocy związanej z konkretnym tematem, w trybie online, czyli poprzez przeglądarkę www. W tym celu należy zastosować parametr -Online. Przykładowo:

PS C:\WINDOWS\system32> Get-Help Get-ChildItem -Online

Warto tutaj wspomnieć, iż system pomocy PowerShell może być bardzo przydatny w nauce korzystania z potencjału PowerShell'a, gdyż umożliwia on nam dostęp do pełnych treści tutoriali związanych z konkretnymi tematami. Przykładowo jeśli interesuje nas temat modułów, wówczas, aby uzyskać dostęp do tutorialu o modułach, wystarczy wydać polecenie:

PS C:\WINDOWS\system32> Get-Help about_Modules

Aby dowiedzieć się jakie tutoriale są obecnie dostępne w systemie pomocy, wystarczy wydać polecenie:

PS C:\WINDOWS\system32> Get-Help about*


Pipelining, czyli potoki


Obsługa tak zwanego pipeliningu, czyli potoków, znanych nam ze świata Linuxa, jest w pełni obecna w Windows PowerShell. Jak wcześniej wyjaśniłem, wykonywane polecenia PowerShell zwracają jako wynik nie zwykły tekst, lecz obiekty. Domyślnie obiekty te wyświetlane są na ekranie. Istnieje jednak możliwość automatycznego wywołania kolejnych cmdletów, z otrzymanymi wynikami jako argumenty wejściowe. Zobaczmy teraz jak to działa na konkretnych przykładach.

Wiemy już, że polecenie Get-Process domyślnie wyświetla listę aktywnych procesów na wybranej maszynie. Wiemy też, że polecenie to zwraca listę obiektów. Możemy zatem wykorzystać wyniki tego polecenia jako argumenty wejściowe innego polecenia, na przykład polecenia o nazwie Select-Object, które w naszym przykładzie poskutkuje wyświetleniem jedynie identyfikatorów procesów, zamiast wszystkich domyślnie pokazywanych elementów:

PS C:\WINDOWS\system32> Get-Process | Select-Object -Property Id Id -- 2448 2208 2456 8664 2480 [...]

Innym prostym przykładem potoków PowerShell, który już nieco bardziej ukazuje potencjał interpretera, może być następujący wiersz, którego wykonanie skutkuje wyświetleniem nazw pierwszych 10 elementów z listy obiektów plików i katalogów w bieżącej lokalizacji systemu plików, uporządkowanej według daty utworzenia, w kierunku od najnowszego do najstarszego elementu:

PS C:\WINDOWS\system32> Get-ChildItem | Select-Object Name | Sort-Object CreationTime -Descending | select -first 10 Name ---- iedkcs32.dll ieapfltr.dll IdListen.dll icsigd.dll IcsEntitlementHost.exe icrav03.rat icsunattend.exe ideograf.uce IdCtrls.dll icsvc.dll

Podsumowanie


W związku z coraz to bardziej złożoną strukturą wewnętrzną produktów firmy Microsoft, opracowanie interpretera poleceń nowej generacji okazało się nie tylko koniecznością, lecz ogólnie wielkim zwrotem. Jak zdążyliśmy zauważyć w trakcie czytania tego artykułu, Windows PowerShell to nie tylko rozbudowany interpreter poleceń, lecz potężne narzędzie, administracyjne i programistyczne, umożliwiające wykonywanie zadań absolutnie niewykonalnych w GUI, a na dodatek w sposób prosty, efektywny, a zarazem intuicyjny. Użytkownikami docelowymi Windows PowerShell są administratorzy systemów i programiści, którzy działają nie tylko w śwodowiskach systemowych i sieciowych Microsoft, ale taże w środowiskach sieciowych mieszanych.

Więcej informacji o Windows PowerShell, można uzyskać na stronach witryny Microsoft Developer Network.

Jeśli artykuł spodobał Ci się, proszę udostępnij go znajomym! Jeśli masz jakiekolwiek pytania, proszę o komentarze.

Brak komentarzy:

Prześlij komentarz

Dodaj komentarz