Windows PowerShell Przewodnik po skryptach Ed Wilson
Windows PowerShell Przewodnik po skryptach Edycja polska Microsoft Press Original English language edition 2008 by Ed Wilson Tytuł oryginału: Windows PowerShell Scripting Guide Polish edition by APN PROMISE Sp. z o. o. Warszawa 2008 APN PROMISE Sp. z o. o., biuro: 00-108 Warszawa, ul. Zielna 39 tel. (022) 355-16-00; fax (022) 355-16-99 e-mail: mspress@promise.pl Wszystkie prawa zastrzeżone. Żadna część niniejszej książki nie może być powielana ani rozpowszechniana w jakiejkolwiek formie i w jakikolwiek sposób (elektroniczny, mechaniczny), włącznie z fotokopiowaniem, nagrywaniem na taśmy lub przy użyciu innych systemów bez pisemnej zgody wydawcy. Microsoft, Microsoft Press, Active Directory, ActiveX, Excel, Internet Explorer, MSDN, MSN, Outlook, SQL Server, Visual Basic, Windows, Windows NT, Windows PowerShell, Windows Server, Windows Vista oraz Zune są zarejestrowanymi znakami towarowymi Microsoft Corporation. Wszystkie inne nazwy handlowe i towarowe występujące w niniejszej publikacji mogą być znakami towarowymi zastrzeżonymi lub nazwami zastrzeżonymi odpowiednich firm odnośnych właścicieli. Przykłady firm, produktów, osób i wydarzeń opisane w niniejszej książce są fikcyjne i nie odnoszą się do żadnych konkretnych firm, produktów, osób i wydarzeń. Ewentualne podobieństwo do jakiejkolwiek rzeczywistej firmy, organizacji, produktu, nazwy domeny, adresu poczty elektronicznej, logo, osoby, miejsca lub zdarzenia jest przypadkowe i niezamierzone. APN PROMISE Sp. z o. o. dołożyła wszelkich starań, aby zapewnić najwyższą jakość tej publikacji. Jednakże nikomu nie udziela się rękojmi ani gwarancji. APN PROMISE Sp. z o. o. nie jest w żadnym wypadku odpowiedzialna za jakiekolwiek szkody będące następstwem korzystania z informacji zawartych w niniejszej publikacji, nawet jeśli APN PROMISE została powiadomiona o możliwości wystąpienia szkód. ISBN: 978-83-7541-033-4 Przekład: Krzysztof Szkudlarek, Jowita Chościłowicz, Barbara Piątkowska, Tomasz Sochacki Redakcja: Marek Włodarz Korekta: Ewa Swędrowska Skład i łamanie: MAWart Marek Włodarz
Książkę tę dedykuję Teresie. Tak się cieszę, że zdecydowałaś się dzielić swoje życie ze mną.
Spis treści Podziękowania... xi Wstęp... xiii Czy ta książka jest dla mnie?...xiv Korzystanie z obrazu dysku CD...xiv Wymagania systemowe...xv Pomoc techniczna...xvi 1 Powłoka programu Windows PowerShell... 1 Instalowanie programu Windows PowerShell... 1 Sprawdzanie instalacji za pomocą skryptu w języku VBScript... 1 Wdrażanie programu Windows PowerShell... 2 Interakcja z powłoką... 4 Omówienie narzędzi wiersza poleceń typu Cmdlet... 6 Konfigurowanie programu Windows PowerShell... 7 Tworzenie profilu programu Windows PowerShell... 7 Konfigurowanie opcji uruchamiania programu Windows PowerShell... 7 Kwestie bezpieczeństwa w programie Windows PowerShell... 8 Kontrolowanie działania poleceń typu Cmdlet... 8 Potwierdzanie poleceń...10 Zawieszanie potwierdzeń wykonywania poleceń typu Cmdlet...12 Przekazywanie opcji dla poleceń typu cmdlet...14 Korzystanie z polecenia Get-Help (Pobierz pomoc)...15 Praca z aliasami i przypisywanie skróconych nazw poleceniom typu cmdlet...18 Dodatkowe zastosowania poleceń typu cmdlet...19 Korzystanie z polecenia Get-ChildItem...21 Formatowanie wyjścia...21 Stosowanie polecenia cmdlet Get-Command...29 Eksploracja obiektów przy użyciu polecenia Get-Member...32 Podsumowanie...36 2 Skrypty programu Windows PowerShell...37 Dlaczego warto korzystać ze skryptów?...37 Konfigurowanie zasady obsługi skryptów...40 Uruchamianie skryptów programu Windows PowerShell...43 Stosowanie zmiennych...44 Stosowanie stałych...45 Używanie instrukcji sterujących...46 Dodawanie parametrów do polecenia ForEach-Object...47 Stosowanie parametru Begin...47 Stosowanie parametru Process...48
Spis treści v Stosowanie parametru End...48 Używanie instrukcji For...48 Używanie instrukcji służących do podejmowania decyzji...49 Używanie instrukcji If Elseif Else...50 Używanie instrukcji Switch...51 Praca z typami danych...55 Odkrywamy możliwości wyrażeń regularnych...59 Używanie argumentów podawanych w wierszu poleceń...63 Podsumowanie...64 3 Zarządzanie dziennikami...65 Identyfikowanie dzienników zdarzeń...65 Odczytywanie dzienników zdarzeń...66 Eksportowanie do pliku tekstowego...67 Eksportowanie do pliku w formacie XML...69 Przeglądanie ogólnych plików dzienników...71 Analizowanie kilku dzienników...72 Pobieranie pojedynczego wpisu z dziennika zdarzeń...73 Przeszukiwanie dziennika zdarzeń...76 Filtrowanie zdarzeń według właściwości...77 Wybór źródła zdarzeń...77 Wybór stopnia ważności zdarzeń...78 Wybieranie komunikatów...78 Zarządzanie dziennikiem zdarzeń...79 Identyfikowanie źródeł zdarzeń...79 Modyfikowanie ustawień dziennika zdarzeń...80 Analizowanie dziennika zdarzeń podsystemu WMI...84 Zmienianie poziomu rejestrowania podsystemu WMI...84 Korzystanie z programu narzędziowego do obsługi zdarzeń systemu Windows Windows Event Command-Line Utility...85 Zapisywanie informacji w dziennikach zdarzeń...86 Tworzenie źródła zdarzeń...86 Umieszczanie w dzienniku wyników zwracanych przez polecenia typu cmdlet...87 Tworzenie własnych dzienników zdarzeń...89 Podsumowanie...90 4 Zarządzanie usługami...91 Dokumentowanie istniejących usług...91 Praca z działającymi usługami...92 Zapisywanie wyników w pliku tekstowym...93 Zapisywanie wyników w bazie danych...96 Ustawianie konfiguracji usług... 106 Akceptowanie argumentów podawanych w wierszu poleceń... 108 Zatrzymywanie usług... 109 Poprawne zatrzymywanie usług... 110 Uruchamianie usług... 113
vi Spis treści Poprawne uruchamianie usług... 114 Utrzymywanie pożądanej konfiguracji usług... 120 Sprawdzanie, czy właściwe usługi są zatrzymane... 121 Odczytywanie pliku i sprawdzanie stanu usług... 122 Sprawdzanie, czy właściwe usługi są uruchomione... 122 Sprawdzanie konfiguracji usług... 123 Tworzenie raportu o wyjątkach... 124 Podsumowanie... 126 5 Zarządzanie udziałami... 127 Dokumentowanie udziałów... 127 Dokumentowanie udziałów użytkownika... 134 Zapisywanie informacji o udziałach w pliku tekstowym... 137 Dokumentowanie udziałów administracyjnych... 138 Zapisywanie informacji o udziałach w bazie danych programu Microsoft Access... 139 Prowadzenie inspekcji udziałów... 143 Modyfikowanie udziałów... 146 Używanie w skrypcie parametrów... 147 Tłumaczenie kodu powrotu... 148 Tworzenie nowych udziałów... 150 Tworzenie kilku udziałów... 155 Usuwanie udziałów... 157 Usuwanie tylko niedozwolonych udziałów... 159 Podsumowanie... 160 6 Zarządzanie drukarkami... 161 Tworzenie spisu zainstalowanych drukarek... 161 Odpytywanie wielu komputerów... 163 Rejestrowanie do pliku... 164 Zapisywanie informacji w bazie danych programu Microsoft Access... 166 Raportowanie portów drukarek... 172 Identyfikowanie sterowników drukarek... 177 Instalowanie sterowników drukarek... 179 Instalowanie znalezionych na komputerze sterowników drukarki... 180 Instalowanie sterowników drukarek, których nie znaleziono na komputerze... 182 Podsumowanie... 184 7 Bieżące administrowanie komputerami osobistymi... 185 Utrzymywanie właściwego stanu komputerów osobistych... 185 Tworzenie spisu dysków... 185 Zapisywanie informacji o konfiguracji dysków, w bazie danych programu Microsoft Access... 189 Praca z partycjami... 193 Dopasowywanie dysków i partycji... 195 Praca z dyskami logicznymi... 198
Spis treści vii Monitorowanie stopnia wykorzystania przestrzeni dyskowej... 203 Rejestrowanie informacji o zajętości przestrzeni dyskowej, w bazie danych... 207 Monitorowanie czasu życia plików... 211 Monitorowanie wydajności... 214 Korzystanie z klas liczników wydajności... 215 Identyfikowanie źródeł błędów stronicowania... 219 Podsumowanie... 220 8 Praca z siecią... 221 Praca z ustawieniami sieci... 221 Raportowanie ustawień sieci... 221 Odczytywanie konfiguracji kart sieciowych... 226 Filtrowanie tylko właściwości posiadających wartość... 232 Konfigurowanie ustawień karty sieciowej... 237 Wykrywanie obecności kilku kart sieciowych... 237 Zapisywanie informacji o kartach sieciowych w arkuszu kalkulacyjnym programu Microsoft Excel... 238 Identyfikowanie podłączonych kart sieciowych... 242 Ustawianie statycznego adresu IP... 244 Włączanie obsługi protokołu DHCP... 249 Konfigurowanie zapory ogniowej systemu Windows... 254 Raportowanie ustawień zapory ogniowej... 254 Konfigurowanie ustawień zapory ogniowej... 256 Podsumowanie... 257 9 Konfigurowanie ustawień pulpitu... 259 Problemy związane ustawieniami konfiguracyjnymi pulpitu... 259 Konfigurowanie wygaszaczy ekranu... 259 Prowadzenie inspekcji wygaszaczy ekranu... 260 Wyświetlanie tylko właściwości posiadających wartość... 267 Tworzenie raportów z informacjami o zabezpieczonych wygaszaczach ekranu.271 Zarządzanie opcjami zasilania komputerów osobistych... 278 Modyfikowanie schematu zasilania... 284 Podsumowanie... 290 10 Rozwiązywanie problemów występujących po zakończeniu wdrożenia... 291 Konfigurowanie daty i godziny... 291 Zdalne konfigurowanie daty i godziny... 292 Rejestrowanie rezultatów w dzienniku zdarzeń... 298 Konfigurowanie źródła czasu... 303 Korzystanie z polecenia Net Time Command... 304 Sprawdzanie źródła czasu poprzez odpytywanie rejestru systemu... 307 Włączanie kont użytkowników... 312 Tworzenie lokalnego konta użytkownika... 317 Tworzenie użytkownika lokalnego... 318
viii Spis treści Tworzenie lokalnej grupy użytkowników... 321 Konfigurowanie wygaszacza ekranu... 324 Zmienianie nazwy komputera... 331 Wyłączanie lub ponowne uruchamianie komputera zdalnego... 334 Podsumowanie... 338 11 Zarządzanie danymi użytkowników... 339 Praca z kopiami zapasowymi... 339 Konfigurowanie plików trybu offline... 342 Włączenie funkcji plików trybu offline... 346 Praca z punktami przywracania systemu... 354 Odczytywanie ustawień funkcji przywracania systemu... 355 Wyświetlanie listy dostępnych punktów przywracania systemu... 358 Podsumowanie... 362 12 Rozwiązywanie problemów związanych z systemem Windows... 363 Rozwiązywanie problemów związanych z uruchamianiem systemu... 363 Sprawdzanie konfiguracji rozruchowej... 363 Sprawdzanie konfiguracji usług uruchamianych podczas uruchamiania systemu... 366 Wyświetlanie zależności pomiędzy usługami... 369 Sprawdzanie konfiguracji sterowników urządzeń uruchamianych podczas uruchamiania systemu... 375 Analizowanie procesów uruchamianych za pomocą grupy Autostart... 379 Analizowanie problemów sprzętowych... 383 Rozwiązywanie problemów związanych z funkcjonowaniem sieci... 388 Podsumowanie... 391 13 Zarządzanie kontami użytkowników domeny... 393 Tworzenie jednostek organizacyjnych... 393 Tworzenie kont użytkowników domeny... 396 Modyfikowanie atrybutów użytkownika... 400 Modyfikowanie ogólnych informacji o użytkowniku... 400 Modyfikowanie atrybutów dostępnych na zakładce Address (Adres)... 402 Modyfikowanie atrybutów dostępnych na zakładce Profile (Profil)... 403 Modyfikowanie atrybutów dostępnych na zakładce Telephone... 404 Modyfikowanie atrybutów dostępnych na zakładce Organization... 405 Modyfikowanie pojedynczych atrybutów użytkowników... 406 Tworzenie kont użytkowników na podstawie pliku w formacie.csv... 409 Ustawianie hasła... 409 Włączanie konta użytkownika... 410 Tworzenie grup domenowych... 411 Dodawanie użytkownika do grupy domenowej... 414 Dodawanie wielu użytkowników z wieloma atrybutami... 416 Podsumowanie... 420
Spis treści ix 14 Konfigurowanie usługi klastrowania... 421 Analizowanie konfiguracji sklastrowanych serwerów... 421 Tworzenie raportu z informacjami o konfiguracji klastra... 428 Tworzenie raportu z informacjami o konfiguracji węzła... 432 Odpytywanie kilku klas związanych z usługą klastra... 437 Zarządzanie węzłami... 448 Dodawanie i wykluczanie węzłów... 448 Usuwanie klastra... 454 Podsumowanie... 459 15 Zarządzanie internetowymi usługami informacyjnymi... 461 Włączanie możliwości zarządzania internetowymi usługami informacyjnymi... 461 Tworzenie raportu z informacjami o konfiguracji usługi IIS... 463 Tworzenie raportów z informacjami o konfiguracji witryny... 463 Tworzenie raportów z informacjami o konfiguracji puli aplikacji... 466 Tworzenie raportów z informacjami o wartościach domyślnych puli aplikacji... 469 Tworzenie raportów z informacjami o limitach witryny... 472 Tworzenie listy katalogów wirtualnych... 476 Tworzenie nowej witryny webowej... 478 Tworzenie nowej puli aplikacji... 484 Uruchamianie i zatrzymywanie witryn webowych... 487 Podsumowanie... 491 16 Praca z magazynem certyfikatów... 493 Lokalizowanie certyfikatów w magazynie certyfikatów... 493 Wyświetlanie listy certyfikatów... 499 Lokalizowanie wygasłych certyfikatów... 503 Identyfikowanie certyfikatów, których ważność wygaśnie wkrótce... 508 Zarządzanie certyfikatami... 513 Inspekcja certyfikatu... 513 Importowanie certyfikatu... 517 Usuwanie certyfikatów... 521 Podsumowanie... 528 17 Zarządzanie usługami terminalowymi... 529 Konfigurowanie instalacji usług terminalowych... 529 Dokumentowanie konfiguracji usług terminalowych... 529 Wyłączanie możliwości logowania się... 533 Modyfikowanie właściwości klienta... 537 Zarządzanie użytkownikami... 542 Włączanie użytkownikom możliwości korzystania z serwera... 544 Konfigurowanie ustawień klienta... 548 Podsumowanie... 560 18 Konfigurowanie usług sieciowych... 561 Tworzenie raportów z informacjami o ustawieniach serwera DNS... 561
x Spis treści Konfigurowanie ustawień rejestrowania dla serwera DNS... 568 Tworzenie raportów z informacjami o wskazówkach dotyczących serwerów głównych... 577 Odpytywanie rekordów typu A... 578 Konfigurowanie ustawień serwera DNS... 584 Tworzenie raportów z informacjami o strefach DNS... 590 Tworzenie stref DNS... 593 Zarządzanie serwerami WINS i DHCP... 598 Podsumowanie... 604 19 Praca z systemem Windows Server 2008 Server Core... 605 Konfiguracja początkowa... 605 Podłączanie serwera do domeny... 606 Konfigurowanie adresu IP... 614 Konfigurowanie ustawień DNS... 620 Zmiana nazwy serwera... 628 Zarządzanie systemem Windows Server 2008 Server Core... 634 Monitorowanie serwera... 635 Odpytywanie dziennika zdarzeń... 637 Podsumowanie... 640 A Konwencja nazw dla narzędzi typu cmdlet... 641 B Nazwy dostawców obiektów danych typu ActiveX... 645 C Często zadawane pytania... 647 D Wskazówki dotyczące tworzenia skryptów... 655 E Ogólne wskazówki dotyczące rozwiązywania problemów... 665 Indeks... 669 Informacja o autorze... 696
Podziękowania Z każdą pisaną przeze mnie książką spotykam się z nowymi wyzwaniami do pokonania... i nowymi przyjaciółmi, którzy mi w tym pomagają! Oprócz pomocy otrzymywanej od nowych przyjaciół, nadal jednak otrzymuję mnóstwo wsparcia także od swoich starych przyjaciół. Najlepszym z nich jest Teresa, która przypadkiem jest również moją żoną. Teresa stale rozwija swoje umiejętności na polu wydawniczym. Powodzenie, jakie osiągnęły moje pozostałe książki, jest w znacznej mierze zasługą jej umiejętności jako redaktora technicznego. Bardzo cenię sobie jej sugestie, komentarze oraz dar wyłapywania błędów. Fakt, że moi wydawcy myśleli, iż jestem literatem, jest jej bezpośrednią zasługą. I rzecz najbardziej zdumiewająca: z wykształcenia Teresa jest księgową! W tym miejscu muszę również podziękować mojej agentce, Claudette Moore, z agencji wydawniczej Moore Literary Agency. Dała mi ona poczucie, jak bym był jedynym reprezentowanym przez nią autorem. Stopień jej osobistego zaangażowania jest po prostu wspaniały. Claudette doskonale spisała się również dbając o to, abym zawsze pracował nad właściwym projektem, we właściwym czasie. Dzięki niej mogłem się skoncentrować na pracy nad swoim bieżącym projektem, podczas gdy ona już zajmowała się przygotowywaniem dla mnie następnego zlecenia. To naprawdę nie byle co! Martin DelRe jest moim redaktorem inicjującym z ramienia wydawnictwa MSPress. WOW! Ten facet jest wyjątkowym zwolennikiem stosowania skryptów i wie, jak sprawić, by publikowane książki spełniały oczekiwania społeczności użytkowników i autorów skryptów. Jednak Martin znacznie wykracza poza tę charakterystykę. Jest on jedną z najpogodniejszych i najbardziej entuzjastycznych osób, jaką znam, i wydaje się, że śledzi projekty poszczególnych książek od chwili ich powstania, przez cały proces ich publikacji. Miałem naprawdę wiele szczęścia, że Bob Hogan został ponownie moim recenzentem technicznym. Jest on bardzo optymistyczną i ofiarną osobą, o przenikliwym umyśle technicznym, która naprawdę zna się na tworzeniu skryptów. Dzięki niemu zaoszczędziłem wiele czasu podczas pracy nad tym projektem, podobnie jak to miało miejsce podczas pracy nad moimi wcześniejszymi książkami. Dobra robota, Bob! Dzięki tej książce poznałem także kilkoro nowych przyjaciół. Michelle Goodman wykonała doskonałą pracę jako redaktor dbając o to, abym zawsze kończył swoją pracę w terminie. Pisanie książki zajęło mi ponad 10 miesięcy, w trakcie których przeleciałem samolotami prawie 200 000 mil, pracowałem w kilkunastu krajach, kilkakrotnie nurkowałem, raz byłem chory i sześć razy przekraczałem międzynarodową linię zmiany daty. W tym czasie Michelle zawsze dotrzymywała mi kroku, a nawet udało jej się zakończyć projekt na dwa tygodnie przed terminem! Dobra robota. Maureen Zimmerman po raz kolejny była jednym z redaktorów zajmujących się moją książką. Zawdzięczam jej doskonały start i gładkie przejście pod skrzydła Michelle. Urocze! Dean Tsaltas jest człowiekiem zajmującym się na co dzień pisaniem skryptów, który dostarczył mi odpowiedzi na kilka pytań związanych z podsystemem WMI oraz zapewnił dostęp do najnowszych wersji dokumentacji WMI SDK, a poza tym jest po prostu fajnym facetem. Denise Bankaitis przejęła stery po Michelle, która w pewnym momencie musiała opuścić projekt, wpierała mnie i dbała o to, abym na czas naniósł wszystkie poprawki i można było przekazać książkę do druku. A skoro już mowa o druku, to należy wspomnieć o Lindzie xi
xii Podziękowania Allen z wydawnictwa Custom Editorial Productions, Inc., która pełniła funkcję kierownika projektu i w znacznej mierze przyczyniła się do ukazania się tej książki drukiem. Kathy Eastman była również jednym z moich redaktorów i dzięki jej pomocy ta książka wygląda nareszcie tak, jak gdyby jej autorem był ktoś, kto jest prawie literatem. Wszystkim tym trzem paniom należą się ogromne podziękowania Należy tu wymienić również nazwisko Jeffrea Snovera, architekta programu Windows PowerShell, ponieważ to właśnie on stworzył coś, co jeden z moich klientów nazwał ostatnio najlepszą rzeczą jaką od lat zdarzyło się wypuścić firmie Microsoft. Jest to bardzo wymowna opinia, ponieważ ostatnio mieliśmy do czynienia z kilkoma naprawdę dobrymi produktami, ale całkowicie się z nią zgadzam. Jeffrey udzielił mi także odpowiedzi na kilka pytań dotyczących programu Windows PowerShell, z którymi nie mogłem sobie poradzić od kilku dni. To bardzo błyskotliwa osoba. Chris BellŽe, Pete Christensen oraz Jit Banerjie zostali przeszkoleni pod kątem prowadzenia moich szkoleń z zakresu programu Windows PowerShell i często spotykali się z moimi komentarzami w rodzaju To nie działa. Czy możesz to poprawić?. Zwykle poprawiali. Czuję się, jak gdyby byli moimi dobrymi przyjaciółmi i cieszę się, że mieszkają w Australii, dzięki czemu mogę ich odwiedzać! Co więcej, Peter jest także instruktorem nurkowania (zazdroszczę mu). Jit oczywiście nie jest moim nowym przyjacielem mam to szczęście znać go już prawie od pięciu lat. Naprawdę mogę uważać się za szczęściarza, ponieważ jego żona szczyci się najlepszą kuchnią w całej Australii i jest po prostu uroczą osobą. Jest jeszcze Chris. No cóż, on jest po prostu najfajniejszą osobą, jaką znam!
Wstęp Najlepszy na świecie język skryptowy w połączeniu z najlepszym na świecie systemem operacyjnym! To jak połączenie masła orzechowego i czekolady jedno jest wprost stworzone dla drugiego. Systemy Windows Vista i Windows Server 2008 są nie tylko najważniejszymi wersjami systemu Windows w historii firmy Microsoft, ale także wersjami najbardziej konfigurowalnymi. Tak, właśnie konfigurowalnymi! Postęp, który sprawił, że graficzny interfejs użytkownika stał się tak atrakcyjny dla zwykłych użytkowników, jest jednocześnie główną przyczyną zmartwień administratorów sieci, konsultantów i zaawansowanych użytkowników. Na szczęście narzędzie służące do administrowania serwerem Exchange Server 2007, serwerem Virtual Server 2007 a nawet serwerem Windows Server 2008, jest dokładnie tym samym narzędziem, które umożliwia administrowanie systemem Windows Vista. Narzędziem tym jest program Windows PowerShell. Jako autor pięciu książek poświęconych pisaniu skryptów dla systemu Windows oraz konsultant zatrudniony w firmie Microsoft, przemierzyłem już cały świat obwieszczając pojawienie się kolejno języka Visual Basic Script (VBScript), usługi WMI (Windows Management Instrumentation Instrumentacja zarządzania systemem Windows), interfejsu ADSI (Active Directory Services Interfaces Interfejs usług katalogowych Active Diretory)... i oto mamy nowy element tej układanki program Windows PowerShell. Posługując się programem Windows PowerShell nawet początkujący administrator sieci może utworzyć skrypt wyświetlający listę procesów najintensywniej wykorzystujących zasoby komputera, i to za pomocą zaledwie kilku linii kodu. Wprawdzie to samo zadanie można wykonać za pomocą skryptu napisanego w języku VBScript, ale będzie to dużo bardziej czasochłonne i wymagać będzie znacznie więcej pisania. Za pomocą dokładnie tej samej linii kodu będzie można znajdować procesy najintensywniej korzystające z zasobów komputera zarówno w systemie Windows Server 2008, jak i w systemie Windows Vista. Nowe produkty firmy Microsoft będą dostarczać nowych poleceń typu cmldet dla programu Windows PowerShell (polecenia typu cmdlet są siłą napędową programu Windows PowerShell i zostaną omówione w rozdziale 1), interfejsów, a w niektórych przypadkach także gotowych narzędzi. Jest to naprawdę dobra wiadomość, ponieważ oznacza ona, że zbliżamy się do czasów, gdy administrowanie systemem operacyjnym i konfigurowanie aplikacji można będzie prowadzić w jednakowy sposób. Windows PowerShell jest nowym językiem skryptowym, który po raz pierwszy pojawił się przy okazji publikacji serwera Microsoft Exchange 2007. Produkt ten jest udostępniany na witrynach webowych firmy Microsoft i może być instalowany w systemach Windows XP, Windows Server 2003 i Windows Vista. Jest on także jedną z funkcji dostępnych podczas instalacji systemu Windows Server 2008 i w kolejnych wersjach klienckich systemów Windows będzie również stanowił część podstawowej instalacji. Ponieważ narzędzia służące do administrowania serwerem Microsoft Exchange 2007 zostały stworzone w oparciu o program Windows PowerShell, więc pierwszymi osobami poznającymi tajniki programu Windows PowerShell i używającymi go w codziennej pracy często będą administratorzy serwerów Exchange. Zarządzanie bezpieczeństwem, zasobami rejestru lub konfiguracją usług należy do codziennych zadań wykonywanych przez administratorów sieci i dzięki elastyczności programu Windows PowerShell zadania te można realizować w niezmiernie łatwy sposób. xiii
xiv Wstęp Czy ta książka jest dla mnie? Książka Windows PowerShell przewodnik po skryptach dostarczy Czytelnikowi narzędzi umożliwiających automatyzację procesu instalowania, wdrażania i zarządzania komputerami pracującymi pod kontrolą systemu Windows. Przy okazji książka ta umożliwia dokładne zrozumienie działania poleceń typu cmdlet, dostarczanych razem z produktem Windows PowerShell. Ponad 300 skryptów ilustruje główne zadania wykonywane przez administratorów sieci, związane z zabezpieczeniami, konfiguracją, wdrażaniem, bieżącym administrowaniem systemem, konfigurowaniem i eksploatacją sieci oraz rozwiązywaniem problemów. Książka Windows PowerShell przewodnik po skryptach doskonale nadaje się dla kilku różnych grup odbiorców, w tym między innymi dla: n Konsultantów sieciowych Windows Do standaryzacji i automatyzacji procesów instalowania i konfigurowania sieciowych składników środowiska.net. n Administratorów sieci opartej na systemie Windows Do automatyzacji codziennych zadań związanych z administrowaniem sieciami opartymi na systemie Windows. n Osób z tytułami MCSE (Microsoft Certified Systems Engineer) oraz MCT (Microsoft Certified Trainers) Do przygotowywania się do kilku nowych egzaminów certyfikacyjnych, które obecnie zawierają pytania dotyczące także znajomości programu Windows PowerShell. n Pracowników technicznych Do gromadzenia informacji i ustawień skonfigurowanych na komputerach pracujących z systemem Windows. n Zaawansowanych użytkowników o wysokich wymaganiach Do uzyskania maksymalnej funkcjonalności i możliwości konfigurowania komputerów pracujących pod kontrolą systemu Windows zarówno w warunkach domowych, jak i w niezarządzanych środowiskach pracy. Książka Windows PowerShell przewodnik po skryptach została koncepcyjnie podzielona na cztery części: omówienie programu Windows PowerShell, używanie programu Windows PowerShell w systemie Windows Vista, używanie programu Windows PowerShell w systemie Windows Server 2008 oraz bieżące administrowanie konkretnymi aplikacjami. W rzeczywistości książka ta nie została podzielona na takie części, ale każdy rozdział został napisany jako autonomiczna jednostka. Umożliwia to sięgnięcie po książkę w razie potrzeby i szybkie odszukanie w niej odpowiedzi na konkretne pytanie. Np. administrując usługą IIS 7 można szybko przejść do rozdziału 15, zatytułowanego Zarządzanie internetowymi usługami informacyjnymi. Korzystanie z obrazu dysku CD Obraz dysku CD towarzyszącego książce jest dostępny na stronie wydawcy przy opisie książki w zakładce Dodatkowe informacje, pod adresem: http://www.ksiazki.promise.pl/aspx/produkt.aspx?pid=43656
Wstęp xv Na podstawie tego obrazu można wykonać fizyczny dysk CD lub zainstalować go jako napęd wirtualny. Dysk ten zawiera dodatkowe informacje, składniki oprogramowania oraz skrypty. Naprawdę mnóstwo skryptów. W rzeczywistości na płycie tej znajduje się dokładnie 317 skryptów (wiem to, ponieważ napisałem skrypt, który je wszystkie policzył!). Są tam skrypty i przykładowe rezultaty ich działania dla każdego z rozdziałów tej książki. Nazwy poszczególnych folderów odpowiadają nazwom rozdziałów, więc odszukanie odpowiedniego skryptu nie powinno nastręczać żadnych trudności. Większość z tych skryptów jest niezależna od konkretnego środowiska i nie zakłada istnienia żadnych specjalnych wartości. Skrypty te akceptują parametry wiersza poleceń, które umożliwiają modyfikowanie sposobu działania skryptu w chwili jego uruchamiania. Wśród zamieszczonych na płycie skryptów istnieje jednak kilka przykładów, w których użyto konkretnych, przykładowych wartości. Dostosowanie tych skryptów do własnego środowiska wymaga jedynie nieznacznych modyfikacji. We wszystkich takich przypadkach wymagane zmiany zostały odnotowane bądź to jako komentarz umieszczony w kodzie skryptu, bądź w tekście książki, bądź w obydwu tych miejscach jednocześnie. Na płycie CD znajduje się także kilka plików z bazą danych. Pliki te zostały utworzone za pomocą programu Microsoft Access 2007. Ponieważ jednak część z czytelników zapewne nadal korzysta ze starszych wersji programu Access, pliki te zostały przewidująco zapisane w trybie zgodności. Wszystkie zrzuty ekranowe zamieszczone w tej książce i odwołujące się do plików baz danych pochodzą jednak z programu Access 2007. Decydując się na skorzystanie ze znajdującego się na płycie programu instalacyjnego, przykładowe skrypty zostaną automatycznie skopiowane do katalogu [Moje dokumenty]\microsoft Press\PowerShell Scripting Guide\scripts. W trakcie procesu instalacji istnieje jednak możliwość zmiany tej lokalizacji. Nie należy pomijać folderu \extras! Pozwolę sobie wyjaśnić dlaczego. Jestem entuzjastą pisania skryptów a zwłaszcza skryptów programu Windows PowerShell. W rezultacie napisałem wiele skryptów nie związanych z żadnym z rozdziałów tej książki ani poruszanych w niej tematów (kiedy już zacząłem nie mogłem przestać!). Skrypty te nie są jednak bezwartościowe: mogą one stanowić doskonałą ilustrację zastosowania konkretnych, użytecznych technik. Cześć z tych skryptów, np. takich jak skrypt FlashingBunny.ps1 (migający króliczek), jest trochę głupia i przedstawia niewielką wartość. Mimo to w tym folderze znaleźć można kilka perełek umożliwiających rozwiązanie konkretnych problemów i zaoszczędzenie kilku godzin pracy (np. jeśli szef poprosi Cię Czy mógłbyś napisać dla mnie skrypt wyświetlający migającego króliczka? będziesz miał gotowe rozwiązanie!). Wymagania systemowe n Procesor taktowany zegarem o minimalnej częstotliwości 1.0 gigahertza (GHz) z rodziny procesorów Intel Pentium/Celeron lub z rodziny procesorów AMD k6/atholon/duron n 1.0 GB pamięci n 1.5 GB wolnego miejsca na dysku n Monitor o rozdzielczości 1024 768 lub większej n Napęd CD-ROM lub DVD n Mysz Microsoft Mouse lub inne kompatybilne urządzenie wskazujące
xvi Wstęp n System operacyjny Windows Server 2003 SP1, Windows XP SP2 lub Windows Vista n Microsoft.NET Framework 2.0 Ta książka została napisana z myślą zarówno o systemie operacyjnym Windows Vista, jak i o systemie Windows Server 2008. Zamieszczone w niej skrypty nie były testowane w systemie Windows XP ani w systemie Windows Server 2003, choć w większości przypadków powinny one działać bez żadnych modyfikacji. Pomoc techniczna Dołożono wszelkich starań, aby zapewnić dokładność treści prezentowanych w tej książce oraz zamieszczonych na towarzyszącej jej płycie CD-ROM. Wydawnictwo Microsoft Press publikuje erraty do swoich książek za pomocą witryny webowej http://www.microsoft.com/ learning/support. Aby połączyć się bezpośrednio z bazą wiedzy firmy Microsoft (Microsoft Knowledge Base), umożliwiającą wyszukanie informacji dotyczących pytania lub określonego problemu, należy odwiedzić stronę http://www.microsoft.com/learning/support. Wszelkie komentarze, pytania lub pomysły dotyczące tej publikacji bądź towarzyszącej jej płyty CD-ROM prosimy kierować do wydawnictwa Microsoft Press za pomocą jednej z następujących metod: Pocztą elektroniczną (e-mail) Pocztą tradycyjną mspinput@microsoft.com Microsoft Press Attn: Editor, Windows PowerShell Scripting Guide One Microsoft Way Redmond, WA 98052 Prosimy pamiętać, że pod żadnym z tych adresów nie jest udzielana pomoc techniczna dotycząca produktu. Wyszukiwanie dodatkowych materiałów w sieci W miarę pojawiania się nowych lub zaktualizowanych materiałów uzupełniających treść tej książki będą one publikowane na witrynie webowej Microsoft Press Online Windows Server and Client. W zależności od opublikowania finalnej wersji systemu Windows Server 2008, wśród publikowanych na tej stronie materiałów mogą znaleźć się aktualizacje treści książki, artykuły, łącza do materiałów uzupełniających, przykładowe rozdziały i wiele innych. Wymieniona witryna webowa będzie dostępna wkrótce pod adresem www.microsoft. com/learning/books/online/serverclient, a jej zawartość będzie co jakiś czas aktualizowana.
Rozdział 1 Powłoka programu Windows PowerShell Po ukończeniu tego rozdziału Czytelnik będzie potrafił: n Instalować i konfigurować program Windows PowerShell. n Radzić sobie z problematyką bezpieczeństwa w programie Windows PowerShell. n Zrozumieć podstawy działania i korzystania z poleceń typu cmdlet. n Używać aliasów do przypisywania skróconych nazw poleceniom typu cmdlet. n Uzyskiwać pomoc dotyczącą korzystania z programu Windows PowerShell. Na dysku CD Wszystkie używane w tym rozdziale skrypty znajdują się na towarzyszącej tej książce płycie CD-ROM w folderze \scripts\chapter01. Instalowanie programu Windows PowerShell Ponieważ domyślnie program Windows PowerShell nie jest instalowany w żadnym systemie operacyjnym firmy Microsoft, dlatego bardzo ważne jest, aby przed przystąpieniem do wdrażania rzeczywistych skryptów lub poleceń sprawdzić, czy program Windows PowerShell został zainstalowany na danej platformie. Najprościej można to zrobić próbując wykonać jedno z poleceń programu Windows PowerShell i sprawdzając, czy polecenie to nie zwróci błędów. Zadanie to można z łatwością zrealizować z poziomu pliku wsadowego, sprawdzając wartość zmiennej %errorlevel%. Sprawdzanie instalacji za pomocą skryptu w języku VBScript Bardziej złożone podejście do zadania polegającego na sprawdzeniu, czy w systemie operacyjnym zainstalowany został program Windows PowerShell, polega na użyciu skryptu korzystającego z obiektu WMI (Windows Management Instrumentation Instrumentacja zarządzania systemu Windows), o nazwie Win32_QuickFixEngineering. Przykład wykorzystania obiektu Win32_QuickFixEngineering w języku Microsoft Visual Basic Scripting Edition (VBScript) do wykrycia instalacji programu Windows PowerShell znajduje się w skrypcie FindPowerSell.vbs. Skrypt FindPowerShell.vbs wykorzystuje alternatywną nazwę (ang. moniker) systemu WMI do utworzenia instancji obiektu klasy SwbemServices, a następnie wykonuje zapytanie, korzystając z metody execquery. Zapytanie w języku WQL (WMI Query Language Język zapytań systemu WMI) używa operatora like, do pobrania listy poprawek typu hotfix, z wartością identyfikatora 928439, która w systemie Windows XP, Windows Vista, Windows Server 2003 oraz Windows Server 2008 oznacza identyfikator poprawki będącej 1
2 Windows PowerShell przewodnik po skryptach programem Windows PowerShell. Po zidentyfikowaniu poprawki skrypt ten po prostu wypisuje nazwę komputera, informując o zainstalowaniu na nim programu Windows PowerShell. Przykład takiego komunikatu został pokazany na rysunku 1-1. Rysunek 1-1 Wyskakujące okno dialogowe, wyświetlone przez skrypt FindPowerShell.vbs, z informacją o znalezieniu w systemie programu Windows PowerShell. Jeśli wskazana poprawka nie zostanie odnaleziona, wówczas skrypt wyświetli informację, że program PowerShell nie został zainstalowany. Skrypt FindPowerShell.vbs można bardzo łatwo zmodyfikować dodając do niego nową funkcjonalność, która może być potrzebna w danej sieci. Przykładowo może pojawić się potrzeba uruchamiania tego skryptu dla wielu różnych nazw komputerów. W tym celu można przekształcić obiekt strcomputer w tablicę i wpisać od razu kilka nazw komputerów. Nazwy komputerów można również odczytać z pliku tekstowego lub pobrać je za pomocą zapytania skierowanego do usługi katalogowej Active Directory. Wynik działania skryptu można również skierować do pliku, zamiast tworzyć wyskakujące okno dialogowe. FindPowerShell.vbs Const RtnImmedFwdOnly = &h30 strcomputer = "." wmins = "\root\cimv2" wmiquery = "Select * from win32_quickfixengineering where hotfixid like '928439'" Set objwmiservice = GetObject("winmgmts:\\" & strcomputer & wmins) Set colitems = objwmiservice.execquery(wmiquery,,rtnimmedfwdonly) For Each objitem in colitems Wscript.Echo "Program PowerShell jest zainstalowany na " & objitem.csname Wscript.quit Next Wscript.Echo Program PowerShell nie został zainstalowany Wdrażanie programu Windows PowerShell Po pobraniu programu Windows PowerShell z witryny http://www.microsoft.com/downloads można go wdrożyć w posiadanym środowisku przy użyciu dowolnej, aktualnie używanej, standardowej metody wdrażania oprogramowania. Do metod używanych przez klientów do wdrażania programu Windows PowerShell należą między innymi: n Utworzenie pakietu Microsoft SMS (Systems Management Server Serwer zarządzania systemami) i anonsowanie go w odpowiedniej jednostce organizacyjnej (OU) lub kolekcji. n Utworzenie w kartotece Active Directoty obiektu zasad grupy (GPO Group Policy Object) i połączenie go z odpowiednią jednostką organizacyjną (OU).
Rozdział 1: Powłoka programu Windows PowerShell 3 n Uruchomienie programu wykonywalnego za pomocą skryptu logowania. Jeśli wdrożenie programu Windows PowerShell nie dotyczy całego przedsiębiorstwa, prawdopodobnie najprostszym sposobem instalacji będzie po prostu dwukrotne kliknięcie odpowiedniego pliku wykonywalnego i wykonanie kolejnych kroków, zgodnie z instrukcjami kreatora instalacji. Należy w tym miejscu podkreślić, że program Windows PowerShell jest instalowany za pomocą technologii poprawek typu hotfix. Oznacza to, że program Windows PowerShell ma postać aktualizacji systemu operacyjnego, a nie dodatkowego programu. Takie podejście ma kilka zalet, włącznie z możliwością oferowania aktualizacji i poprawek dla programu Windows PowerShell za pomocą pakietów serwisowych systemu operacyjnego oraz za pomocą witryny Windows Update. Niestety ma ono również kilka minusów wynikających z faktu, że deinstalacja poprawek typu hotfix musi przebiegać w odwrotnej kolejności do ich instalacji. Np. jeśli program Windows PowerShell zostanie zainstalowany w systemie Windows Vista, a później w systemie tym zainstalowana zostanie seria aktualizacji oraz pakiet Service Pack 1, to, jeśli zdecydujemy się nagle na usunięcie z systemu programu Windows PowerShell, konieczne będzie odinstalowanie w odpowiedniej kolejności najpierw pakietu Service Pack 1, a potem wszystkich zainstalowanych poprawek typu hotfix (osobiście w takiej sytuacji zdecydowałbym się raczej na wykonanie kopii zapasowej wszystkich swoich danych, sformatowanie dysku twardego i ponowne zainstalowanie systemu Windows Vista. Sądzę, że takie rozwiązanie byłoby szybsze. Ale i tak scenariusz taki jest mocno dyskusyjny, ponieważ zwykle nie spotkamy się z potrzebą odinstalowania programu Windows PowerShell). Czym jest program Windows PowerShell Jednym z problemów związanych z programem Windows PowerShell jest niewłaściwe zrozumienie, czym jest ten program. Gdy po raz pierwszy spotkałem się Jeffreyem Snoverem, głównym architektem programu Windows PowerShell, jedną z pierwszych usłyszanych od niego rzeczy było pytanie: W jaki sposób opisałbyś program Windows PowerShell swoim klientom?. A więc czym jest program Windows PowerShell? Mówiąc najprościej, Windows PowerShell to oferowana przez firmę Microsoft nowa powłoka wiersza poleceń i język skryptowy, który może zastąpić zarówno nieco już leciwy interpreter poleceń Cmd.exe, jak i język skryptowy VBScript. Ta dwoista natura stwarza pewne problemy dla wielu administratorów sieci, którzy przywykli do automatyzowania zadań administracyjnych za pomocą interpretera poleceń Cmd.exe, z jego słabo rozwiniętym językiem wsadowym oraz wszechstronnego (lecz zawiłego) języka skryptowego VBScript. Nie są to złe narzędzia, ale obecnie często są wykorzystywane w sposób niezgodny z ich przeznaczeniem określonym ponad dekadę temu, gdy oba te narzędzia dopiero powstawały. Interpreter poleceń Cmd.exe jest w zasadzie następcą okna wiersza poleceń systemu DOS, a język VBScript został zaprojektowany, w większym lub w mniejszym stopniu, z myślą o stronach webowych. Żadne z tych narzędzi nie zostało stworzone od podstaw z myślą o administratorach sieci.
4 Windows PowerShell przewodnik po skryptach Interakcja z powłoką Po uruchomieniu programu Windows PowerShell można z niego korzystać w taki sam sposób, jak z interpretera poleceń Cmd.exe. Np. posługując się poleceniem dir można uzyskać listę zawartości katalogu. Można również najpierw zmienić katalog bieżący za pomocą polecenia cd, a następnie sprawdzić jego zawartość za pomocą polecenia dir, zupełnie w taki sam sposób, jak podczas korzystania z powłoki CMD. Rezultaty użycia wymienionych poleceń ilustruje zamieszczony poniżej przykładowy plik UsingPowerShell.txt. UsingPowerShell.txt PS C:\Users\edwils> dir Directory: Microsoft.PowerShell.Core\FileSystem::C:\Users\edwils Mode LastWriteTime Length Name ---- ------------- ------ ---- d-r-- 11/29/2006 1:32 PM Contacts d-r-- 4/2/2007 12:51 AM Desktop d-r-- 4/1/2007 6:53 PM Documents d-r-- 11/29/2006 1:32 PM Downloads d-r-- 4/2/2007 1:10 AM Favorites d-r-- 4/1/2007 6:53 PM Links d-r-- 11/29/2006 1:32 PM Music d-r-- 11/29/2006 1:32 PM Pictures d-r-- 11/29/2006 1:32 PM Saved Games d-r-- 4/1/2007 6:53 PM Searches d-r-- 4/2/2007 5:53 PM Videos PS C:\Users\edwils> cd music PS C:\Users\edwils\Music> dir Oprócz możliwości korzystania z tradycyjnych poleceń interpretera poleceń możliwe jest także korzystanie z nowszych narzędzi wiersza poleceń, takich jak prezentowany poniżej program Fsutil.exe. Należy przy tym pamiętać, że korzystanie z programu Fsutil.exe wymaga posiadania uprawnień administracyjnych. Uruchomienie powłoki Windows PowerShell z poziomu grupy programów Windows PowerShell nie zapewnia posiadania uprawnień administracyjnych i próba skorzystania z programu Fsutil.exe zakończy się wygenerowaniem błędu pokazanego na rysunku 1-2. Rysunek 1-2 Program Windows PowerShell podlega mechanizmom kontroli konta użytkownika i domyślnie jest uruchamiany z uprawnieniami zwykłego użytkownika. Próby wykonywania poleceń wymagających wyższego poziomu uprawnień mogą wówczas kończyć się błędami.
Rozdział 1: Powłoka programu Windows PowerShell 5 Fsutil.txt PS C:\Users\edwils> sl c:\mytest PS C:\mytest> fsutil file createnew c:\mytest\mynewfile.txt 1000 File c:\mytest\mynewfile.txt is created PS C:\mytest> dir Directory: Microsoft.PowerShell.Core\FileSystem::C:\mytest Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 5/8/2007 7:30 PM 1000 mynewfile.txt PS C:\mytest> PS C:\Users\edwils> sl c:\mytest PS C:\mytest> fsutil file createnew c:\mytest\mynewfile.txt 1000 Plik c:\mytest\mynewfile.txt został utworzony PS C:\mytest> dir Katalog: Microsoft.PowerShell.Core\FileSystem::C:\mytest Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2008-06-10 21:35 1000 mynewfile.txt PS C:\mytest> Wskazówka Zalecane jest utworzenie dwóch skrótów do programu Windows PowerShell i zapisanie ich na pasku Quick Launch (Szybkie uruchamianie). Jeden z tych skrótów powinien uruchamiać program z uprawnieniami zwykłego użytkownika a drugi z uprawnieniami administracyjnymi. Domyślnie należy korzystać ze skrótu uruchamiającego program z uprawnieniami zwykłego użytkownika, dokumentując te przypadki, które wymagają używania uprawnień administracyjnych. Po zakończeniu pracy z plikami i z folderem można bardzo łatwo usunąć plik za pomocą polecenia del. Aby uniknąć konieczności wpisywania całej nazwy pliku, można posłużyć się znakami uogólniającymi, np. *.txt. Jest to wystarczająco bezpieczne, ponieważ wcześniej sprawdziliśmy za pomocą polecenia dir, że w danym folderze znajduje się tylko jeden plik tekstowy. Po usunięciu pliku, używając polecenia rd, można również usunąć sam katalog. Jak pokazano w poniższym przykładzie DeleteFileAndFolder.txt, polecenia te działają dokładnie tak samo jak podczas korzystania z okna wiersza poleceń. DeleteFileAndFolder.txt PS C:\> sl c:\mytest PS C:\mytest> dir Directory: Microsoft.PowerShell.Core\FileSystem::C:\mytest Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 5/8/2007 7:30 PM 1000 mynewfile.txt
6 Windows PowerShell przewodnik po skryptach PS C:\mytest> del *.txt PS C:\mytest> cd c:\ PS C:\> rd c:\mytest PS C:\> dir c:\mytest Get-ChildItem : Cannot find path 'C:\mytest' because it does not exist. At line:1 char:4 + dir <<<< c:\mytest PS C:\>... PS C:\> dir c:\mytest Get-ChildItem : Nie można odnaleźć ścieżki 'C:\mytest', ponieważ ona nie istnieje. Plik: wiersz; wiersz: 1; znak: 4 + dir <<<< c:\mytest PS C:\> W pokazanych powyżej przykładach program Windows PowerShell używany był w sposób interakcyjny. Jest to jedno z głównych zastosowań tego programu. Zespół tworzący program Windows PowerShell zakładał, że około 80% użytkowników będzie korzystać z tego programu w sposób interakcyjny, traktując go po prostu jako lepszą wersję okna wiersza poleceń. Użytkownicy będą otwierać wiersz poleceń programu Windows PowerShell i wpisywać tekst poleceń. Polecenia mogą być wpisywane pojedynczo lub grupowane, w podobny sposób jak w plikach wsadowych typu.bat. Możliwość ta zostanie opisana w dalszej części tej książki, ponieważ domyślnie jest ona wyłączona. Omówienie narzędzi wiersza poleceń typu Cmdlet Oprócz możliwości korzystania z tradycyjnych programów i poleceń znanych z interpretera poleceń Cmd.exe, możliwe jest także używanie specjalnych narzędzi wiersza poleceń (tzw. poleceń typu cmdlet), które są wbudowane w program Windows PowerShell. Cmdlet to nazwa utworzona przez zespół programistów tworzących program Windows PowerShell, oznaczająca tego rodzaju natywne polecenia. Polecenia te są podobne do programów wykonywalnych, ale ponieważ korzystają z funkcji wbudowanych w program Windows PowerShell, są łatwiejsze do napisania. Nie są to skrypty, które zawierają nieskompilowany kod, ponieważ do ich tworzenia używane są usługi specjalnej przestrzeni nazw platformy Microsoft.NET Framework. Z powodu swojej odmiennej natury programiści z zespołu tworzącego program Windows PowerShell utworzyli dla tych poleceń nowy termin cmdlet. Program Windows PowerShell oferuje ponad 120 narzędzi typu cmdlet, zaprojektowanych z myślą o umożliwieniu konsultantom i administratorom sieci łatwego korzystania z możliwości oferowanych przez program PowerShell, bez konieczności uczenia się języka skryptowego Windows PowerShell. Narzędzia te zostały wymienione w dodatku A, zatytułowanym Konwencja nazw dla narzędzi typu cmdlet. Generalnie nazwy narzędzi typu cmdlet tworzone są zgodne ze standardową konwencją nazw, np. Get-Help (Uzyskaj pomoc), Get-EventLog (Uzyskaj dziennik zdarzeń) lub Get-Process (Pobierz proces). Polecenia, których nazwy zaczynają się od członu "get" (pobierz/uzyskaj), wyświetlają informacje o elemencie wskazanym w drugim członie ich nazwy (z prawej strony znaku myślnika). Polecenia o nazwach zaczynających się od członu set (ustaw) służą do modyfikowania lub do konfigurowania elementów wskazanych w drugim członie nazwy. Przykładem polecenia typu set jest cmdlet Set-Service (Ustaw usługę), który umożliwia zmianę trybu
Rozdział 1: Powłoka programu Windows PowerShell 7 uruchamiania usług. Pełne objaśnienie konwencji nazw dla poleceń typu cmdlet znajduje się w dodatku A, zatytułowanym Konwencja nazw dla narzędzi typu cmdlet. Konfigurowanie programu Windows PowerShell Po zainstalowaniu programu Windows PowerShell na danej platformie, nadal pozostaje do rozwiązania jeszcze kilka kwestii związanych z konfiguracją. Częściowo wynika to ze sposobu, w jaki programiści firmy Microsoft z zespołu tworzącego program Windows PowerShell wyobrażają sobie sposób korzystania z tego narzędzia. Otóż zakładają oni, że 80% użytkowników programu Windows PowerShell nie będzie korzystać z funkcji skryptowych tego programu, a więc funkcjonalność obsługi skryptów jest domyślnie wyłączona. Więcej informacji na temat włączania obsługi skryptów przez program Windows PowerShell znajduje się w rozdziale 2, zatytułowanym Skrypty programu Windows PowerShell. Tworzenie profilu programu Windows PowerShell Istnieje wiele ustawień, które można przechowywać w profilu programu Windows PowerShell. Elementy te można zapisać w pliku psconsole. W celu eksportowania pliku z konfiguracją konsoli należy użyć polecenia cmdlet o nazwie Export-Console (Eksportuj konsolę), w pokazany poniżej sposób: PS C:\> Export-Console myconsole Plik psconsole domyślnie zapisywany jest w katalogu bieżącym i posiada rozszerzenie.psc1. Plik psconsole zapisywany jest w formacie XML. Poniżej pokazana została zawartość pliku z konfiguracją zwykłej konsoli: <?xml version="1.0" encoding="utf-8"?> <PSConsoleFile ConsoleSchemaVersion="1.0"> <PSVersion>1.0</PSVersion> <PSSnapIns /> </PSConsoleFile> Konfigurowanie opcji uruchamiania programu Windows PowerShell Istnieje kilka możliwych sposobów uruchamiania programu Windows PowerShell. Np. jeśli komuś przeszkadza logo wyświetlane po kliknięciu domyślnej ikony programu Windows PowerShell, to program ten można uruchomiać bez niego. Możliwe jest uruchamianie programu Windows PowerShell przy użyciu różnych profili, a nawet wykonywanie pojedynczego polecenia powłoki Windows PowerShell i kończenie jej działania. Jeśli istnieje potrzeba uruchomienia określonej wersji programu Windows PowerShell, można to zrobić podając odpowiednią wartość dla parametru version. Poniższa lista ilustruje każdą z tych możliwości. n Uruchomienie programu Windows PowerShell bez baneru startowego, przy użyciu argumentu -nologo:
8 Windows PowerShell przewodnik po skryptach PowerShell -nologo n Uruchomienie konkretnej wersji programu Windows PowerShell, przy użyciu argumentu -version: PowerShell -version 1.0 n Uruchomienie programu Windows PowerShell przy użyciu konkretnego pliku konfiguracyjnego, wskazanego za pomocą argumentu -psconsolefile: PowerShell -psconsolefile myconsole.psc1 n Uruchomienie programu Windows PowerShell, wykonanie określonego polecenia i zakończenie działania, używając argumentu -command. Polecenie do wykonania musi być poprzedzone znakiem ampersand (&) i ujęte w nawiasy klamrowe: powershell -command "& {get-process}" Kwestie bezpieczeństwa w programie Windows PowerShell Podobnie jak w przypadku każdego narzędzia, które jest równie wszechstronne jak program Windows PowerShell, pojawiają się pewne obawy dotyczące bezpieczeństwa. Bezpieczeństwo było jednak jednym z celów od początku uwzględnianym podczas tworzenia programu Windows PowerShell. Po uruchomieniu programu Windows PowerShell otwiera on folder użytkownika Użytkownicy\NazwaUżytkownika. Gwarantuje to, że katalog bieżący będzie katalogiem wobec którego użytkownik posiada uprawnienia potrzebne do wykonywania pewnych akcji oraz działań. Taka technika jest znacznie bezpieczniejsza niż uruchamianie programu w głównym katalogu dysku lub otwieranie głównego katalogu systemowego. Nie można automatycznie zmienić katalogu i przejść o jeden poziom wyżej katalog docelowy dla operacji zmiany katalogu musi zostać wskazany w sposób jawny (ale możliwe jest używanie notacji kropkowej w połączeniu z poleceniem cmdlet o nazwie Set-Location (Ustaw lokalizację), jak np. Set-Location..). Możliwość uruchamiania skryptów jest domyślnie wyłączona, ale można to łatwo zmienić za pomocą zasad grupy lub skryptów logowania. Kontrolowanie działania poleceń typu Cmdlet Czy kiedykolwiek Czytelniku zdarzyło Ci się otworzyć okno interpretera poleceń CMD, wpisać tekst polecenia i nacisnąć klawisz Enter, aby po prostu zobaczyć co się stanie? Gdyby tym poleceniem było akurat polecenie Format C:\, to czy na pewno zamierzałeś sformatować swój dysk C? Istnieje kilka argumentów, które można przekazywać do poleceń typu cmdlet celem kontrolowania sposobu ich działania. Argumenty te zostaną szerzej omówione poniżej. Wprawdzie nie wszystkie polecenia typu cmdlet obsługują omawiane tutaj argumenty, ale są one obsługiwane przez większość poleceń typu cmdlet, stanowiących część programu Windows PowerShell. Trzy sposoby kontrolowania działania polecenia typu cmdlet to argumenty -whatif (co jeśli) i -confirm (potwierdzenie) oraz akcja suspend (wstrzymanie). Akcja
Rozdział 1: Powłoka programu Windows PowerShell 9 Suspend nie jest argumentem przekazywanym do polecenia typu cmdlet, lecz akcją, którą można podjąć w odpowiedzi na monit z żądaniem potwierdzenia, a więc można ją uznać za jeszcze jeden sposób kontrolowania sposobu działania poleceń typu cmdlet. Wskazówka Większość poleceń typu cmdlet programu Windows PowerShell obsługuje tryb prototypowy, który można aktywować za pomocą parametru -whatif (co jeśli). O implementacji przełącznika whatif może decydować osoba tworząca dane cmdlet. Zespół twórców programu Windows PowerShell zaleca jednak programistom implementowanie przełącznika -whatif, jeśli tworzony przez nich cmdlet dokonuje jakichkolwiek zmian w systemie. Chcąc skorzystać z opcji -whatif, należy najpierw wpisać w oknie wiersza poleceń programu Windows PowerShell nazwę i parametry polecenia typu cmdlet, a następnie dopisać na końcu parametr -whatif. Zastosowanie argumentu -whatif ilustruje zamieszczony poniżej przykład z pliku Whatif.txt. Pierwsza linia zawiera polecenie uruchomienia programu Notatnik. W tym celu wystarczy pisać słowo notepad, tak jak to pokazano na przykładzie. Następnie użyty został cmdlet o nazwie Get-Process (Pobierz proces), za pomocą którego wyszukano wszystkie procesy o nazwach rozpoczynających się od note. Kolejne polecenie to użycie polecenia typu cmdlet o nazwie Stop-Process (Zatrzymaj proces), do zatrzymania procesu o nazwie notepad, ale, ponieważ nie znamy jeszcze rezultatów działania tego polecenia, użyty został parametr -whatif. Dzięki użyciu tego parametru dowiedzieliśmy się, że wykonanie polecenia spowodowałoby zabicie dwóch procesów, z których każdy ma nazwę notepad, a także uzyskaliśmy wartości identyfikatorów tych procesów pozwalające na zweryfikowanie, czy zabite zostałyby właściwe procesy. Już tylko dla zabawy, następne polecenie to ponowne użycie polecenia o nazwie Stop-Process (Zatrzymaj proces) do zatrzymania wszystkich procesów o nazwach zaczynających się na literę n. Tym razem również roztropnie użyty został parametr whatif, dzięki czemu mogliśmy się przekonać, co by się stało, gdyby to polecenie zostało wykonane. WhatIf.txt PS C:\Users\edwils> notepad PS C:\Users\edwils> Get-Process note* Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 45 2 1044 3904 53 0.03 3052 notepad 45 2 1136 4020 54 0.05 3140 notepad PS C:\Users\edwils> Stop-Process -processname notepad -WhatIf What if: Performing operation "Stop-Process" on Target "notepad (3052)". What if: Performing operation "Stop-Process" on Target "notepad (3140)". PS C:\Users\edwils> Stop-Process -processname n* -WhatIf What if: Performing operation "Stop-Process" on Target "notepad (3052)". What if: Performing operation "Stop-Process" on Target "notepad (3140)".... PS C:\users\edwils> Stop-Process -processname notepad -WhatIf WhatIf Wykonywanie operacji "Stop-Process" na elemencie docelowym "notepad (2368)". WhatIf Wykonywanie operacji "Stop-Process" na elemencie docelowym "notepad (2636)".
10 Windows PowerShell przewodnik po skryptach PS C:\users\edwils> Stop-Process -processname n* -WhatIf WhatIf Wykonywanie operacji "Stop-Process" na elemencie docelowym "notepad (2368)". WhatIf Wykonywanie operacji "Stop-Process" na elemencie docelowym "notepad (2636)". WhatIf Wykonywanie operacji "Stop-Process" na elemencie docelowym "ntfrs (404)". A co się stanie, jeśli przełącznik whatif nie został zaimplementowany? Przypadek ten został zilustrowany w zamieszczonym poniżej przykładzie Whatif2.txt. W przypadku użycia polecenia typu cmdlet o nazwie New-Item (Nowy element), do utworzenia w katalogu głównym nowego katalogu o nazwie mynewtest, przełącznik whatif został zaimplementowany i pokazuje, że to polecenie faktycznie spowoduje utworzenie katalogu C:\myNewtest. Zwróćmy jednak uwagę, co się stanie, jeśli spróbujemy użyć przełącznika whatif w połączeniu z poleceniem typu cmdlet o nazwie Get-Help (Uzyskaj pomoc). Można by oczekiwać, że użycie tego parametru spowoduje wyświetlenie komunikatu w rodzaju "What if: Retrieving help information for Get-Process cmdlet" (Co jeśli: pobieranie informacji pomocy dla polecenia typu cmdlet Get-Process (Pobierz proces)). Tylko jaka byłaby zasadność takiego działania? Ponieważ użycie polecenia Get-Help (Uzyskaj pomoc) nie stwarza żadnego zagrożenia dla systemu, więc w jego przypadku nie ma potrzeby implementowania przełącznika whatif. WhatIf2.txt PS C:\Users\edwils> New-Item -Name mynewtest -Path c:\ -ItemType directory -WhatIf What if: Performing operation "Create Directory" on Target "Destination: C:\myNewTest". PS C:\Users\edwils> get-help Get-Process -whatif Get-Help : A parameter cannot be found that matches parameter name 'whatif'. At line:1 char:28 + get-help Get-Process -whatif <<<< PS C:\users\edwils> New-Item -Name mynewtest -Path c:\ -ItemType directory -WhatIf WhatIf Wykonywanie operacji "Utwórz katalog" na elemencie docelowym "Miejsce docelowe: C:\myNewTest". PS C:\users\edwils> Get-Help Get-Process -WhatIf Get-Help : Nie można odnaleźć parametru pasującego do nazwy parametru 'WhatIf'. Plik: wiersz; wiersz: 1; znak: 28 + Get-Help Get-Process -WhatIf <<<< Najlepsze rozwiązanie Stosowanie parametru -whatif należy traktować jako jedno z podstawowych narzędzi w arsenale administratora sieci. Używanie tego parametru do pozorowania działania poleceń przed ich faktycznym wykonaniem może zaoszczędzić każdego roku wiele godzin pracy. Potwierdzanie poleceń Jak pokazaliśmy w poprzedniej części, użycie przełącznika -whatif pozwala na utworzenie w programie Windows PowerShell prototypu polecenia typu cmdlet. Jest to bardzo użyteczna możliwość pozwalająca na sprawdzenie, co zrobi dane polecenie. Jeśli jednak przed wykonaniem polecenia powinien zostać wyświetlony odpowiedni monit, to należy użyć
Rozdział 1: Powłoka programu Windows PowerShell 11 przełącznika -confirm. W praktyce przełącznik -whatif można generalnie zastąpić przełącznikiem -confirm, ponieważ powoduje on wyświetlenie odpowiedniego monitu przed wykonaniem właściwej akcji. Zostało to pokazane w zamieszczonym poniżej przykładzie ConfirmIt.txt. Pierwszym poleceniem w pliku ConfirmIt.txt jest uruchomienie programu Kalkulator (Calc.exe). Ponieważ plik z tym programem znajduje się na ścieżce systemowej, nie ma potrzeby podawania pełnej ścieżki do tego pliku ani jego rozszerzenia. Następnym poleceniem jest użycie narzędzia typu cmdlet o nazwie Get-Process (Pobierz proces) oraz wzorca uogólniającego c* do odszukania wszystkich procesów, których nazwa zaczyna się na literę c. Należy zwrócić uwagę, że na wynikowej liście znajdują się nazwy kilku takich procesów. Kolejny krok to pobranie informacji dotyczących tylko procesu Calc.exe. To polecenie zwraca bardziej odpowiedni zbiór wynikowy. Następnie użyty został cmdlet Stop-Process (Zatrzymaj proces) z przełącznikiem -confirm. Jego uruchomienie powoduje zwrócenie następujących informacji: Confirm Are you sure you want to perform this action? Performing operation "Stop-Process" on Target "calc (2924)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): Potwierdź Czy na pewno chcesz wykonać tę akcję? Wykonywanie operacji "Stop-Process" na elemencie docelowym "calc (1016)". [T] Tak [W] Tak na wszystko [N] Nie [S] Nie na wszystkie [M] Wstrzymaj Pomoc [?](wartość domyślna to "T"): Jak można zauważyć, informacje te są w zasadzie takie same, jak w przypadku użycia przełącznika whatif, z tą jednak różnicą, że w tym przypadku oferowana jest również możliwość wykonania żądanej akcji. Podczas wykonywania bardzo dużej liczby poleceń pozwala to na znaczną oszczędność czasu. ConfirmIt.txt PS C:\Users\edwils> calc PS C:\Users\edwils> Get-Process c* Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 43 2 1060 4212 54 0.03 2924 calc 1408 7 3364 6556 81 372 casha 1132 16 23156 34680 129 3084 CcmExec 599 5 1680 4956 88 620 csrss 480 10 15812 20500 195 688 csrss PS C:\Users\edwils> Get-Process calc Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 43 2 1060 4212 54 0.03 2924 calc PS C:\Users\edwils> Stop-Process -Name calc -Confirm Confirm
12 Windows PowerShell przewodnik po skryptach Are you sure you want to perform this action? Performing operation "Stop-Process" on Target "calc (2924)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y PS C:\Users\edwils> Get-Process c* Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 1412 7 3364 6556 81 372 casha 1154 16 23224 34740 130 3084 CcmExec 598 5 1680 4956 88 620 csrss 477 10 15812 20488 195 688 csrss... PS C:\users\edwils> Stop-Process -name calc -confirm Potwierdź Czy na pewno chcesz wykonać tę akcję? Wykonywanie operacji "Stop-Process" na elemencie docelowym "calc (1016)". [T] Tak [W] Tak na wszystko [N] Nie [S] Nie na wszystkie [M] Wstrzymaj Pomoc [?](wartość domyślna to "T"): t PS C:\users\edwils> Get-Process c*... Zawieszanie potwierdzeń wykonywania poleceń typu Cmdlet Możliwość wyświetlania monitów z prośbą o potwierdzenie zamiaru wykonania danego polecenia typu cmdlet jest wyjątkowo użyteczna i czasami może mieć zasadnicze znaczenie dla zachowania wysokiego poziomu dostępności systemu. Może się np. zdarzyć, że po wpisaniu długiego polecenia przypomnimy sobie o konieczności uprzedniego wykonania innej procedury. W takim przypadku można po prostu zawiesić wykonywanie tego polecenia. Polecenia użyte podczas zawieszonego wykonywania programu narzędziowego typu cmdlet oraz generowany przez te polecenia strumień wyjściowy pokazane zostały w zamieszczonym poniżej przykładzie SuspendConfirmation.txt. W przykładowym pliku SuspendConfirmation.txt najpierw uruchomiony zostaje program Microsoft Paint (Mspaint.exe). Ponieważ program Mspaint.exe znajduje się na ścieżce systemowej, nie ma potrzeby umieszczania w tym pliku żadnych dodatkowych informacji dotyczących ścieżki. Następnie przy pomocy polecenia typu cmdlet o nazwie Get-Process (Pobierz proces) oraz wzorca uogólniającego ms* pobrana zostaje lista wszystkich procesów, których nazwy zaczynają się na litery ms. Po zidentyfikowaniu właściwego procesu, użyty został cmdlet Stop-Process (Zatrzymaj proces) z przełącznikiem confirm. Zamiast odpowiadać yes (tak) na monit z prośbą o potwierdzenie, można po prostu zawiesić wykonywanie danego polecenia, co pozwoli na wykonanie innego polecenia (np. jeśli zapomnieliśmy, jaka jest wartość identyfikatora procesu). Po zakończeniu wykonywania tego dodatkowego polecenia należy wpisać polecenie exit, co spowoduje powrót z zagnieżdżonego monitu z powrotem do zawieszonego polecenia. Po zabiciu procesu programu mspaint można to potwierdzić używając ponownie polecenia cmdlet Get-Process (Pobierz proces).
Rozdział 1: Powłoka programu Windows PowerShell 13 SuspendConfirmation.txt PS C:\Users\edwils> mspaint PS C:\Users\edwils> Get-Process ms* Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 98 4 5404 10492 72 0.09 3064 mspaint PS C:\Users\edwils> Stop-Process -id 3064 -Confirm Confirm Are you sure you want to perform this action? Performing operation "Stop-Process" on Target "mspaint (3064)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): s PS C:\Users\edwils>>> Get-Process ms* Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 97 4 5404 10496 72 0.09 3064 mspaint PS C:\Users\edwils>>> exit Confirm Are you sure you want to perform this action? Performing operation "Stop-Process" on Target "mspaint (3064)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y PS C:\Users\edwils> Get-Process ms*... PS C:\users\edwils> Stop-Process -id 1028 -confirm Potwierdź Czy na pewno chcesz wykonać tę akcję? Wykonywanie operacji "Stop-Process" na elemencie docelowym "mspaint (1028)". [T] Tak [W] Tak na wszystko [N] Nie [S] Nie na wszystkie [M] Wstrzymaj Pomoc [?](wartość domyślna to "T"): m PS C:\users\edwils>>> Get-Process ms* Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 167 7 2912 6928 62 1,15 3292 msdtc 80 4 2696 7444 72 3,45 1028 mspaint PS C:\users\edwils>>> exit Potwierdź Czy na pewno chcesz wykonać tę akcję? Wykonywanie operacji "Stop-Process" na elemencie docelowym "mspaint (1028)". [T] Tak [W] Tak na wszystko [N] Nie [S] Nie na wszystkie [M] Wstrzymaj Pomoc [?](wartość domyślna to "T"): t PS C:\users\edwils> Get-Process ms* PS C:\users\edwils>
14 Windows PowerShell przewodnik po skryptach Przekazywanie opcji dla poleceń typu cmdlet Jak już pokazano w poprzednich częściach tego rozdziału, do kontrowania działania programów poleceń typu cmdlet można używać parametrów -whatif oraz -confirm. Jednym z pytań często zadawanych mi przez studentów jest pytanie Skąd wiadomo, jakie opcje są w ogóle dostępne?. Odpowiedź na to pytanie jest taka, że zespół tworzący program Windows PowerShell utworzył zbiór pewnych standardowych opcji. Te standardowe opcje nazywane są parametrami wspólnymi (common parameters). Przeglądając opisy składni różnych poleceń typu cmdlet często można zauważyć informację, że dany cmdlet obsługuje tzw. wspólne parametry. Poniżej pokazany został przykład takiego opisu dla polecenia cmdlet Get-Process (Pobierz proces): SYNTAX Get-Process [[-name] <string[]>] [<CommonParameters>] Get-Process -id <Int32[]> [<CommonParameters>] Get-Process -inputobject <Process[]> [<CommonParameters>] Jedną z użytecznych cech programu Windows PowerShell jest standaryzacja składni używanej przez programy polecenia typu cmdlet. Pozwala to na poważne uproszczenie procesu poznawania nowej powłoki i nowego języka. Wspólne parametry zostały zebrane w tabeli 1-1. Należy jednak pamiętać, że nie wszystkie z tych parametrów są obsługiwane przez wszystkie programy narzędziowe typu cmdlet. Jeśli jednak dany parametr jest używany, to będzie on interpretowany w taki sam sposób przez wszystkie polecenia typu cmdlet, ponieważ ich interpretacją zajmuje się motor programu Windows PowerShell. Tabela 1-1 Parametr -whatif -confirm -verbose -debug -erroraction -errorvariable -outvariable Parametry wspólne Znaczenie Instruuje cmdlet, aby nie wykonywać danej akcji. Zamiast tego cmdlet informuje, co by się stało, gdyby faktycznie został on uruchomiony. Instruuje cmdlet, aby przed wykonaniem polecenia wyświetlić monit z prośbą o potwierdzenie. Instruuje cmdlet, aby wyświetlał więcej szczegółowych informacji o swoim działaniu, niż bez tego parametru. Instruuje cmdlet, aby wyświetlił informacje pomocne przy debugowaniu. Instruuje cmdlet, aby w razie wystąpienia błędu wykonał określoną akcję. Dopuszczalne akcje to: continue (kontynuuj), stop (zatrzymaj), SilentlyContinue (Kontynuuj po cichu) oraz inquire (zapytaj). Instruuje cmdlet, aby do przechowywania informacji o błędach używać wskazanej zmiennej. Zmienna ta stanowić będzie uzupełnienie dla standardowej zmiennej $error. Instruuje cmdlet, aby informacje ze strumienia wyjściowego umieszczane były we wskazanej zmiennej.
Rozdział 1: Powłoka programu Windows PowerShell 15 Tabela 1-1 Parametr -outbuffer Parametry wspólne Znaczenie Instruuje cmdlet, aby przed wywołaniem następnego polecenia typu cmdlet w potoku zgromadzić określoną ilość obiektów. Korzystanie z polecenia Get-Help (Pobierz pomoc) Korzystanie z programu Windows PowerShell jest łatwe i intuicyjne nauka może odbywać się po prostu poprzez korzystanie z tego programu. Bezpośredni dostęp do systemu pomocy jeszcze bardziej ułatwia korzystanie z programu. Z systemu pomocy programu Windows PowerShell można korzystać na kilka różnych sposobów. Chcąc uzyskać informacje na temat korzystania z programu Windows PowerShell należy użyć programu narzędziowego typu cmdlet o nazwie Get-Help (Uzyskaj pomoc), tak jak to zostało pokazane poniżej: get-help get-help Powyższe polecenie powoduje wypisanie tekstu pomocy dotyczącego polecenia cmdlet Get-Help (Uzyskaj pomoc). Informacje zwrócone przez ten cmdlet zostały pokazane poniżej: NAME Get-Help SYNOPSIS Displays information about Windows PowerShell cmdlets and concepts. SYNTAX Get-Help [[-name] <string>] [-component <string[]>] [-functionality <string []>] [-role <string[]>] [-category <string[]>] [-full] [<CommonParameters>] Get-Help [[-name] <string>] [-component <string[]>] [-functionality <string []>] [-role <string[]>] [-category <string[]>] [-detailed] [<CommonParamete rs>] Get-Help [[-name] <string>] [-component <string[]>] [-functionality <string []>] [-role <string[]>] [-category <string[]>] [-examples] [<CommonParamete rs>] Get-Help [[-name] <string>] [-component <string[]>] [-functionality <string []>] [-role <string[]>] [-category <string[]>] [-parameter <string>] [<Comm onparameters>] DETAILED DESCRIPTION The Get-Help cmdlet displays information about Windows PowerShell cmdlets and concepts. You can also use "Help {<cmdlet name> <topic-name>" or "<cmd let-name> /?". "Help" displays the help topics one page at a time. The "/?" displays help for cmdlets on a single page. RELATED LINKS Get-Command
16 Windows PowerShell przewodnik po skryptach Get-PSDrive Get-Member REMARKS For more information, type: "get-help Get-Help -detailed". For technical information, type: "get-help Get-Help -full". PS C:\users\edwils> get-help get-help NAZWA Get-Help STRESZCZENIE Wyświetla informacje o cmdletach i koncepcjach powłoki Windows PowerShell. SKŁADNIA Get-Help [[-name] <string>] [-component <string[]>] [-functionality <string[]>] [-role <string[]>] [-category <string[]>] [-full] [<CommonParameters>] Get-Help [[-name] <string>] [-component <string[]>] [-functionality <string[]>] [-role <string[]>] [-category <string[]>] [-detailed] [<CommonParameters>] Get-Help [[-name] <string>] [-component <string[]>] [-functionality <string[]>] [-role <string[]>] [-category <string[]>] [-examples] [<CommonParameters>] Get-Help [[-name] <string>] [-component <string[]>] [-functionality <string[]>] [-role <string[]>] [-category <string[]>] [-parameter <string>] [<CommonParameters>] SZCZEGÓŁOWY OPIS Cmdlet Get-Help wyświetla informacje o cmdletach i koncepcjach powłoki Windows PowerShell. Można również użyć polecenia "Help {<nazwa cmdletu> <nazwa-tematu>" lub "<nazwa-cmdletu /?". Polecenie "Help" wyświetla tematy pomocy po jednej stronie na raz. Symbol "/?" wyświetla pomoc dla cmdletów na jednej stronie. ŁĄCZA POKREWNE Get-Command Get-PSDrive Get-Member UWAGI Aby uzyskać więcej informacji, wpisz polecenie: "get-help Get-Help -detailed". Aby uzyskać informacje techniczne, wpisz polecenie: "get-help Get-Help -full". Wyjątkową właściwością systemu bezpośredniej pomocy programu Windows PowerShell jest fakt, że system ten nie tylko potrafi wyświetlać informacje pomocy dotyczące różnych poleceń, ale także to, że oferuje trzy różne poziomy wyświetlania tych informacji: normal (normalny), detailed (szczegółowy) oraz full (pełen). Ponadto możliwe jest uzyskanie pomocy na temat koncepcji i pojęć stosowanych przez program Windows PowerShell. Ta ostatnia możliwość jest równoważna posiadaniu instrukcji obsługi dostępnej w trybie online. W celu uzyskania listy wszystkich artykułów pomocy dotyczących różnych pojęć należy użyć polecenia Get-Help about*, tak jak to pokazano poniżej: get-help about*
Rozdział 1: Powłoka programu Windows PowerShell 17 Przypuśćmy, że nie pamiętamy dokładnej nazwy polecenia typu cmdlet, z którego zamierzaliśmy skorzystać, ale pamiętamy, że był to cmdlet o nazwie zaczynającej się na get. Pełną nazwę tego polecenia można uzyskać posługując się znakami uogólniającymi (takim jak *). Np.: get-help get* Tę technikę wykorzystywania operatów uogólniających można rozszerzyć jeszcze dalej. Jeśli pamiętamy, że potrzebny cmdlet był narzędziem z grupy get, którego nazwa rozpoczynała się na literę p, to nazwę tego narzędzia można uzyskać przy pomocy następującego polecenia: get-help get-p* Przypuśćmy jednak, że znamy dokładną nazwę polecenia typu cmdlet, ale nie pamiętamy szczegółów jego składni. W takiej sytuacji można skorzystać z argumentu -examples (przykłady). W celu uzyskania kliku przykładów użycia polecenia cmdlet Get-PSDrive można skorzystać z polecenia Get-Help (Pobierz pomoc) z argumentem -examples, tak jak to zostało pokazane poniżej: get-help get-psdrive -examples Jeśli chcemy, aby tekst pomocy wyświetlany był kolejno, po jednej stronie, to można użyć funkcji pomocy wyświetlającej tekst pomocy poprzez funkcję more. Jest to bardzo przydatna możliwość, jeśli chce się uniknąć ciągłego przewijania tekstu pomocy w górę i w dół. Przykład takiego polecenia pokazany został poniżej: get-help get-help more Strumień wyjściowy tego polecenia, sformatowany za po mocą funkcji more, pokazany został na rysunku 1-3. W celu uzyskania szczegółowej pomocy na temat plecenia cmdlet Get-Help (Pobierz pomoc) należy użyć argumentu -detailed, tak jak to pokazano poniżej: get-help get-help -detailed Jeśli potrzebować będziemy technicznych informacji na temat polecenia cmdlet Get-Help (Pobierz pomoc), to należy użyć argumentu -full. Odpowiedni przykład znajduje się poniżej: get-help get-help -full Ciągłe wpisywanie nazwy Get-Help może być męczące. W końcu jest to aż 8 znaków, w tym jeden myślnik. Rozwiązaniem może być utworzenie dla polecenia Get-Help tzw. aliasu. Alias to skrócona kombinacja znaków, której wpisanie spowoduje uruchomienie żądanego programu lub polecenia typu cmdlet. Tworząc alias dla polecenia Get-Help można np. przypisać ten cmdlet do kombinacji liter gh.
18 Windows PowerShell przewodnik po skryptach Rysunek 1-3 Stosowanie funkcji more umożliwia wyświetlanie długich tematów kolejno, po jednej stronie. Wskazówka Przed utworzeniem nowego aliasu dla polecenia typu cmdlet należy sprawdzić za pomocą polecenia Get-Alias (Pobierz alias), czy nie istnieje już inny alias o takiej samej nazwie. Następnie korzystając z polecenia cmdlet Set-Alias (Ustaw alias) można przypisać wybrany cmdlet do unikalnej kombinacji znaków. Praca z aliasami i przypisywanie skróconych nazw poleceniom typu cmdlet Aliasy umożliwiają przypisywanie skróconych nazw do programów narzędziowych typu cmdlet. Pozwala to na poważne uproszczenie korzystania z wiersza poleceń programu Windows PowerShell i umożliwia dostosowanie składni poleceń do własnych preferencji. Jako przykład załóżmy, że chcemy utworzyć alias dla polecenia cmdlet Get-Help (Pobierz pomoc). Prawdopodobnie większość osób wolałaby wpisywać litery gh, zamiast całego słowa Get-Help. Aby uniknąć nieporozumień, najpierw należy sprawdzić, czy żądanej kombinacji znaków nie został już przypisany inny alias. Kolejna rzecz, którą warto zrobić, to zapoznanie się z tekstem pomocy dla polecenia Set-Alias (Ustaw alias). Po wykonaniu tych czynności należy wywołać cmdlet Set-Allias przekazując mu nową nazwę dla tworzonego aliasu oraz nazwę polecenia typu cmdlet, którego dotyczyć ma ten alias. Po utworzeniu aliasu można sprawdzić jego poprawność, korzystając z polecenia Get-Alias (Pobierz alias). Pełny kod przykładów z tej części znajduje się na towarzyszącej tej książce płycie CD-ROM, w pliku GhAlias.txt z katalogu chapter01.
Rozdział 1: Powłoka programu Windows PowerShell 19 1. Pobierz alfabetyczną listę wszystkich aktualnie zdefiniowanych aliasów i sprawdź, czy widnieje na niej alias przypisany do polecenia cmdlet Get-Help lub do kombinacji znaków gh. Polecenie pozwalające na wykonanie tego zadania zostało pokazanie poniżej: get-alias sort 2. Po sprawdzeniu, że nie istnieje żaden alias dla polecenia cmdlet Get-Help oraz że żaden alias nie został przypisany do kombinacji liter gh, zapoznaj się ze składnią polecenia Set-Alias (Ustaw alias). Użyj do tego celu polecenia Get-Help z argumentem -full. Odpowiednie polecenie zostało pokazane poniżej: get-help set-alias -full 3. Używając polecenia cmdlet Set-Alias (Ustaw alias) przypisz kombinację liter gh do polecenia Get-Help. W tym celu należy wykonać następujące polecenie: set-alias gh get-help 4. Używając polecenia cmdlet Get-Alias (Pobierz alias) sprawdź poprawność utworzenia aliasu. W celu celu należy wykonać następujące polecenie: Get-Alias gh Wskazówka Jeśli składnia polecenia cmdlet Set-Alias jest dla kogoś nieco dezorientująca, to zamiast stosowanego domyślnie pozycyjnego wiązania parametrów można posługiwać się parametrami nazwanymi. Ponadto zalecane jest użycie przełącznika whatif albo confirm. Możliwe jest także podanie opisu dla tworzonego aliasu. Zmodyfikowana składnia dla tego polecenia wyglądać będzie w następujący sposób: Set-Alias -Name gh -Value Get-Help -Description "mred help alias" -WhatIf Jak zatem widać, program Windows PowerShell może być używany jako zamiennik interpretera poleceń CMD. Zawiera on także dużą liczbę wbudowanych programów narzędziowych typu cmdlet, które umożliwiają wykonywanie mnóstwa różnych działań. Te polecenia typu cmdlet mogą być używane albo jako narzędzia autonomiczne, albo można je uruchamiać razem jako jedną grupę. Dodatkowe zastosowania poleceń typu cmdlet Po zaznajomieniu się ze sposobem korzystania z polecenia cmdlet oferującego dostęp do systemu pomocy oraz sposobu korzystania z aliasów, nadeszła pora na zapoznanie się z innymi sposobami wykorzystywania narzędzi typu cmdlet, oferowanych przez program Windows PowerShell. Wskazówka Aby przyspieszyć wpisywanie nazw poleceń typu cmdlet, wystarczy wpisać tylko tyle znaków, ile potrzeba do jednoznacznego rozróżnienia danego polecenia, a następnie wcisnąć klawisz Tab. Jaki będzie tego rezultat? Wciśnięcie klawisza Tab spowoduje uzupełnienie nazwy polecenia typu cmdlet. Taka technika działa również w przypadku nazw argumentów oraz innych procedur. Warto nieco poeksperymentować z tą doskonałą oszczędzającą czas techniką. Dzięki niej już nigdy nie trzeba będzie wpisywać np. get-command!
20 Windows PowerShell przewodnik po skryptach Uruchamianie programu Windows PowerShell Po zainstalowaniu programu Windows PowerShell jest on natychmiast gotowy do użytku. Jednak konieczność jednoczesnego naciskania klawisza R oraz klawisza z logo systemu Windows lub posługiwania się myszą w celu otwarcia za pomocą menu Start okna dialogowego Uruchom i wpisywania w tym oknie za każdym razem PowerShell z pewnością jest dość uciążliwe. Z tego względu utworzyłem skrót do programu Windows PowerShell i umieściłem go na pulpicie. Biorąc pod uwagę sposób, w jaki pracuję, jest to dla mnie idealne rozwiązanie. W rzeczywistości jest to na tyle użyteczne, że napisałem skrypt wykonujący tę operację. W celu automatycznego utworzenia odpowiedniego skrótu na pulpicie skrypt ten można uruchomić za pośrednictwem skryptu logowania. Skrypt ten nosi nazwę CreateShortCutToPowerShell.vbs: CreateShortCutToPowerShell.vbs Option Explicit Dim objshell Dim strdesktop Dim objshortcut Dim strprog strprog = "powershell.exe" Set objshell=createobject("wscript.shell") strdesktop = objshell.specialfolders("desktop") set objshortcut = objshell.createshortcut(strdesktop & "\powershell.lnk") objshortcut.targetpath = strprog objshortcut.windowstyle = 1 objshortcut.description = funfix(strprog) objshortcut.workingdirectory = "C:\" objshortcut.iconlocation= strprog objshortcut.hotkey = "CTRL+SHIFT+P" objshortcut.save Function funfix(strin) funfix = InStrRev(strin,".") funfix = Mid(strin,1,funfix) End function Ponieważ polecenia typu cmdlet zwracają obiekty, a nie wartości tekstowe, możliwe jest uzyskanie dodatkowych informacji o zwróconych obiektach. Te dodatkowe informacje nie byłyby dostępne w przypadku korzystania wyłącznie z danych tekstowych. W celu uzyskania dodatkowych informacji należy użyć symbol potoku ( ), a następnie pobrać informacje z jednego polecenia typu cmdlet i przekazać je do drugiego. Może wydawać się, że jest to skomplikowane, ale w rzeczywistości jest bardzo proste. Pod koniec tego rozdziału taka procedura powinna wydawać się już całkiem naturalna. Rozpatrzmy najbardziej podstawowy przykład: uzyskiwanie i formatowanie listy zawartości katalogu. Po uzyskaniu listy zawartości katalogu może pojawić się potrzeba sformatowania sposobu wyświetlania tej listy, np. jako tabeli abo jako zwykłej listy. Jak zatem widać, mamy tu do czynienia z dwiema osobnymi operacjami: pobieraniem listy zawartości
Rozdział 1: Powłoka programu Windows PowerShell 21 katalogu oraz formatowaniem tej listy. Zadanie formatowania realizowane jest po prawej stronie symbolu potoku, po zgromadzeniu listy zawartości katalogu. Jest to zwykły sposób działania potoków. Przyjrzymy się im teraz w działaniu, na przykładzie polecenia cmdlet Get-ChildItem (Pobierz element potomny). Korzystanie z polecenia Get-ChildItem We wcześniej części tego rozdziału, do pobrania listy wszystkich plików z katalogu bieżącego używane było polecenie dir. Było to możliwe, ponieważ program Windows PowerShell posiada wbudowany alias przypisujący cmdlet Get-Childltem (Pobierz element potomny) do kombinacji liter dir. Można to sprawdzić posługując się poleceniem cmdlet Get-Alias (Pobierz alias), co zostało pokazne w przykładzie z pliku GetDirAlias.txt. GetDirAlias.txt PS C:\> Get-Alias dir CommandType Name Definition ----------- ---- ---------- Alias dir Get-ChildItem W rzeczywistości program Windows PowerShell nie zawiera polecenia typu cmdlet o nazwie dir ani nie korzysta z polecenia dir. Alias dir został po prostu skojarzony z poleceniem cmdlet Get-Childltem (Pobierz element potomny). To dlatego wynik polecenia dir jest inny w oknie programu Windows PowerShell niż w oknie interpretera poleceń Cmd.exe. O tym, że polecenie dir jest w istocie aliasem, można się przekonać po rozszyfrowaniu skojarzenia za pomocą polecenia Get-Alias. Wskazówka Jeśli korzystając z polecenia Get-Childltem chcemy, aby lista zawartości katalogu zawierała również ukryte oraz systemowe pliki i foldery, to należy użyć przełącznika force (Wymuś). Całe polecenie będzie wówczas wyglądać następująco: Get-ChildItem -Force. Formatowanie wyjścia Program Windows PowerShell zawiera cztery polecenia formatujące typu cmdlet. Trzy spośród nich, Format-List (Format listy), Format-Wide (Forma szeroki) oraz Format-Table (Format tabeli), są używane rutynowo. Czwarty cmdlet, Format-Custom (Format niestandardowy), może wyświetlać dane wyjściowe w sposób niebędący ani listą, ani tabelą, ani formatem szerokim. Cmdlet ten realizuje to wykorzystując plik *.format.ps1xml. Możliwe jest wykorzystywanie domyślnych widoków zawartych w plikach *.format.ps1xml albo zdefiniowanie własnych plików typu format.ps1xml. Przyjrzyjmy się zatem formatowaniu strumienia wyjściowego przy użyciu pozostałych trzech poleceń formatujących, zaczynając od najbardziej użytecznego z tej trójki: Format-List.
22 Windows PowerShell przewodnik po skryptach Format-List Cmdlet Format-List jest jednym z podstawowych poleceń typu cmdlet, które będzie bardzo często używane przez każdego administratora. Np. używając polecenia Get-WmiObject (Pobierz obiekt WMI) do odczytania właściwości klasy Win32_LogicalDisk otrzymamy jedynie minimalną listę domyślnych właściwości tej klasy. Odpowiedni przykład przedstawiony został poniżej: PS C:\> Get-WmiObject Win32_LogicalDisk DeviceID : C: DriveType : 3 ProviderName : FreeSpace : 10559041536 Size : 78452355072 VolumeName : Sea Drive Wprawdzie w wielu przypadkach takie działanie jest odpowiednie, ale czasami możemy być zainteresowani również innymi właściwościami tej klasy. Pierwszą rzeczą, którą należy wykonać podczas sprawdzania dostępności innych właściwości, jest użycie znaku uogólniającego *. Spowoduje to wyświetlenie listy wszystkich właściwości, tak jak to zostało pokazane poniżej: PS C:\> Get-WmiObject Win32_LogicalDisk Format-List * Status : Availability : DeviceID : C: StatusInfo : GENUS : 2 CLASS : Win32_LogicalDisk SUPERCLASS : CIM_LogicalDisk DYNASTY : CIM_ManagedSystemElement RELPATH : Win32_LogicalDisk.DeviceID="C:" PROPERTY_COUNT : 40 DERIVATION : {CIM_LogicalDisk, CIM_StorageExtent, CIM_LogicalDevice, CIM_LogicalElement...} SERVER : M5-1875135 NAMESPACE : root\cimv2 PATH : \\M5-1875135\root\cimv2:Win32_LogicalDisk. DeviceID="C:" Access : 0 BlockSize : Caption : C: Compressed : False ConfigManagerErrorCode : ConfigManagerUserConfig : CreationClassName : Win32_LogicalDisk Description : Local Fixed Disk DriveType : 3 ErrorCleared : ErrorDescription : ErrorMethodology : FileSystem : NTFS FreeSpace : 10559041536
Rozdział 1: Powłoka programu Windows PowerShell 23 InstallDate : LastErrorCode : MaximumComponentLength : 255 MediaType : 12 Name : C: NumberOfBlocks : PNPDeviceID : PowerManagementCapabilities : PowerManagementSupported : ProviderName : Purpose : QuotasDisabled : QuotasIncomplete : QuotasRebuilding : Size : 78452355072 SupportsDiskQuotas : False SupportsFileBasedCompression : True SystemCreationClassName : Win32_ComputerSystem SystemName : M5-1875135 VolumeDirty : VolumeName : Sea Drive VolumeSerialNumber : F0FE15F7 Po zapoznaniu się z listą wszystkich właściwości dostępnych dla danej klasy można następnie wybrać tylko te z nich, które są dla nas interesujące. Znak uogólniający * należy zastąpić nazwami właściwości wybranych z poprzedniej listy. Ta technika została zilustrowana poniżej: PS C:\> Get-WmiObject Win32_LogicalDisk Format-List Name, FileSystem, FreeSpace Name : C: FileSystem : NTFS FreeSpace : 10559029248 Zamiast wpisywać długą listę nazw właściwości, korzystając ze znaków uogólniających można określić żądany przedział właściwości. Np. aby wyświetlić tylko te właściwości, których nazwy zaczynają się na literę f, można posłużyć się pokazaną poniżej techniką: PS C:\> Get-WmiObject Win32_LogicalDisk Format-List f* FileSystem : NTFS FreeSpace : 10558660608 Jeśli interesują nas właściwości o nazwach zaczynających się na literę n lub na literę f, to należy posłużyć się nawiasami kwadratowymi, tak jak to pokazano poniżej: PS C:\> Get-WmiObject Win32_LogicalDisk Format-List [nf]* FileSystem : NTFS FreeSpace : 10558238720 Name : C: NumberOfBlocks :
24 Windows PowerShell przewodnik po skryptach Wszystkie te polecenia wraz z kompletnymi wynikami ich działania można znaleźć w pliku Format-List.txt, znajdującym się na towarzyszącej tej książce płycie CD-ROM, w katalogu chapter01. Format-Table Cmdlet Format-Table oferuje kilka funkcji sprawiających, że narzędzie to szczególnie dobrze nadaje się do realizacji zadań związanych z zarządzaniem siecią. W szczególności potrafi ono tworzyć kolumny danych, w sposób umożliwiający ich szybkie przeglądanie. Podobnie jak w przypadku poleceń Format-List i Format-Wide, istnieje możliwość wyboru właściwości, które mają być wyświetlane, i eliminowania w ten sposób rozpraszających uwagę danych pochodzących ze zbyt rozwlekłych strumieni wyjściowych niektórych poleceń typu cmdlet. W pokazanym poniżej przykładzie najpierw przeszukiwany jest cały dysk twardy w poszukiwaniu wszystkich plików dzienników (tj. plików z rozszerzeniem.log). Pełen strumień wyjściowy tego polecenia jest dość znacznych rozmiarów i poniżej pokazany został tylko jego przykładowy wycinek. W pokazanym poniżej przykładzie cmdlet Format-Table został użyty do uformowania danych wyjściowych polecenia Get-Childltem: PS C:\> Get-ChildItem c:\ -Recurse -Include *.log Format-Table Directory: Microsoft.PowerShell.Core\FileSystem::C:\Backup_Extras_92705 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 8/3/2004 6:34 PM 3931872 setupapi.log -a--- 8/2/2004 9:32 PM 206168 Windows Update.log -a--- 6/8/2004 12:41 AM 170095 wmsetup.log Oprócz polegania na domyślnym sposobie działania tego polecenia typu cmdlet, możliwe jest wybieranie konkretnych właściwości. Jednym z problemów ujawniających się przy takim podejściu jest fakt, że do formatowania danych wyjściowych używana jest dostępna rozdzielczość ekranu, co często może prowadzić do pokazanej poniżej sytuacji, w której część kolumn wypada po przeciwnej stronie okna. Taki format może być akceptowalny dla szybkiego wyświetlania mocno zróżnicowanych kolumn, ale nie nadaje się do zapisywania danych. PS C:\> Get-ChildItem c:\ -Recurse -Include *.log Format-Table -Property name, length, lastwritetime Name Length LastWriteTime ---- ------ ------------- setupapi.log 3931872 8/3/2004 6:34:53 PM Windows Update.log 206168 8/2/2004 9:32:06 PM wmsetup.log 170095 6/8/2004 12:41:32 AM Debug.log 0 8/23/2006 8:10:38 PM
Rozdział 1: Powłoka programu Windows PowerShell 25 AVCheck.Log 191694 5/8/2007 9:28:05 AM AVCheckServer.Log 7762 5/8/2007 9:28:05 AM W celu utworzenia listy, wykorzystującej dostępny rozmiar okna w bardziej efektywny sposób, można zastosować przełącznik autosize. Korzystając z przełącznika autosize należy tylko pamiętać o jednej rzeczy: użycie tego przełącznika wymaga, aby znana była długość najdłuższego elementu w każdej kolumnie. Oznacza to, że cmdlet musi zaczekać na zakończenie enumeracji wszystkich elementów, a następnie wyznaczyć maksymalną długość każdej kolumny oraz rozmiar całej listy. Może to powodować zablokowanie wykonywania polecenia do czasu dostarczenia wszystkich elementów, co może zająć nieco czasu. Administrator może jednak nie mieć czasu, aby po użyciu przełącznika autosize czekać na zakończenie enumeracji dużej kolekcji obiektów, np. gdy pracuje nad problemem powodującym przestój serwera. Dla małych zbiorów obiektów negatywny wpływ na wydajność jest pomijalny, jednak w przypadku poleceń, których wykonanie zajmuje dużo czasu, takich jak pokazane w tym przykładzie, różnica może być istotna. Jednak uzyskiwana tym kosztem różnica w strumieniu wyjściowym jest również istotna (i większość administratorów prawdopodobnie zgodzi się, że warto dłużej zaczekać na bardziej czytelne wyniki). PS C:\> Get-ChildItem c:\ -Recurse -Include *.log Format-Table -Property name, length, lastwritetime -AutoSize Name Length LastWriteTime ---- ------ ------------- setupapi.log 3931872 8/3/2004 6:34:53 PM Windows Update.log 206168 8/2/2004 9:32:06 PM wmsetup.log 170095 6/8/2004 12:41:32 AM Debug.log 0 8/23/2006 8:10:38 PM AVCheck.Log 191694 5/8/2007 9:28:05 AM Ostatnią rzeczą, na którą warto zwrócić uwagę w przypadku polecenia Format-Table, jest połączenie go z poleceniem Sort-Object (Sortowanie obiektów). Cmdlet Sort-Object umożliwia porządkowanie danych według ich właściwości i ich wyświetlanie w posortowany sposób. W pokazanym poniżej przykładzie użyty został alias polecenia Sort-Object (sort), co pozwala na zredukowanie ilości potrzebnych do wpisania znaków. Pomimo tego, całe polecenie jest nadal dość długie i dla poprawy jego czytelności zostało umieszczone w dwóch liniach (nawiasem mówiąc, jeśli polecenie staje się na tyle długie, to zwykle przekształcam je w skrypt). Analizując przedstawione poniżej polecenie należy zwrócić uwagę, że dane są sortowane przed przekazaniem ich do polecenia Format-Table. Należy również pamiętać, że domyślnym porządkiem sortowania dla polecenia Sort-Object jest porządek rosnący (od najmniejszego do największego). Jeśli istnieje taka potrzeba, można użyć przełącznika -descending, aby uzyskać dane wyjściowe uporządkowane w kolejności od największego do najmniejszego. PS C:\>Get-ChildItem c:\ -Recurse -Include *.log Sort -Property length Format-Table name, lastwritetime, length -AutoSize Name LastWriteTime Length ---- ------------- ------ PASSWD.LOG 5/10/2007 2:44:58 AM 0 sam.log 11/29/2006 1:14:33 PM 0
26 Windows PowerShell przewodnik po skryptach poqexec.log 2/1/2007 6:50:49 PM 0 ChkAcc.log 5/10/2007 2:45:00 AM 0 Debug.log 8/23/2006 8:10:38 PM 0 setuperr.log 3/16/2007 7:18:17 AM 0 setuperr.log 4/4/2007 6:34:54 PM 0 netlogon.log 2/1/2007 7:04:44 PM 3 Istnieją również inne sposoby sortowania danych. Listę plików dzienników można np. posortować w kolejności mającej, według daty ich modyfikacji. W ten sposób na początku listy znajdą się ostatnio zmodyfikowane pliki dzienników. Wykonanie takiej procedury wymaga zmodyfikowania obiektu sortującego. Pozostała część polecenia pozostaje bez zmian. Część wyników tego polecenia została pokazana poniżej. Warto w tym miejscu zwrócić uwagę na fakt, że większość ze znalezionych plików dzienników została zmodyfikowana podczas procesu logowania się w systemie. PS C:\> Get-ChildItem c:\ -Recurse -Include *.log Sort -Property lastwritetime -descending Format-Table name, lastwritetime, length -AutoSize Name LastWriteTime Length ---- ------------- ------ mtrmgr.log 5/10/2007 4:56:52 AM 1538364 LocationServices.log 5/10/2007 4:56:26 AM 830557 StateMessage.log 5/10/2007 4:55:00 AM 129595 Scheduler.log 5/10/2007 4:55:00 AM 393352 StatusAgent.log 5/10/2007 4:53:24 AM 723564 edb.log 5/10/2007 4:51:49 AM 131072 PolicyEvaluator.log 5/10/2007 4:51:25 AM 1672613 ClientLocation.log 5/10/2007 4:51:24 AM 330046 FSPStateMessage.log 5/10/2007 4:51:18 AM 228879 CBS.log 5/10/2007 4:46:55 AM 28940091 CertificateMaintenance.log 5/10/2007 4:42:17 AM 206472 CcmExec.log 5/10/2007 4:00:51 AM 537177 wmiprov.log 5/10/2007 3:03:11 AM 19503 PolicyAgentProvider.log 5/10/2007 2:54:02 AM 252866 UpdatesHandler.log 5/10/2007 2:53:19 AM 108552 CIAgent.log 5/10/2007 2:53:19 AM 99114 ScanAgent.log 5/10/2007 2:53:18 AM 354939 UpdatesDeployment.log 5/10/2007 2:53:18 AM 1106297 SrcUpdateMgr.log 5/10/2007 2:53:02 AM 151452 smssha.log 5/10/2007 2:52:02 AM 107104 execmgr.log 5/10/2007 2:52:02 AM 150942 InventoryAgent.log 5/10/2007 2:52:02 AM 34034 ServiceWindowManager.log 5/10/2007 2:52:02 AM 139955 SdmAgent.log 5/10/2007 2:49:46 AM 172101 UpdatesStore.log 5/10/2007 2:49:43 AM 64787 WUAHandler.log 5/10/2007 2:49:39 AM 14590 CAS.log 5/10/2007 2:49:35 AM 198955 PeerDPAgent.log 5/10/2007 2:49:35 AM 7900 PolicyAgent.log 5/10/2007 2:49:35 AM 246873 RebootCoordinator.log 5/10/2007 2:49:35 AM 20420 InternetProxy.log 5/10/2007 2:49:34 AM 85825 ClientIDManagerStartup.log 5/10/2007 2:49:34 AM 158351 WindowsUpdate.log 5/10/2007 2:46:46 AM 1553462 edb.log 5/10/2007 2:46:43 AM 65536 setupapi.dev.log 5/10/2007 2:46:38 AM 6469237
Rozdział 1: Powłoka programu Windows PowerShell 27 setupapi.app.log 5/10/2007 2:46:38 AM 2722285 WMITracing.log 5/10/2007 2:45:57 AM 16777216 ChkAcc.log 5/10/2007 2:45:00 AM 0 PASSWD.LOG 5/10/2007 2:44:58 AM 0 Przeglądając plik Format-Table.txt z katalogu chapter01 można zauważyć, że plik ten zawiera wiele błędów. Wynika to z faktu, że przeszukując dysk cmdlet Get-ChildItem próbował otwierać również chronione pliki i katalogi powodując generowanie komunikatów o odmowie dostępu. W fazie tworzenia skryptu błędy te mogą być bardzo pomocne, ponieważ dzięki nim wiadomo, że pewne pliki i foldery są niedostępne, jednak po przeanalizowaniu danych ich użyteczność staje się problematyczna. Poniżej pokazany został przykład jednego z takich błędów: Get-ChildItem : Access to the path 'C:\Windows\CSC' is denied. At line:1 char:14 Get-ChildItem : Odmowa dostępu do ścieżki 'C:\Windows\CSC'. Plik: wiersz; wiersz: 1; znak: 14 Przydatność komunikatu błędu polega na wskazaniu w nim nazwy polecenia typu cmdlet, które spowodowało wystąpienie błędu oraz akcji, która doprowadziła do tego błędu. Tego typu błędy można wyeliminować dodając do polecenia Get-ChildItem wspólny parametr -ErrorAction ze słowem kluczowym SilentlyContinue. Zmodyfikowana linia z tym poleceniem została pokazana poniżej: PS C:\> Get-ChildItem c:\ -Recurse -Include *.log -erroraction SilentlyContinue Sort -Property lastwritetime -descending Format-Table name, lastwritetime, length -AutoSize Format-Wide Cmdlet Format-Wide nie jest już tak użyteczny jak polecenia Format-Table lub Format-List. Wynika to z ograniczenia pozwalającego na wyświetlanie tylko jednej właściwości każdego obiektu. Możliwość tworzenia tego typu list może być jednak przydatna. Przypuśćmy np., że chcemy uzyskać tylko listę działających na komputerze procesów. Można do tego celu wykorzystać cmdlet Get-Process (Pobierz proces) i skierować potokiem otrzymane obiekty wynikowe do polecenia cmdlet Format-Wide, tak jak to zostało pokazane poniżej: PS C:\> Get-Process Format-Wide ApMsgFwd Apoint casha csrss dwm FwcAgent InoRpc InoTask lsm MSASCui powershell rundll32 SearchIndexer ApntEx audiodg CcmExec csrss explorer Idle InoRT lsass mobsync powershell PowerShellIDE SearchFilterHost SearchProtocolHost
28 Windows PowerShell przewodnik po skryptach services smss SRUserService svchost svchost svchost svchost svchost svchost svchost System taskeng ThpSrv wininit WINWORD WmiPrvSE SLsvc spoolsv svchost svchost svchost svchost svchost svchost svchost svchost taskeng ThpSrv TODDSrv winlogon wmdc WmiPrvSE Wyniki wypisane przez to polecenie, choć użyteczne, zajmują jednak mnóstwo linii na konsoli, marnując przy tym sporą część ekranu. Lepszy rezultat można otrzymać używając parametru -column. Przykład ilustrujący użycie tego parametru został pokazany poniżej: PS C:\> Get-Process Format-Wide -Column 4 Wprawdzie zastosowanie 4 kolumn wyjściowych skraca długość całej listy o połowę, ale nadal nie prowadzi do maksymalnego wykorzystania całej dostępnej powierzchni ekranu. Choć możliwe jest napisanie skryptu wyznaczającego optymalną wartość parametru -column, takiego jak zamieszczony poniżej skrypt DemoFormatWide.ps1, to jednak takie przedsięwzięcie nie jest warte czasu oraz wysiłku niezbędnego do jego realizacji. DemoFormatWide.ps1 function fungetprocess() { if ($args) { Get-Process Format-Wide -autosize } else { Get-Process Format-Wide -column $i } } cls $i = 1 for ($i ; $i -le 10 ; $i++) { Write-Host -ForegroundColor red "`$i jest równe $i" fungetprocess } Write-Host -ForeGroundColor red "Teraz użyte zostało polecenie format-wide z parametrem -autosize" fungetprocess("auto")
Rozdział 1: Powłoka programu Windows PowerShell 29 Lepszym sposobem znalezienia optymalnej konfiguracji ekranu dla polecenia cmdlet Format-Wide będzie użycie przełącznika -autosize, tak jak to pokazano poniżej: PS C:\> Get-Process Format-Wide -AutoSize Stosowanie polecenia cmdlet Get-Command Istnieją trzy polecenia typu cmdlet, które można porównać do trzech podstawowych przypraw używanych w kuchni Cajun. Potrawy kuchni Cajun można przygotowywać w dowolny sposób, o ile tylko pamięta się o soli, pieprzu i papryce. Chcesz przygotować zieloną fasolkę a la Cajun? Dodaj trochę soli, pieprzu i papryki. Chcesz pracować z programem Windows PowerShell? A więc pamiętaj o trzech poleceniach cmdlet typu Cajun : Get-Help (Pobierz pomoc), Get-Command (Pobierz polecenie) oraz Get-Member (Pobierz element członkowski). Opierając się na tych trzech poleceniach można w pełni opanować posługiwanie się programem Windows PowerShell. Ponieważ cmdlet Get-Help został już omówiony wcześniej, zajmiemy się teraz omówieniem polecenia Get-Command. Najprostszym zastosowaniem polecenia Get-Command jest utworzenie listy poleceń dostępnych z poziomu programu Windows PowerShell. Jest to przydatna możliwość, jeśli chcemy szybko sprawdzić, jakie polecenia cmdlet są aktualnie dostępne. To elementarne zastosowanie polecenia Get-Command zostało pokazane poniżej. Warto w tym miejscu zwrócić uwagę na fakt, że definicja poleceń ma formę skróconą. PS C:\> Get-Command CommandType Name Definition ----------- ---- ---------- Cmdlet Add-Content Add-Content [-Path] <String[]> [-Value] <Object[... Cmdlet Add-History Add-History [[-InputObject] <PSObject[]>] [-Pass... Cmdlet Add-Member Add-Member [-MemberType] <PSMemberTypes> [-Name]... Cmdlet Add-PSSnapin Add-PSSnapin [-Name] <String[]> [-PassThru] [-Ve... Cmdlet Clear-Content Clear-Content [-Path] <String[]> [-Filter <Strin... Cmdlet Clear-Item Clear-Item [-Path] <String[]> [-Force] [-Filter... Domyślnie polecenie Get-Command zwraca listę tylko poleceń typu cmdlet i dlatego pole CommandType (Typ polecenia) nie wnosi żadnej nowej informacji. Ładniejszy format tej listy można uzyskać tworząc potok kierujący wyniki do polecenia Format-List i pozostawiając jedynie pola z nazwą oraz z definicją. Działanie takie zostało pokazane poniżej. Jak widać na tym przykładzie, taka forma prezentacji wyników jest znacznie łatwiejsza do odczytania i dostarcza definicji składni każdego polecenia: PS C:\> Get-Command Format-List name, definition Name : Add-Content Definition : Add-Content [-Path] <String[]> [-Value] <Object[]> [-PassThru] [-Filter <String>] [-Include <String[]>] [-Exclude <String[]>] [-Force] [-Credential<PSCredential>] [-Verbose] [-Debug] [-ErrorAction <ActionPreference>]
30 Windows PowerShell przewodnik po skryptach [-ErrorVariable<String>] [-OutVariable <String>] [-OutBuffer <Int32>] [-WhatIf] [-Confirm][-Encoding <FileSystemCmdletProviderEncoding>] Add-Content [-LiteralPath] <String[]> [-Value] <Object[]> [-PassThru][-Filter <String>] [-Include <String[]>] [-Exclude <String[]>] [-Force] [-Credential<PSCredential>] [-Verbose] [-Debug] [-ErrorAction <ActionPreference>] [-ErrorVariable <String>] [-OutVariable <String>] [-OutBuffer <Int32>] [-WhatIf] [-Confirm] [-Encoding <FileSystemCmdletProviderEncoding>] Name : Add-History Definition : Add-History [[-InputObject] <PSObject[]>] [-Passthru] [-Verbose] [-Debug] [-ErrorAction <ActionPreference>] [-ErrorVariable <String>] [-OutVariable String>] [-OutBuffer <Int32>] Dotychczas pokazane zostało zwykle zastosowanie polecenia cmdlet Get-Command. Bardziej interesująca metoda korzystania z tego polecenia opiera się na znajomości czasowników i rzeczowników, składających się na nazwy poleceń typu cmdlet. Posiadając taką wiedzę można np. wyszukać wszystkie polecenia typu cmdlet zawierające w nazwie rzeczownik process (proces). Odpowiednie polecenie mogłoby wyglądać w następujący sposób: PS C:\> Get-Command -Noun process CommandType Name Definition ----------- ---- ---------- Cmdlet Get-Process Get-Process [[-Name] <String[]>] [-Verbose] [-De... Cmdlet Stop-Process Stop-Process [-Id] <Int32[]> [-PassThru] [-Verbo... Jeśli zechcemy uzyskać listę poleceń, których rzeczownikowa część nazwy zaczyna się na literę p, to możemy skorzystać z tej procedury posługując się znakami uogólniającymi. Pozwala to zredukować liczbę koniecznych do wpisania znaków i jednocześnie pomaga zapoznać się z dostępnymi poleceniami typu cmdlet. Przykład takiego polecenia został pokazany poniżej: PS C:\> get-command -Noun p* CommandType Name Definition ----------- ---- ---------- Cmdlet Add-PSSnapin Add-PSSnapin [-Name] <String[]> [-PassThru] [-Ve... Cmdlet Convert-Path Convert-Path [-Path] <String[]> [-Verbose] [-Deb... Cmdlet Get-PfxCertificate Get-PfxCertificate [-FilePath] <String[]> [-Verb... Cmdlet Get-Process Get-Process [[-Name] <String[]>] [-Verbose] [-De... Cmdlet Get-PSDrive Get-PSDrive [[-Name] <String[]>] [-Scope <String... Cmdlet Get-PSProvider Get-PSProvider [[-PSProvider] <String[]>] [-Verb... Cmdlet Get-PSSnapin Get-PSSnapin [[-Name] <String[]>] [-Registered]... Cmdlet Join-Path Join-Path
Rozdział 1: Powłoka programu Windows PowerShell 31 [-Path] <String[]> [-ChildPath] <Strin... Cmdlet New-PSDrive New-PSDrive [-Name] <String> [-PSProvider] <Stri... Cmdlet Out-Printer Out-Printer [[-Name] <String>] [-InputObject <PS... Cmdlet Remove-PSDrive Remove-PSDrive [-Name] <String[]> [-PSProvider <... Cmdlet Remove-PSSnapin Remove-PSSnapin [-Name] <String[]> [-PassThru] [... Cmdlet Resolve-Path Resolve-Path [-Path] <String[]> [-Credential <PS... Cmdlet Set-PSDebug Set-PSDebug [-Trace <Int32>] [-Step] [-Strict] [... Cmdlet Split-Path Split-Path [-Path] <String[]> [-LiteralPath <Str... Cmdlet Stop-Process Stop-Process [-Id] <Int32[]> [-PassThru] [-Verbo... Cmdlet Test-Path Test-Path [-Path] <String[]> [-Filter <String>]... Cmdlet Write-Progress Write-Progress [-Activity] <String> [-Status] <S... Domyślnie polecenie Get-Command wyświetla tylko polecenia typu cmdlet, ale może ono zwracać również nazwy innych elementów, nawet plików.exe lub.dll. Polecenie Get-Command może wyświetlać informacje o każdym elemencie, który można uruchomić z poziomu programu Windows PowerShell. Poniżej pokazany został przykład polecenia zwracającego listę wszystkich poleceń zawierających w nazwie słowo file (plik). Należy przy tym pamiętać, że wyświetlane są tylko te elementy, które dostępne są dla programu Windows PowerShell. PS C:\> get-command -Name *file* CommandType Name Definition ----------- ---- ---------- Application avifile.dll C:\Windows\system32\avifile.dll Application filemgmt.dll C:\Windows\system32\filemgmt.dll Application FileSystem.format.ps1xml C:\Windows\System32\WindowsPowerShell\v1.0\FileS... Application filetrace.mof C:\Windows\System32\Wbem\filetrace.mof Application forfiles.exe C:\Windows\system32\forfiles.exe Działanie pokazanego powyżej przykładu można łatwo skorygować używając parametru -commandtype i ograniczając za jego pomocą listę wyników wyłącznie do poleceń typu cmdlet. Zmodyfikowana wersja tego polecenia została pokazana poniżej: PS C:\> get-command -Name *file* -CommandType cmdlet CommandType Name Definition ----------- ---- ---------- Cmdlet Out-File Out-File
32 Windows PowerShell przewodnik po skryptach [-FilePath] <String> [[-Encoding] <Stri Powyższe przykłady ilustrują możliwe sposoby wyszukiwania poleceń typu cmdlet za pomocą polecenia Get-Command. Wszystkie pokazane powyżej polecenia wraz z wygenerowanymi przez nie informacjami wyjściowymi znajdują się na towarzyszącej tej książce płycie CD-ROM w pliku Get-Command.txt z katalogu chapter01. Eksploracja obiektów przy użyciu polecenia Get-Member Trzecim ważnym poleceniem typu cmdlet, oferowanym przez program Windows PowerShell, jest polecenie Get-Member (Pobierz element członkowski). Gdy przedstawiam swoim studentom cmdlet Get-Member jako jedno z trzech poleceń Cajun, część z nich podchodzi do tego z nieufnością. Jeden ze studentów podniósł nawet rękę i zapytał, do czego nadaje się to polecenie. Jest to bardzo słuszne pytanie. Użyteczność polecenia Get-Member polega na tym, że może ono dostarczać informacji o tym, jakie właściwości i metody są obsługiwane przez dany obiekt. Jeśli przypomnimy sobie, że w programie Windows PowerShell wszystko jest obiektem, to będziemy mogli sami dojść, dlaczego polecenie to jest tak użyteczne. Prawdopodobnie wartość tego polecenia najlepiej będzie zilustrować na prostym przykładzie. Jeśli posiadamy folder o nazwie mytest i użyjemy polecenia Get-Item do pobrania obiektu reprezentującego ten folder, to wskaźnik do tego obiektu będzie można zapisać w zmiennej o nazwie $a. Zostało to pokazane poniżej: PS C:\> $a = Get-Item c:\mytest Gdy zmienna $a zawiera już wskaźnik do egzemplarza obiektu reprezentującego folder, można zapoznać się z metodami oraz właściwościami tego obiektu kierując go poprzez potok na wejście polecenie Get-Member. Odpowiednie polecenie wraz z wygenerowanym przez nie strumieniem wyjściowym zostało pokazane poniżej: PS C:\> $a Get-Member TypeName: System.IO.DirectoryInfo Name MemberType Definition ---- ---------- ---------- Create Method System.Void Create(), System.Void Create(DirectorySecurity directorysecurity) CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(Type requestedtype) CreateSubdirectory Method System.IO.DirectoryInfo CreateSubdirectory(String path), System.IO.Director... Delete Method System.Void Delete(), System.Void Delete(Boolean recursive) Equals Method System.Boolean Equals(Object obj) GetAccessControl Method System.Security.AccessControl.DirectorySecurity GetAccessControl(), System GetDirectories Method System.IO.DirectoryInfo[] GetDirectories(), System.IO.DirectoryInfo[GetFiles Method System.IO.FileInfo[] GetFiles(String searchpattern), System.IO.FileInfo[] G...
Rozdział 1: Powłoka programu Windows PowerShell 33 GetFileSystemInfos Method System.IO.FileSystemInfo[] GetFileSystemInfos(String searchpattern), System... GetHashCode Method System.Int32 GetHashCode() GetLifetimeService Method System.Object GetLifetimeService() GetObjectData Method System.Void GetObjectData *(SerializationInfo info, StreamingContext context) GetType Method System.Type GetType() get_attributes Method System.IO.FileAttributes get_attributes() get_creationtime Method System.DateTime get_creationtime() get_creationtimeutc Method System.DateTime get_creationtimeutc() get_exists Method System.Boolean get_exists() get_extension Method System.String get_extension() get_fullname Method System.String get_fullname() get_lastaccesstime Method System.DateTime get_lastaccesstime() get_lastaccesstimeutc Method System.DateTime get_lastaccesstimeutc() get_lastwritetime Method System.DateTime get_lastwritetime() get_lastwritetimeutc Method System.DateTime get_lastwritetimeutc() get_name Method System.String get_name() get_parent Method System.IO.DirectoryInfo get_parent() get_root Method System.IO.DirectoryInfo get_root() InitializeLifetimeService Method System.Object InitializeLifetimeService() MoveTo Method System.Void MoveTo(String destdirname) Refresh Method System.Void Refresh() SetAccessControl Method System.Void SetAccessControl(DirectorySecurity directorysecurity) set_attributes Method System.Void set_attributes(fileattributes value) set_creationtime Method System.Void set_creationtime(datetime value) set_creationtimeutc Method System.Void set_creationtimeutc(datetime value) set_lastaccesstime Method System.Void set_lastaccesstime(datetime value) set_lastaccesstimeutc Method System.Void set_lastaccesstimeutc(datetime value) set_lastwritetime Method System.Void set_lastwritetime(datetime value) set_lastwritetimeutc Method System.Void set_lastwritetimeutc(datetime value) ToString Method System.String ToString() PSChildName NoteProperty System.String PSChildName=mytest PSDrive NoteProperty System.Management.Automation.PSDriveInfo PSDrive=C PSIsContainer NoteProperty System.Boolean PSIsContainer=True PSParentPath NoteProperty System.String PSParentPath=Microsoft.PowerShell.Core\FileSystem::C:\ PSPath NoteProperty System.String PSPath=Microsoft.PowerShell.Core\FileSystem::C:\mytest PSProvider NoteProperty System.Management.Automation.ProviderInfo PSProvider=Microsoft.PowerShell.C... Attributes Property System.IO.FileAttributes Attributes {get;set;} CreationTime Property System.DateTime CreationTime {get;set;} CreationTimeUtc Property System.DateTime CreationTimeUtc {get;set;} Exists Property System.Boolean Exists {get;}
34 Windows PowerShell przewodnik po skryptach Extension Property System.String Extension {get;} FullName Property System.String FullName {get;} LastAccessTime Property System.DateTime LastAccessTime {get;set;} LastAccessTimeUtc Property System.DateTime LastAccessTimeUtc {get;set;} LastWriteTime Property System.DateTime LastWriteTime {get;set;} LastWriteTimeUtc Property System.DateTime LastWriteTimeUtc {get;set;} Name Property System.String Name {get;} Parent Property System.IO.DirectoryInfo Parent {get;} Root Property System.IO.DirectoryInfo Root {get;} Mode ScriptProperty System.Object Mode {get=$catr = "";... Na liście elementów składowych obiektu typu folder znajduje się między innymi właściwość parent (element nadrzędny). Właściwość tę można wykorzystać do odszukania folderu nadrzędnego dla folderu mytest. Odpowiedni przykład został pokazany poniżej: PS C:\> $a.parent Mode LastWriteTime Length Name ---- ------------- ------ ---- d--hs 5/11/2007 2:39 PM C:\ Być może interesować nas będzie, kiedy po raz ostatni korzystano z danego folderu. Możemy wówczas skorzystać z właściwości LastAccessTime, tak jak to zostało pokazane poniżej: PS C:\> $a.lastaccesstime Friday, May 11, 2007 2:39:12 PM PS C:\users\edwils> $a.lastaccesstime 10 czerwca 2008 21:35:41 Jeśli natomiast zechcemy sprawdzić, czy obiekt zapisany w zmiennej w $a faktycznie jest folderem, to możemy skorzystać z właściwości PsIsContainer. Z poprzednich wyników polecenia Get-Member wiemy, że właściwość PsIsContainer jest właściwością logiczną (typu Boolean), a więc mogą przyjmować wartości True (prawda) lub False (fałsz). Odpowiednie polecenie zostało pokazane poniżej: PS C:\> $a.psiscontainer True Możemy również skorzystać z jednej ze zwróconych na liście metod. Np. metoda moveto (Przenieś do) pozwala na przeniesie folderu do innej lokalizacji. Z wyników zwróconych poprzednio przez polecenie Get-Member wiemy, że metoda moveto wymaga podania argumentu wejściowego typu łańcuch tekstowy, zawierającego wskazanie katalogu docelowego. Przenieśmy więc folder mytest do folderu c:\movedfolder, a następnie sprawdźmy za pomocą polecenia Test-Path, czy folder mytest faktycznie został przeniesiony do nowej lokalizacji. Odpowiednie polecenia zostały pokazane poniżej: PS C:\> $a.moveto("c:\movedfolder") PS C:\> Test-Path c:\movedfolder True PS C:\> Test-Path c:\mytest False PS C:\>
Rozdział 1: Powłoka programu Windows PowerShell 35 Korzystając z właściwości Name możemy teraz sprawdzić nazwę folderu reprezentowanego przez obiekt przechowywany w zmiennej $a. Odpowiednie polecenie wraz z wygenerowanym przez nie wynikiem zostało pokazane poniżej: PS C:\> $a.name movedfolder Jeśli zechcemy usunąć ten folder, możemy skorzystać z metody delete, tak jak to pokazano poniżej. Aby przekonać się, że folder ten został faktycznie usunięty, można skorzystać z polecenia dir m*. Polecenia te zostały pokazane poniżej. Należy zauważyć, że po ich wykonaniu folder faktycznie został usunięty. PS C:\> $a.delete() PS C:\> dir m* Directory: Microsoft.PowerShell.Core\FileSystem::C:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 4/21/2007 4:56 PM Maps d---- 5/5/2007 3:51 PM music -a--- 2/1/2007 6:17 PM 54 MASK.txt Wszystkie te polecenia wraz z wygenerowanymi przez nie informacjami wyjściowymi znajdują się na towarzyszącej tej książce płycie CD-ROM, w pliku Get-Member.txt w katalogu chapter01. Praca ze środowiskiem.net Framework Warto w tym miejscu zauważyć, że polecenia te faktycznie pochodzą ze środowiska.net Framework. Właściwie nie są to wcale polecenia programu Windows PowerShell. Oczywiście polecenia Get-Item, Get-Member i Test-Path są poleceniami typu cmdlet programu Windows PowerShell, ale obiekt System.IO.DirectoryInfo nie jest obiektem wywodzącym się z programu Windows PowerShell. Oznacza to, że korzystając z programu Windows PowerShell używamy tych samych metod i właściwości, z których korzystają profesjonalni programiści używający języka Visual Basic.NET lub C#. Oznacza to także, że wiele dodatkowych informacji można znaleźć w biuletynach MSDN (Microsoft Developer Network) oraz w pakietach typu Windows SDK (Software Development Kit). Dobra wiadomość dla wszystkich administratorów: jeśli potrzebnych informacji nie można znaleźć przy użyciu systemu pomocy online (za pomocą polecenia Get-Help), zawsze można skorzystać z internetowej witryny MSDN lub z dokumentacji towarzyszących pakietom typu Windows SDK.
36 Windows PowerShell przewodnik po skryptach Podsumowanie W rozdziale tym omówione zostały różne sposoby sprawdzania, czy program Windows PowerShell został zainstalowany na komputerze oraz kroki związane z konfigurowaniem tego programu do zastosowań w środowiskach korporacyjnych. Omówiono proces tworzenia profili programu Windows PowerShell oraz różne metody uruchamiania programu Windows PowerShell i wykonywania poleceń tego programu. Omówione zostały również metody rozszerzania funkcjonalności programu Windows PowerShell poprzez tworzenie niestandardowych aliasów i funkcji. Na zakończenie omówione zostały dokładniej trzy polecenia typu cmdlet programu Windows PowerShell: Get-Help, Get-Command oraz Get-Member.
Rozdział 2 Skrypty programu Windows PowerShell Po ukończeniu tego rozdziału Czytelnik będzie potrafił: n Konfigurować zasadę wykonywania skryptów dla programu Windows PowerShell. n Uruchamiać skrypty programu Windows PowerShell. n Używać instrukcji sterujących programu Windows PowerShell. n Używać instrukcji decyzyjnych i rozgałęziających. n Rozpoznawać i używać różne typy danych. n Używać wyrażeń regularnych do zapewniania zaawansowanych możliwości porównywania wzorców. n Używać argumentów podawanych w wierszu poleceń. Na dysku CD Wszystkie używane w tym rozdziale skrypty znajdują się na towarzyszącej tej książce płycie CD-ROM, w folderze \scripts\chapter02. Dlaczego warto korzystać ze skryptów? Dla wielu administratorów sieci pisanie skryptów, jakichkolwiek skryptów, to prawdziwa czarna magia, bardziej zbliżona do wróżenia z fusów niż do administrowania serwerem. Faktycznie, o ile w większości dużych korporacji zwykle znajduje się jakaś osoba od skryptów, to rzadko jest to więcej niż jedna osoba. Dzieje się tak pomimo wysiłków firmy Microsoft na rzecz promowania języka Visual Basic Scripting Edition (VBScript) jako skryptowego języka administratorów. O ile większość profesjonalistów przyznaje, że możliwość szybkiego przygotowania skryptu pozwalającego wykonać ad-hoc potrzebne zmiany na kilkudziesięciu podłączonych do sieci serwerach jest bardzo cenną umiejętnością to w rzeczywistości sztukę tę opanowała ledwie garstka z nich. W rzeczywistości jednak umiejętności większości pracowników mających w swoich firmach status osoby od skryptów bliższe są wiedzy, gdzie można znaleźć odpowiedni skrypt, który można łatwo zmodyfikować, niż rzeczywistej wiedzy, jak napisać poprawny skrypt od zera. Na szczęście sytuacja ta powinna ulec zmianie w świecie programu Windows PowerShell. Składnia programu Windows PowerShell została celowo dobrana tak, aby umożliwić łatwość korzystania z tego programu oraz łatwość jego nauki. Docelową grupą odbiorców tego programu są zatrudniani w przedsiębiorstwach i korporacjach administratorzy systemu Windows. A więc, dlaczego warto korzystać ze skryptów? Istnieje kilka powodów. Po pierwsze utworzenie skryptu ułatwia udokumentowanie konkretnej sekwencji poleceń. Jeśli np. zajdzie potrzeba utworzenia listy wszystkich udostępnionych na komputerze folderów 37
38 Windows PowerShell przewodnik po skryptach sieciowych, to można to zrobić przy pomocy klasy WMI Win32_share oraz polecenia cmdlet Get-WmiObject (Pobierz obiekt WMI), tak jak to zostało pokazanie poniżej: PS C:\> Get-wmiObject win32_share Name Path Description ---- ---- ----------- ADMIN$ C:\Windows Remote Admin C$ C:\ Default share CCMLogs$ C:\Windows\system32\ccm\logs CCMSetup$ C:\Windows\system32\ccmsetup IPC$ Remote IPC music C:\music none VPCache$ C:\Windows\system32\VPCache WMILogs$ C:\Windows\system32\wbem\logs Przypuśćmy jednak, że potrzebna jest tylko lista udostępnionych plików. Administrator może nie wiedzieć, że udziały plikowe są udziałami typu 0. Tak więc być może konieczne będzie odszukanie tej informacji w sieci Internet. Po uzyskaniu tej informacji administrator może skorzystać ze zmodyfikowanego polecenia, pokazanego poniżej: PS C:\> Get-WmiObject win32_share -Filter "type = '0'" Name Path Description ---- --- ----------- CCMLogs$ C:\Windows\system32\ccm\logs CCMSetup$ C:\Windows\system32\ccmsetup music C:\music none VPCache$ C:\Windows\system32\VPCache WMILogs$ C:\Windows\system32\wbem\logs Jak widać, w tym przypadku administrator musi nie tylko zapamiętać, że typ udziału powinien mieć wartość 0, ale także składnia polecenia jest nieco bardziej złożona. A więc gdzie administrator mógłby zanotować te informacje? Oto jedna z sugestii: Gdy jako administrator zajmowałem się systemem Digital VAX, do przechowywania tego rodzaju tajemniczych poleceń używałem małego, kieszonkowego notebooka. Oczywiście, gdybym w jakiś sposób utracił tego małego notebooka lub zapomniał o zabraniu go ze sobą, znalazłbym się w poważnych tarapatach! Załóżmy teraz, że administratora interesują tylko te udziały plikowe, którym nie przypisano żadnego opisu. Odpowiednie polecenie zostało pokazane poniżej: PS C:\> Get-WmiObject win32_share -Filter "type = '0' AND description = ''" Name Path Description ---- ---- ----------- CCMLogs$ C:\Windows\system32\ccm\logs CCMSetup$ C:\Windows\system32\ccmsetup VPCache$ C:\Windows\system32\VPCache WMILogs$ C:\Windows\system32\wbem\logs W tym miejscu można już odnieść wrażenie, że stopień złożoności tego polecenia oraz jego składni uzasadnia już napisanie skryptu. Utworzenie skryptu jest bardzo łatwe. Wystarczy po prostu skopiować to polecenie z okna konsoli programu Windows PowerShell, wkleić
Rozdział 2: Skrypty programu Windows PowerShell 39 je do pliku tekstowego, nadać mu odpowiednią nazwę i zmienić rozszerzenia na.ps1. Tak przygotowany skrypt będzie można później uruchamiać z poziomu programu Windows PowerShell. Pokazane powyżej polecenia zostały zapisane w pliku Share.txt, znajdującym się na towarzyszącej tej książce płycie CD-ROM, w katalogu chapter02. Skrypt nosi nazwę GetFileShares.ps1. Dodatkową zaletą konfigurowana poleceń jako skryptów jest możliwość łatwego dokonywania ich modyfikacji. O ile pokazane poprzednio polecenia ograniczały się do raportowania informacji tylko o udziałach plikowych, poprzez odpowiednią zmianę skryptu można uzyskać informacje o udostępnionych drukarkach, zdalnych udziałach administracyjnych, udziałach typu IPC lub innych udziałach dowolnego, zdefiniowanego typu. Możliwa jest nawet taka modyfikacja skryptu, aby wybór rodzaju udziału odbywał się podczas jego uruchamiania. W tym celu należy sprawdzić za pomocą instrukcji if... else, czy dla skryptu określony został argument wiersza poleceń. Wskazówka Do sprawdzania argumentów podawanych w wierszu poleceń służy zmienna $args, która jest zmienną typu automatycznego, tworzoną do przechowywania argumentów z wiersza poleceń. Jeśli istnieje argument podany w wierszu poleceń, to należy użyć wartość określoną za pomocą tego argumentu. Jeśli podczas wywołania skryptu nie zostanie podany żaden argument, konieczne jest określenie wewnątrz skryptu wartości domyślnej. W przypadku omawianego skryptu utworzona zostanie lista udziałów plikowych, a użytkownik zostanie poinformowany o użyciu wartości domyślnych. Składnia polecenia Get-WmiObject (Pobierz obiekt WMI) jest taka sama, jaką posługiwano się w języku VBScript. Tworząc nowy skrypt warto również zadbać o wyświetlanie tekstu z opisem sposobu korzystania z danego skryptu (tzw. usage string). Pokazany poniżej skrypt GetSharesWithArgs.ps1 zawiera tekst przykładowej instrukcji, pomagający w zastosowaniu poprawnej składni skryptu. GetSharesWithArgs.ps1 if($args) { $type = $args Get-WmiObject win32_share -Filter "type = $type" } ELSE { Write-Host " Użyta zostanie domyślna wartość (0) oznaczająca udział typu plikowego. Inne poprawne wartości oznaczające typ udziału to: 2147483651 dla dyskowych udziałów administracyjnych 2147483649 dla administracyjnie udostępnionych kolejek wydruku 2147483650 dla administracyjnych udziałów urządzeń 2147483651 dla administracyjnego udziału ipc$ Przykład: C:\GetSharesWithArgs.ps1 '2147483651' " $type = '0' Get-WmiObject win32_share -Filter "type = $type" }
40 Windows PowerShell przewodnik po skryptach Innym powodem uzasadniającym tworzenie przez administratorów sieci skryptów programu Windows PowerShell jest uruchamianie tych skryptów jako zaplanowanych zadań. W świecie systemu Windows istnieje kilka różnych motorów harmonogramu zadań. Zaplanowane zadania można tworzyć, monitorować i usuwać za pomocą klasy WMI Win32_ScheduledJob. Ta klasa WMI jest dostępna od czasu systemu Windows NT 4.0. Systemy Windows XP oraz Windows Server 2003 zawierają program narzędziowy Schtasks.exe, który oferuje większą elastyczność niż klasa WMI Win32_ScheduledJob. Oprócz programu Schtasks.exe systemy Windows Vista oraz Windows Server 2008 zawierają także obiekt Schedule.Service, upraszczający konfigurowanie zaplanowanych zadań. Zamieszczony poniżej skrypt ListProcessesSortResults.ps1 stanowi przykład skryptu, który może być uruchamiany kilka razy dziennie, według zaplanowanego harmonogramu. Skrypt ten tworzy listę aktualnie działających procesów i zapisuje ją w pliku tekstowym jako sformatowaną i posortowaną tabelę. ListProcessesSortResults.ps1 $args = "localhost","loopback","127.0.0.1" foreach ($i in $args) {$strfile = "c:\mytest\"+ $i +"Processes.txt" Write-Host "Testowanie" $i "proszę czekać..."; Get-WmiObject -computername $i -class win32_process Select-Object name, processid, Priority, ThreadCount, PageFaults, PageFileUsage Where-Object {!$_.processid -eq 0} Sort-Object -property name Format-Table Out-File $strfile} Konfigurowanie zasady obsługi skryptów Ponieważ obsługa skryptów przez program Windows PowerShell jest domyślnie wyłączona, więc bardzo ważne jest, aby przed przystąpieniem do wdrożenia skryptów lub poleceń sprawdzić poziom obsługi skryptów na danej platformie. Próba uruchomienia skryptu programu Windows PowerShell w sytuacji, gdy obsługa skryptów nie została włączona, spowoduje wypisanie odpowiedniego komunikatu o błędzie, a skrypt nie zostanie uruchomiony. Komunikat z tym błędem pokazany został na rysunku 2-1. Błąd ten odnosi się do tzw. zasady ograniczonego wykonywania (ang. restricted execution policy). Istnieją cztery poziomy zasady wykonywania, które można skonfigurować w programie Windows PowerShell za pomocą polecenia Set-ExecutionPolicy (Ustaw zasadę wykonywania). Wszystkie te cztery poziomy zostały wymienione w tabeli 2-1. Zasadę ograniczonego wykonywania można skonfigurować za pomocą zasad grupy, przy użyciu ustawienia Turn On Script Execution (Włącz wykonywanie skryptów) usługi katalogowej Active Directory. Ustawienie to można zastosować wobec obiektu komputera albo wobec obiektu użytkownika. Ustawienia dotyczące obiektu komputera mają pierwszeństwo przed innymi ustawieniami. Wskazówka W celu uzyskania informacji o bieżących zasadach wykonywania skryptów, należy skorzystać z polecenia Get-ExecutionPolicy.
Rozdział 2: Skrypty programu Windows PowerShell 41 Rysunek 2-1 Próba uruchomienia skryptu przed włączeniem obsługi skryptów powoduje wygenerowanie błędu. Preferencje użytkownika w zakresie zasad ograniczonego wykonywania skryptów można skonfigurować za pomocą polecenia Set-ExecutionPolicy, ale należy pamiętać, że preferencje te nie zastępują ustawień skonfigurowanych za pomocą zasad grupy. Wynikowy zestaw ustawień zasady ograniczonego wykonywania można uzyskać za pomocą polecenia Get-ExecutionPolicy. Tabela 2-1 Poziomy zasady wykonywania skryptów Poziom Restricted (Ograniczony) AllSigned (Wszystkie podpisane) RemoteSigned (Zdalne podpisane) Unrestricted (Bez ograniczeń) Znaczenie Skrypty i pliki konfiguracyjne nie będą uruchamiane. Wszystkie skrypty i pliki konfiguracyjne muszą być podpisane przez zaufanego wydawcę. Wszystkie skrypty i pliki konfiguracyjne pobrane z sieci Internet muszą być podpisane przez zaufanego wydawcę. Uruchamiane będą wszystkie skrypty i pliki konfiguracyjne. Przed uruchomieniem skryptów poprawnych z sieci Internet wyświetlany będzie monit z prośbą o zgodę na uruchomienie.
42 Windows PowerShell przewodnik po skryptach Należy zdawać sobie sprawę, że w systemie Windows Vista dostęp do kluczy rejestru zawierających ustawienia zasady wykonywania skryptów jest ograniczony. Zwykły użytkownik nie może modyfikować tego klucza i nawet administrator pracujący z włączonym mechanizmem kontroli konta użytkownika (UAC User Account Control) nie będzie mógł modyfikować tych ustawień. Próba wykonania takiej modyfikacji spowoduje wygenerowanie błędu pokazanego na rysunku 2-2. Rysunek 2-2 Próba uruchomienia polecenia Set-ExecutlonPollcy przez użytkownika nieposiadającego uprawnień administracyjnych zakończy się niepowodzeniem. Oczywiście istnieje kilka sposobów na ominięcie problemów wynikających z istnienia mechanizmu UAC. Jednym z nich jest po prostu wyłączenie mechanizmu UAC, ale w większości przypadków jest to nieodpowiednie rozwiązanie. Lepszym rozwiązaniem jest kliknięcie prawym przyciskiem myszy ikony programu Windows PowerShell i wybranie z menu kontekstowego polecenia Run As Administrator (Uruchom jako administrator), tak jak to zostało pokazane na rysunku 2-3. Jeśli administrator (tak jak ja!) uzna metodę z klikaniem prawym klawiszem myszy za zbyt czasochłonną, to może zdecydować się na utworzenie drugiego skrótu do programu Windows PowerShell. Ten drugi skrót można nazwać np. admin_ps i skonfigurować jego właściwości w taki sposób, aby program uruchamiany był z uprawnieniami administratora. Pierwszy z tych skrótów powinien być wystarczający dla około 90% wszystkich potrzeb administracyjnych. Jeśli jednak potrzebny będzie wyższy poziom uprawnień, można będzie skorzystać ze skrótu administracyjnego. Właściwości skrótu admin_ps dla administracyjnej wersji programu PowerShell zostały pokazane na rysunku 2-4.
Rozdział 2: Skrypty programu Windows PowerShell 43 Rysunek 2-3 W celu uruchomienia programu Windows PowerShell z uprawnieniami administracyjnymi można kliknąć jego ikonę prawym klawiszem myszy i wybrać z menu polecenie Run As Administrator) Rysunek 2-4 Aby skonfigurować uruchamianie programu Windows PowerShell z uprawnieniami administracyjnymi, należy zaznaczyć pole wyboru opcji Run As Administrator w oknie dialogowym Advanced Properties. Uruchamianie skryptów programu Windows PowerShell Skryptów programu Windows PowerShell nie można uruchamiać poprzez zwykłe, dwukrotne kliknięcie myszą. Skryptów tych nie można również uruchamiać poprzez wpisanie ich nazwy w oknie dialogowym Start Run (Start Uruchom). Jeśli obsługa skryptów została włączona, to skrypty można uruchamiać z poziomu okna konsoli programu Windows PowerShell, ale wymaga to wpisania całej ścieżki do pliku ze skryptem, razem z rozszerzeniem.ps1. Jeśli istnieje potrzeba uruchomienia skryptu spoza programu Windows PowerShell, również koniecznie jest wpisanie pełnej ścieżki do skryptu, lecz tym razem jako argumentu dla programu PowerShell.exe. Ponadto, prawdopodobnie wskazane będzie użycie przełącznika -noexit, co umożliwi odczytanie wyników działania skryptu w oknie konsoli
44 Windows PowerShell przewodnik po skryptach programu Windows PowerShell. Używana w tym przypadku składnia została pokazana na rysunku 2-5. Rysunek 2-5 Uruchamiając skrypt programu Windows PowerShell spoza konsoli należy używać argumentu -noexit, aby umożliwić odczytanie rezultatów działania skryptu. Stosowanie zmiennych Podczas korzystania z programu Windows PowerShell domyślnie nie ma potrzeby deklarowania zmiennych przed ich użyciem. Deklaracja zmiennej następuje z chwilą użycia jej do przechowywania danych. Nazwy wszystkich zmiennych muszą być poprzedzane symbolem dolara. W programie Windows PowerShell istnieje klika zmiennych specjalnych. Zmienne te są tworzone automatycznie i każda z nich ma specjalne znaczenie. Tabela 2-2 zawiera listę tych specjalnych zmiennych wraz z opisem ich znaczenia. Tabela 2-2 Znaczenie zmiennych specjalnych Nazwa Znaczenie $^ Zawiera pierwszy element z ostatniej linii wejściowych danych powłoki. $$ Zawiera ostatni element z ostatniej linii wejściowych danych powłoki. $_ Bieżący element potoku; zmienna ta jest używana w blokach skryptowych, filtrach i poleceniach Where-Object, ForEach-Object oraz switch. $? Zawiera status oznaczający powodzenie lub niepowodzenie ostatniej instrukcji. $args Zmienna używana w funkcjach wymagających pametrów. $error W przypadku wystąpienia błędu w zmiennej $error zostaje zapisany obiekt klasy error. $executioncontext Obiekty klasy execution, dostępne dla narzędzi typu cmdlet. $foreach Oznacza licznik pętli typu foreach. $home Katalog domowy użytkownika. Zmienna ta otrzymuje wartość %HOMEDRIVE%\%HOMEPATH%.