1k likes | 1.55k Views
Windows PowerShell. Remigiusz Górecki Krzysztof Boryczko. Czym jest PowerShell ?. Windows PowerShell (WPS) to oparte na platformie .NET środowisko przeznaczone do zarządzania systemem operacyjnym z poziomu konsoli oraz automatyzowania zadań administracyjnych przy użyciu skryptów. .
E N D
Windows PowerShell Remigiusz Górecki Krzysztof Boryczko
Czym jest PowerShell ? Windows PowerShell (WPS) to oparte na platformie .NET środowisko przeznaczone do zarządzania systemem operacyjnym z poziomu konsoli oraz automatyzowania zadań administracyjnych przy użyciu skryptów.
Cechy środowiska • Zbiór poleceń zaimplementowanych jako aplety poleceń (commandlet). • Zapewnia dostęp do wszystkich obiektów systemowych i aplikacji bibliotek ComponentObject Model (COM), platformy .NET Framework i interfejsu Windows Management Instrumentation (WMI). • Zapewnia efektywne interakcje między apletami poleceń, dzięki przetwarzaniu potokowemu opartemu na obiektach (interpretery uniksowe pracują na tekście)
Cechy środowiska - cd • Posiada jednolity sposób dostępu do różnych repozytoriów danych, zarówno hierarchicznych (AD, system plików), jak i płaskich (zmienne środowiskowe). • Język skryptowy jest intuicyjny, łatwy do nauczenia. Umożliwia kontrolę błędów na różnych poziomach. • Zastosowany model zabezpieczeń pozwala blokować uruchamianie niepożądanych skryptów. • Posiada możliwość śledzenia wykonania i debugowania. • Możliwy do zintegrowania z dowolną aplikacją.
Historia • Powstał w trakcie prac nad Windows Server 2003 – chodziło o zastąpienie DOS-owego okna wiersza poleceń. • Środowisko WSH (Windows Scripting Host) było trudne w użyciu, wymagało dobrej znajomości zasad programowania obiektowego oraz niespójności i wyjątków modelu COM. • 2002 - Premiera .NET Framework. • X.2003 – premiera nowej powłoki o roboczej nazwie Monad. • V.2006 – premiera wersji 1.0 PowerShell.
Instalacja • Windows Server 2008R2 jest pierwszym, do którego włączono WPS. • Dostępne dla: • Windows XP – z Service Pack 2, • Windows Server 2003 – z Service Pack 1, • Windows Vista, • Windows 2008 • Windows 7. • Wymaga wcześniejszego zainstalowania .NET Framework w wersji co najmniej 2.0 z SP2. • Wersja 2.0 WPS wyposażona została w edytor i debuger. • Rozszerzenia PoweShell Community Extensions (PSCX) dostępne na stronie: www.codeplex.com/PowerShellCX • Alternatywny edytor PowerShellPlus dostępny na stronie:www.powershell.com
WPS w trybie interaktywnym • Uruchomienie konsoli i wydawanie poleceń z linii komend.
WPS w trybie wykonywania skryptów • Skrypt PowerShella to plik tekstowy w języku PowershellScriptLanguage (PSL). • Skrypt zawiera deklaracje zzmiennych oraz wywołania apletów.
Podstawy apletów poleceń • Standardowe polecenie WPS to aplet polecenia (commandlet, cmdlet) lub funkcja. • Aplety są wykonywane zawsze w obrębie głównego procesu WPS. • Na wywołanie apletu składają się najczęściej trzy elementy: • czasownik, • rzeczownik (w liczbie pojedynczej), • lista parametrów (opcjonalna). • Czasownik i rzeczownik są połączone znakiem - , a kolejne parametry oddzielone spacją. • Wielkość liter nie ma znaczenia. • Przykład: PS C:\ > Get-Process i*
Parametry wywołania apletu (1) • Są traktowane jako ciągi znakowe, niezależnie od tego, czy są ujęte w cudzysłów, czy nie. • Znaki cudzysłowu są opcjonalne poza sytuacją, gdy parametr zawiera znak spacji: PS C:\> Get-ChildItem ”C:\ProgramFiles”
Parametry wywołania apletu (2) • Jeżeli aplet polecenia posiada więcej niż jeden parametr, można je podawać w ściśle określonej kolejności lub posłużyć się nazwami. Poniższe polecenia mają identyczne działanie: PS C:\> Get-ChildItem c:\temp *.doc PS C:\> Get-ChildItem –Path c:\temp –Filter *.doc PS C:\> Get-ChildItem –Filter *.doc –Path c:\temp
Przełączniki • Przełączniki to parametry nie posiadające wartości. • Samo użycie nazwy takiego parametru aktywuje odpowiednią funkcję. • Przykładowo, rekurencyjne przetwarzanie pliku danych zapewnia przełącznik –recurse: PS C:\> Get-ChildItem C:\temp -recurse
Parametry określone wyrażeniami • Wartość parametru może być wynikiem obliczenia wartości wyrażenia: • W treści parametrów można korzystać z symboli wieloznacznych: PS C:\> Get-ChildItem (”C:\” + ”temp”) *.dll –recurse PS C:\> Get-Process –id (2800 + 100) PS C:\> Get-Service –exclude ” [k-z]*”
Tryby przetwarzania WPS • Tryb poleceń (normalny) – wszystkie dane wejściowe są traktowane jako ciągi znakowe: • Tryb wyrażeń – umożliwia rozpoznawanie liczb i wyrażeń: • Tryby można łączyć. • Wyrażenie można włączyć do polecenia stosując znaki nawiasów. ”Hello ”+ ” ” + ”World” Write-Output 10* (8 + 6)
Aliasy • Pozwalają skrócić wywołania apletów poleceń. • Polecenie Get-Alias (lub jego alias aliases) pozwala wyświetlić listę predefiniowanych skrótów nazw apletów poleceń. • Listę wszystkich aliasów wybranego apletu (w tym przypadku Get-Process) uzyskamy poleceniem: Get-Alias | Where-Object { $_.definition -eq ”get-process” }
Tworzenie nowych aliasów • Nowy alias można zdefiniować przy pomocy poleceń: • New-Alias – tworzy nowy alias lub zwraca informację o błędzie, jeśli alias o podanej nazwie już istnieje. • Set-Alias – definiuje nowy alias, a jeżeli dana nazwa została już wykorzystana, zastępuje starą definicję nową. • Parametr –description pozwala dołączyć do aliasu jego opis. • Aliasy mogą zastępować nazwy apletów poleceń oraz nazwy zwykłych aplikacji. • Definicje aliasów nie mogą obejmować parametrów – w takim wypadku należy użyć funkcji. • Limit aliasów 4096 (wartość zmiennej $MaximumAliasCount – może zostać zmieniona). Set-Alias procsGet-Process New-Alias procsGet-Process Set-Alias npnotepad.exe Function Temp { get-childitem c:\temp }
Polecenia zewnętrzne • Wszystkie polecenia, które nie zostaną rozpoznane jako aliasy, nazwy apletów poleceń lub wyrażenia są traktowane jako wywołania aplikacji zewnętrznych. • Umożliwia to wykorzystywanie PowerShella jako tradycyjnej powłoki, pozwalającej uruchamiać aplikacje. • Jeżeli zamiast nazwy polecenia użyta zostanie nazwa pliku, PowerShell korzysta z ustawień zapisanych w Rejestrze Windows, uruchamia domyślną aplikację i otwiera w niej dokument. • Przy interpretowaniu wywołań, WPS przeszukuje nazwy w następującej kolejności: • aliasy, • funkcje, • aplety poleceń, • polecenia zewnętrzne.
Potoki danych • Aplety można łączyć w kolejne stopnie przetwarzania przy użyciu potoków. • W przeciwieństwie do potoków interpreterów poleceń systemu UNIX, potok PowerShella przekazuje obiekty platformy .NET. • Obiektowe przetwarzanie potoków zapewnia niezależność przetwarzania elementów danych od ich położenia w przekazywanym zbiorze informacji. Get-Process | Where-Object { $_.name –eq ”iexplore” | Format-Table, Working-Set
Typy obiektów • Aplet może przekazać do potoku dowolny obiekt .NET oraz liczby i ciągi znakowe. • Standardem jest jednolite traktowanie klasy i typów pierwotnych. Jednak umieszczanie w potoku ciągu znakowego jest wyjątkiem, gdyż dostęp do obiektów daje większe możliwości. • Specyfikę podejścia obiektowego obrazuje praca z liczbami. WorkingSet64 to 64-ro bitowa wartość liczbowa, reprezentująca np. wykorzystanie pamięci przez proces. Get-Process | Where-Object { $_.WorkingSet64 –gt 20*1024*1024 } Get-Process | Where-Object { $_.WorkingSet64 –gt 20MB } ps | ? { $_.ws –gt 20MB }
Wywołania metod (1) • Obiekty .NET, oprócz właściwości mają także metody, które można wywoływać w potoku obiektów. Obiekty klasy System.Diagnostics.Process mają m.in. metodę kill(). • Możliwe jest bezpośrednie wywoływanie metody. Get-Processiexplore | Stop-Process Get-Processiexplore | Foreach-Object { $_.Kill() } ps | ? { $_.name –eq ”iexplore” } | % { $_.Kill() }
Wywołania metod (2) • Poprzedni przykład działa poprawnie do momentu, w którym w systemie są procesy Internet Explorera. Jeśli wszystkie zostały zakończone, to wywołania Get-Process |iexplore generuje błąd. Stąd polecenie: • Filtrowanie realizuje aplet Where-Object. Nie generuje błędu w przypadku braku obiektów. • Aplet Get-Process ma opcję umożliwiającą filtrowanie. Stąd postać: Get-Process | Where-Object { $_.Name –eq ”iexplore” } | Stop-Process ps –p ”iexplore” | Kill
Filtrowanie napisów • Wywołanie poleceń (ping, netstat) przekazuje do potoku grupę ciągów znakowych. • Każdy wiersz danych wyjściowych jest obiektem typu System.String. • Ciągi takie można analizować przy użyciu apletu polecenia Select-String, będącego rodzajem filtru przekazującego na wyjście tylko te wiersze, których treść pasuje do podanego wzorca.
Dane wyjściowe • Aplet nie powinien formatować danych wyjściowych samodzielnie. • Na ekranie pojawia się wynik działania ostatniego apletu w potoku. • Do formatowania służą aplety: • Out-Default – formatowanie standardowe, zgodne z zapisem w konfiguracji PowerShella. • Out-Host – działa podobnie jak Out-Default, ale pozwala użyć opcji podziału na strony. • Out-Null– powoduje, że dane wyjściowe nie są wyświetlane. • Format-Wide – lista dwukolumnowa. • Format-List – lista szczegółowa. • Format-Table – tabela.
Formatowanie standardowe • Jeżeli potoku nie kończy wywołanie funkcji formatującej, WPS automatycznie przekazuje dane apletowi Out-Default. • Predefiniowane formatowanie jest zapisane w pliku DotNetTypes.Format.ps1xml, w katalogu instalacyjnym WPS. • Stąd obiekty System.Diagnostics.Process są standardowo wypisywane w 8-miu kolumnach.
Dzielenie na strony • Można wymusić przy użyciu parametru –p apletu polecenia Out-Host. Get-Process | Format-List | Out-Host -p
Elementy danych wyjściowych • Polecenia formatujące pozwalają wybierać właściwości do wyświetlania: • Nazwy właściwości można skracać stosując symbol wieloznaczny *: Get-Process | Format-Table –p id, processname, workingset Get-Process | Format-Table –p id, proces*, work*
Wyprowadzanie pojedynczych wartości • Aby wyświetlić ciąg znaków lub wartość zmiennej wystarczy wpisać ciąg lub nazwę zmiennej w wierszu poleceń. • Można w tym celu użyć apletów poleceń: Write-Host, Write-Warn i Write-Error. • Dwa ostatnie generują tekst wyróżniony. • Aplet Write-Host pozwala definiować kolor tekstu: Write-Host ”HelloWorld” –foregroundcolor red -backgroundcolorgreen
Blokowanie wypisywania danych wyjściowych • Dopóki skrypt lub okno PowerShella mają dostęp do standardowego wyjścia, wszystkie dane wyjściowe są wypisywane. • Blokowanie jest możliwe na trzy sposoby: • Użycie apletu polecenia Out-Null na końcu potoku: • Zapisanie danych wyjściowych w zmiennej: • Konwersja danych wyjściowych na typ [void]: ps –p ”iexplore” | Out-Null procs = ps –p ”iexplore” | Kill [void] ( ps –p ”iexplore” | Kill )
Inne funkcje danych wyjściowych • Aplet polecenia Out-Printer wysyła dane do drukarki. • Aplet polecenia Out-File zapisuje dane do pliku. Get-Process | Out-Printer Get-Process | Out-Printer ”HP LaserJet PCL6 on E02” Get-Process | Out-File ”c:\temp\procesy.txt” Get-Process | Out-File ”c:\temp\procesy.txt” -Append
Interakcje z użytkownikiem • Tekstowe dane wejściowe można pobierać poleceniem Read-Host:
Okno InputBox • Proste okno dialogowe można wyświetlić funkcją InputBox(). • Funkcja jest zdefiniowana w klasie .NET Framework Microsoft.VisualBasic.Interaction. • Korzystanie z niej wymaga załadowania biblioteki Microsoft.VisualBasic.dll. [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") $input = [Microsoft.VisualBasic.Interaction]::InputBox("Login")
Okno uwierzytelniania • Wyświetlanie systemowego okna uwierzytelniania użytkownika umożliwia aplet polecenia Get-Credential. • Aplet zwraca obiekt System.Management.Automation.PSCredential. • Obiekt zawiera jawnie zapisaną nazwę użytkownika (właściwość UserName) oraz zakodowane hasło (właściwość Password)
Analiza zawartości potoku • Do tej pory najtrudniejsze było określenie: • Typu obiektów, które PowerShell umieszcza w potoku. • Określenie właściwości (zmiennych) oraz metod, które posiadają te obiekty. • Standardowy opis apletu nie zawsze zawiera odpowiedź: • W praktyce pomocne są dwa aplety poleceń: • Get-PipelineInfo • Get-Member Get-Help Get-Service -full
Get-PipelineInfo • Pozwala uzyskać trzy ważne informacje o zawartości potoku: • Liczba obiektów w potoku (obiekty są ponumerowane). • Typy obiektów w potoku (nazwy klas .NET). • Reprezentacje obiektów w postaci ciągów znakowych.
Reprezentacja znakowa • Standardowa reprezentacja znakowa obiektu, to wynik metody ToString() pakietu .NET. • Użyteczność wyniku działania metody zależy od badanej klasy: • W przypadku obiektów typu System.Diagnostics.Process jest to nazwa klasy i nazwa procesu. • Konwersja obiektów System.ServiceProcess.ServiceController zwracanych przez aplet Get-Service() jest bezużyteczna, gdyż wynik zawiera wyłącznie nazwę klasy.
Get-Member • Aplet polecenia Get-Member() (alias gm) pozwala wyświetlić nazwy klas obiektów w potoku oraz listy ich właściwości i metod. • Klasa .NET ma następujące elementy składowe: • metody (Method), • właściwości (Property), • zbiory właściwości (PropertySet), • właściwości dodatkowe (NoteProperty), • właściwości skryptowe (ScriptProperty), • właściwości programowe (CodeProperty), • właściwości aliasowe (AliasPropert). • Faktycznie tylko elementy Method i Property są składnikami klas .NET. Pozostałe to rozszerzenia dołączane przez WPS.
Metody • To powiązana z obiektem operacja. Przykład to metoda Kill() obiektu Process. • W wywołaniach metod nigdy nie można pominąć znaków (). Wywołanie bez nawiasów pozwala pobrać informacje o metodzie, ale nie powoduje jej wywołania. • Metody mogą odczytywać wartości danych, ustawiać je lub wykonywać inne czynności.
Właściwości • To element danych, który zawiera informacje o obiekcie lub pozwala przekazać do niego pewne dane. • Właściwościom towarzyszą zazwyczaj pary metod, np. get_MaxWorkingSet() i set_Max_workingSet() służące odpowiednio do odczytywania i modyfikowania właściwości. • Dostęp do danych można uzyskać na 2 sposoby: Get-Process | Where-Object { $_.name –eq ”iexplore” } | Foreach-Object { $_.MaxWorkingSet } Get-Process | Where-Object { $_.name –eq ”iexplore” } | Foreach-Object { $_.get_MaxWorkingSet() } • Podobnie zapis: Get-Process | Where-Object { $_.name –eq ”iexplore” } | Foreach-Object { $_.MaxWorkingSet = 1412344} Get-Process | Where-Object { $_.name –eq ”iexplore” } | Foreach-Object { $_.set_MaxWorkingSet(1412344) }
Właściwości • Zbiór właściwości – to forma ich grupowania. Np. psResources łączy w całość właściwości związane z wykorzystaniem zasobów. • Definicja w pliku types.ps1xml. • Zapisane w zbiorze dane można odczytać bez podawania poszczególnych właściwości: Get-Process | SelectObjectpsResources | Format-Table
Właściwości (2) • Właściwości dodatkowe – dodatkowe elementy, które nie są właściwościami .NET ale rozszerzeniami wprowadzonymi przez WPS. • Właściwość skryptowa – to właściwość, której wartość jest wyznaczana, a nie przechowywana w obiekcie. • Nie oznacza to jedynie obliczeń arytmetycznych. • Wyznaczenie może polegać na odczytaniu wartości podobiektu. • Nazwy produktu, do którego należy dany program nie ma w procesie (nie pokaże manager zadań). Jest zapisana w pliku programu. • .NET pozwala na dostęp do tej informacji za pośrednictwem MainModule.FileversionInfo.ProductName. Get-Process | Select-Objectname, Product Get-Process | Select-Objectname, Mainmodule.FileVersionInfo.ProductName
Właściwości (3) • Właściwość programowa – jest równoważna skryptowej, ale odpowiadający jej kod nie jest skryptem w języku WPS. Definicje te są zapisane w kodzie .NET. • Właściwość aliasowa – to skrócona nazwa innej właściwości. Nie wyznacza się wartości, a jedynie dokonuje translacji nazwy , np. z WS na WorkingSet. • Są zdefiniowane w pliku types.ps1xml. • Są rozszerzeniami wprowadzonymi na poziomie PowerShella.
Rozszerzony system typów ETS • WPS widzi wiele elementów składowych obiektów, które nie są zdefiniowane w innych klasach. Jednocześnie niektóre elementy dostępne w klasach .NET okazują się niedostępne. Odpowiada za to ExtendedType SystemPowerShella. • Ukrywanie elementów klas wynika z tego, że są one nie przydatne lub mają lepsze odpowiedniki zapewnione przez rozszerzenia. • Rozwiązanie techniczne polega na opakowaniu każdego obiektu umieszczanego przez aplet w potoku obiektem WPS typu PsObject. Implementacja tej klasy decyduje o dostępności dla następnych w potoku apletów i poleceń. • Ostatecznie zbiór elementów składowych obiektu określa się przy użyciu: • Dla niektórych klas zostały określone adaptery obiektów (ManagementObject, DirectoryEntry, DataRow). • Deklaracje w pliku types.ps1xml. • Operacje dodawania elementów składowych obiektów wykonane w trakcie pracy apletów poleceń. • Operacje dodawania elementów składowych obiektów wykonane przez aplet Add-Member.
Filtrowanie obiektów • Wynika z potrzeby wybrania do dalszego przetwarzania pewnego podzbioru obiektów, które wykonywany aplet przekazuje do potoku. • Kryterium selekcji może być warunek (np. obiekty o odpowiedniej nazwie) lub pozycja (np. pięć pierwszych). • Operację filtrowania w oparciu o warunek realizuje aplet polecenia Where-Object: • Do filtrowania w oparciu o kolejność służy aplet Select-Object w połączeniu z Sort-Object: Get-Process | Where-Object { $_.ws –gt 1048576 } Get-Process | Sort-Objectws –desc | Where-Object –last 5
Operatory logiczne Get-Process | Where-Object { $_.ws –gt 1048576 –and $_.name –eq ”firefox” } Get-Process | Where-Object { $_.DisplayName –match ”^\w* \w*$” }
Agregacja zawartości potoku • Obiekty w potoku mogą mieć różne typy. Przykładowo, polecenie Get-ChildItem wykonane na systemie plików, przekazuje do potoku obiekty FileInfo i DirectoryInfo. • Można też połączyć dwa polecenia, które wysyłają obiekty różnych typów do potoku: • Operacja taka ma sens tylko wtedy, gdy kolejne polecenia potoku są w stanie wykonać operacje na obiektach różnych typów. W innym przypadku typ pierwszego obiektu może warunkować sposób przetwarzania całego potoku. $( Get-Process ; Get-Service ) $( Get-Process i* ; Get-Service i* ) | Get-PipelineInfo
Przycinanie obiektów • Przekazywane obiekty często zawierają wiele niepotrzebnych elementów składowych. • Odpowiednie ich odfiltrowanie pozwala zmniejszyć wykorzystanie zasobów i zwiększyć przejrzystość danych wyjściowych. • Operację pozwala przeprowadzić aplet Select-Object: • Operacja przycięcia może mieć skutki uboczne: • Brak właściwej nazwy klasy. • Elementy składowe zostają przekształcone we właściwości dodatkowe. Get-Process | Select-ObjectProcessName, get_minWorkingSet, ws | Get-Member