SoftwarePierwszy skrypt

    Pierwszy skrypt

    Windows PowerShell to najprostszy, a zarazem najlepiej nadający się do zarządzania systemem Windows język skryptowy. Przekonaj się sam! Wyjaśniamy, jak bezpiecznie napisać swój pierwszy skrypt.

    Pierwszy skrypt

    W poprzednim artykule poświęconym środowisku Windows PowerShell (pełną treść tego tekstu znajdziesz na naszej witrynie internetowej pod adresem http://pcformat.pl/u/191) dowiedziałeś się, co to w ogóle jest Windows PowerShell. Wiesz już także, jak korzystać z wbudowanych poleceń, tzw. cmdlets, wydawanych w trybie interaktywnym (czyli: wpisujesz polecenie, wciskasz [Enter], następuje określone działanie i otrzymujesz wynik).

    Tym razem chcemy pokazać, że Windows PowerShell jest nie tylko wymiennikiem przestarzałego Wiersza poleceń (cmd.exe), ale też funkcjonalnym językiem skryptowym.

    Bardziej doświadczeni użytkownicy Windows mogą słusznie zauważyć, że systemy te od dawna mają język skryptowy VBScript. To prawda, ale powstał on przede wszystkim jako język do zastosowań internetowych i choć można go używać również do zarządzania funkcjami systemu operacyjnego, jest trudniejszy niż Windows PowerShell, który z kolei tworzono z myślą o zarządzaniu systemem.

    Wykonywanie poleceń cmdlets w trybie interaktywnym jest wygodne przy użyciu standardowej konsoli Windows PowerShell, ale do pisania i testowania skryptów znacznie lepiej wykorzystać środowisko Windows PowerShell Integrated Scripting Engine (w skrócie PowerShell ISE). Jest ono zawarte w pakiecie razem z samym PowerShellem. Musisz też wiedzieć, że w domyślnej konfiguracji Windows nie pozwala na uruchomienie żadnego skryptu – ze względów bezpieczeństwa. Dowiesz się, jak odblokować możliwość wykonywania skryptów (warsztat: „Zasady obsługi skryptów”), a także, jak testować i kontrolować wykonanie poszczególnych poleceń PowerShell dzięki przełącznikom WhatIf i Confirm (warsztat: „Zawory bezpieczeństwa w PowerShell”).

    Zawory bezpieczeństwa w PowerShell

    Polecenia Windows PowerShell potrafią naprawdę wiele. Jednak sprawdzanie ich możliwości metodą prób i błędów, choć ma walory poznawcze, jest trochę niebezpieczne. Dlatego, aby uniknąć utraty danych czy innego błędu wynikającego z niewłaściwego użycia danego polecenia, mechanizm Windows PowerShell został wyposażony w specjalne dodawane do poleceń przełączniki.

    Przełącznik WhatIf

    Angielski zwrot „What If” oznacza „co, jeżeli...?”. Dobrze to oddaje sens funkcjonowania tego przełącznika. Umożliwia on wypróbowanie polecenia bez ponoszenia konsekwencji ewentualnego błędu. Oto, jak należy korzystać z WhatIf.

    Krok 1

    Uruchom środowisko PowerShell ISE, klikając w menu Start skrót (oczywiście możesz również wykorzystać znaną ci już konsolę tekstową PowerShella).

    Krok 2

    W oknie Windows PowerShell ISE, które w domyślnej konfiguracji powinno być podzielone na trzy części: górną (tekst skryptu), środkową (wyjście konsoli) i dolną (wprowadzanie poleceń), kliknij w dolnej części pod napisem PS C:\Users\Ultimatetester i wpisz polecenie Stop-Process -processName explorer -WhatIf, wciśnij [Enter].

    Obraz

    Krok 3

    W środkowej części okna zobaczysz wynik z konsoli, czyli wpisane polecenie oraz zwrot: What If: Performing operation „Stop-Process” on Target „explorer (4984)”.
    Jest to jakby objaśnienie, jakie zadanie dane polecenie wykonuje. W tym przypadku jest to polecenie zamykające proces (Stop-Process) powłoki systemu Windows (explorer.exe). Gdyby zostało wykonane bez przełącznika WhatIf, znikłby cały interfejs Windows (pulpit, pasek zadań, menu Start, ikony itp.). Dzięki przełącznikowi WhatIf nic się nie stało. Otrzymałeś jedynie komunikat informujący o tym, co dane polecenie wykonuje.

    Obraz

    Przełącznik Confirm

    Drugim przełącznikiem, którym warto się zainteresować, jest Confirm (z ang. potwierdzić). Ten przełącznik wykonuje częściowo to samo co WhatIf, ale dodatkowo pozwala również na faktyczne wykonanie (lub ewentualne anulowanie) danego polecenia po uzyskaniu dodatkowego potwierdzenia od użytkownika.

    Krok 1

    Użyjmy ponownie poprzedniego przykładu polecenia zamykającego proces powłoki Windows. Wpisz polecenie Stop-Process -processName explorer -Confirm i wciśnij [Enter].

    Krok 2

    Tym razem zamiast komunikatu zobaczysz w konsoli okienko, w którym wyświetli się opis danego polecenia oraz przyciski umożliwiające kontynuowanie lub przerwanie działania. Okno dialogowe pojawi się, gdy korzystasz z PowerShell ISE. W konsoli tekstowej (PowerShell.exe) komunikat i potwierdzenie wyświetlą się w postaci tekstowej.

    Obraz

    Zasady obsługi skryptów

    Próba uruchomienia jakiegokolwiek skryptu w domyślnie skonfigurowanym środowisku PowerShell zakończy się komunikatem błędu. Wynika to z reguł bezpieczeństwa, które dopóki użytkownik tego nie zmieni, zabraniają uruchamiania jakichkolwiek skryptów. Oczywiście na nasze potrzeby trzeba będzie zmienić domyślne reguły obsługi skryptów. Można to zrobić na dwa sposoby: za pomocą ustawienia Włącz wykonywanie skryptów dostępnego w usłudze katalogowej Active Directory lub poprzez dostępne w ramach środowiska PowerShell polecenia Set-ExecutionPolicy. Proponujemy użycie tej drugiej metody.

    Krok 1

    Uruchom środowisko PowerShell ISE za pomocą odpowiedniego skrótu dostępnego w menu Start.

    Krok 2

    Wpisz polecenie widoczne na poniższym obrazku i wciśnij [Enter].

    Obraz

    Krok 3

    Na wyjściu konsoli zobaczysz komunikat Restricted. To jedno z czterech dostępnych ustawień zasady ograniczonego wykonywania skryptów – najbardziej restrykcyjne (żaden skrypt, nawet napisany przez ciebie, nie może być uruchomiony). Trzy pozostałe to:

    • AllSigned – zezwala na uruchamianie skryptów podpisanych cyfrowo przez zaufanego (w danym systemie) wydawcę,
    • RemoteSigned – skrypty napisane przez ciebie mogą być uruchamiane bez podpisu, wszelkie inne, także pobrane z internetu, wymagają certyfikatu,
    • Unrestricted – każdy skrypt, bez względu na pochodzenie, może być uruchomiony, jednak w przypadku skryptów pobranych z internetu zobaczysz jeszcze przed ich uruchomieniem komunikat z prośbą o potwierdzenie.
    Obraz

    Krok 4

    Z powyższego zestawienia widać, że sensowne jest wybranie jednego z dwóch ostatnich ustawień: RemoteSigned lub Unrestricted. Przypisanie któregoś z tych ustawień wymaga użycia polecenia Set-ExecutionPolicy uzupełnionego o wybrany poziom zasady wykonywania skryptów. Jednak uwaga! Aby polecenie zadziałało, musisz uruchomić PowerShella z uprawnieniami administratora. W Windows XP, jeżeli pracujesz na koncie z uprawnieniami administratorskimi, nie musisz nic robić, ale Windows Vista oraz Windows 7 wyposażono w mechanizm UAC blokujący zmianę newralgicznych ustawień systemu (w tym reguł rządzących wykonywaniem skryptów). Jeżeli zatem korzystasz z Visty lub Siódemki, zamknij środowisko PowerShell ISE, a następnie uruchom je, klikając prawym przyciskiem myszy skrót w menu Start i wybierając z menu kontekstowego Uruchom jako administrator.

    Obraz

    Krok 5

    Po uruchomieniu środowiska PowerShell ISE z uprawnieniami administratora wpisz polecenie Set-ExecutionPolicy Unrestricted lub Set-ExecutionPolicy RemoteSigned (w zależności od preferowanego poziomu zasady wykonywania skryptów), wciśnij [Enter], a następnie w okienku dialogowym kliknij Yes, by potwierdzić zmianę. Od tej pory swoje własne skrypty będziesz mógł wykonywać bez przeszkód.

    Obraz

    Pierwszy skrypt – raport uruchomieniowy

    Czas na pierwszy skrypt. Niech to będzie prosty skrypt, który automatycznie zapisze w postaci pliku tekstowego listę wszystkich działających na danym komputerze procesów wraz z ich wybranymi parametrami, np. nazwą procesu (name), identyfikatorem procesu (processID) oraz roboczym zestawem pamięci (working set). Ot, proste narzędzie diagnostyczne pozwalające się przekonać, który z działających procesów pochłania najwięcej pamięci.

    Krok 1

    Uruchom środowisko PowerShell ISE. Teraz w oknie kodu skryptu wpisz następujące sześć linii:

    Obraz

    Krok 2

    W pierwszych dwóch wierszach (1) definiujesz dwie zmienne: pierwsza określa nazwę komputera (ponieważ chodzi o komputer lokalny, na którym uruchamiasz skrypt, używamy zwrotu localhost), natomiast druga określa docelowe miejsce zapisu wynikowego pliku z listą procesów. W naszym przykładzie plik ten nosi nazwę Procesy.txt i zostanie zapisany w folderze C:\Raport. Uwaga! Folder docelowy (tu: C:\Raport) musi już istnieć na dysku przed uruchomieniem skryptu (można by oczywiście rozbudować skrypt o polecenie tworzenia folderu czy weryfikację obecności miejsca docelowego, ale na razie to pominiemy, by zachować jak najkrótszą formę skryptu).

    Krok 3

    Linia trzecia (2) to polecenie wypisania na konsoli komunikatu zamkniętego w cudzysłowach.

    Krok 4

    Kolejna linia (3) zawiera polecenie typu cmdlet: Get-WmiObject. Polecenie to służy do „wydobycia” informacji z podsystemu Windows Management Instrumentation. O bazie WMI będziemy jeszcze wielokrotnie mówić w kolejnych artykułach dotyczących PowerShella. Tutaj polecenia tego użyliśmy, by skrypt odczytał informacje z WMI dotyczące procesów (klasa win32_process).

    Krok 5

    W linii piątej (4) następuje wybór obiektów z odczytywanej klasy – zgodnie z wcześniejszymi założeniami interesuje nas nazwa procesu (name), identyfikator procesu (processID) oraz rozmiar zestawu roboczego pamięci dla każdego procesu (WorkingSetSize). Nic nie stoi na przeszkodzie, aby rozbudować skrypt o dodatkowe informacje udostępniane w ramach klasy win32_process. Więcej informacji na temat obiektów tej klasy znajdziesz na witrynie MSDN Windows Dev Center: http://pcformat.pl/u/192

    Krok 6

    Ostatnia linia skryptu (5) to formatowanie wyjścia. W tym przypadku polecenie Format-Table ustawia format tabeli, która następnie zostaje zapisana w pliku wyjściowym zadeklarowanym zmienną $file.

    Krok 7

    Skrypt jest gotowy. Kliknij widoczny na pasku narzędziowym przycisk Play lub wciśnij klawisz [F5], by go uruchomić. Program PowerShell ISE poinformuje, że skrypt będzie zapisany. Wybierz jakiś stały folder na dysku, w którym będziesz zapisywał swoje skrypty. Kliknij przycisk OK.

    Obraz
    Obraz

    Krok 8

    W oknie konsoli pojawi się komunikat Zbieram dane. Dokładnie taki, jaki jest zadeklarowany w kodzie skryptu (linia (3)), a po chwili zobaczysz poziomą linię oznaczającą koniec wykonania skryptu. Teraz pozostaje tylko otworzyć folder C:\raport, by zobaczyć w nim plik tekstowy Procesy.txt. Po otwarciu tego pliku zobaczysz listę procesów działających na twoim komputerze.

    Obraz
    Obraz
    Obraz

    Wybrane dla Ciebie