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
Spis treści Podziękowania...xi Wstęp... xiii 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 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
Spis treści v 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 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
vi Spis treści 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 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
Spis treści vii 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 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
viii Spis treści 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 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
Spis treści ix 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 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
x Spis treści 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 Ogólna konstrukcja skryptu... 655 Funkcje należy umieszczać w skryptach, które je wywołują... 655 Należy stosować pełne nazwy poleceń typu cmdlet oraz pełne nazwy parametrów... 656 Należy używać polecenia Get-Item, przekształcając tekstowe ścieżki do plików we wszechstronne obiekty... 657 Ogólna czytelność skryptu... 657 Formatowanie kodu... 658 Praca z funkcjami... 660 Tworzenie plików z szablonami... 662 Pisanie funkcji... 662 Tworzenie i nazywanie zmiennych oraz stałych... 662 E Ogólne wskazówki dotyczące rozwiązywania problemów... 665
Rozdział 1 Powłoka programu Windows PowerShell Po ukończeniu tego rozdziału Czytelnik będzie potrafił: Instalować i konfigurować program Windows PowerShell. Radzić sobie z problematyką bezpieczeństwa w programie Windows PowerShell. Zrozumieć podstawy działania i korzystania z poleceń typu cmdlet. Używać aliasów do przypisywania skróconych nazw poleceniom typu cmdlet. 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: Utworzenie pakietu Microsoft SMS (Systems Management Server Serwer zarządzania systemami) i anonsowanie go w odpowiedniej jednostce organizacyjnej (OU) lub kolekcji. 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 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. Uruchomienie programu Windows PowerShell bez baneru startowego, przy użyciu argumentu -nologo:
8 Windows PowerShell przewodnik po skryptach PowerShell -nologo Uruchomienie konkretnej wersji programu Windows PowerShell, przy użyciu argumentu -version: PowerShell -version 1.0 Uruchomienie programu Windows PowerShell przy użyciu konkretnego pliku konfiguracyjnego, wskazanego za pomocą argumentu -psconsolefile: PowerShell -psconsolefile myconsole.psc1 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