Seriál: Windows Powershell – úvod (část 1.)

Seriál: Windows Powershell – úvod (část 1.)

  • Comments 3
  • Likes

1 PowerShell

PowerShell je skriptovací jazyk a shell od Microsoftu. Z předchozí věty jsem záměrně vypustil slovo nový, protože první verze byla vydána již v roce 2006. Verze 2 je v současné době ve stadiu CTP3 (Community Technology Preview) a její finální uvedení je plánováno současně s vydáním Windows 7.

Tato série si klade za cíl seznámit vás s PowerShellem od úplných základů až po složitější konstrukce. Nemá být (ani b��t nemůže) vyčerpávajícím zdrojem. Pokud se budete chtít PowerShell naučit, budete muset pokračovat dále, např. studiem nápovědy, která je až překvapivě dobrá a užitečná. Začněme instalací.

1.1 Instalace

PowerShell je součástí posledních verzí operačních systémů, tedy Windows 7 a Windows 2008 R2. Ve Windows 2008 je dostupný jako volitelný doplněk a můžete jej doinstalovat přes Server Manager. Pokud jej budete chtít použít ve Windows Vista, XP a 2003 Server, musíte si jej doinstalovat jako samostatné KB. Pro nižší verze není PowerShell dostupný. V současné době je možno PowerShell doinstalovat i přes Windows Update (nebo WSUS).

Před instalací PowerShellu se ujistěte, že máte nainstalován .NET Framework minimálně ve verzi 2.0. Výše zmiňované KB pak nainstalujete klasickým next, next, next způsobem. Po instalaci naleznete v nabídce Start složku Windows PowerShell 1.0 a v ní modrou ikonu, kterou si určitě zamilujete J

1.2 První krůčky

Po spuštění uvidíte následující modrou obrazovku – tato modrá (#012456) je dobrá.

clip_image002

Figure 1: Okno PowerShellu

Zkusme si ukázat první obligátní kus kódu – známý Hello World! V PowerShellu jej zapíšete následujícím jednoduchým příkazem:

PS C:\> “Hello World!”

PowerShell vezme váš vstup a text opíše na výstupu. Mimochodem, pěkný přehled Hello World programů můžete najít na Wikipedii. Pojďme si ukázat několik užitečnějších příkazů, např. pro zobrazení aktuálního data a času

PS C:\> Get-Date

3. června 2009 22:00:32

pracovního adresáře

PS C:\> Get-Location

Path
----
C:\

nebo zjištění nastavení jazykového prostředí ve Windows.

PS C:\> Get-Culture

LCID Name DisplayName
---- ---- -----------
1029 cs-CZ Czech (Czech Republic)

Chtěli byste například zpracovat v PowerShellu výsledky z vyhledávače Bing?

PS C:\> Get-BingWeb 'technet powershell site:cz' | Format-Table Url

Url
---
http://www.logon.cz/?p=129
http://www.wug.cz/Default.aspx?tabid=53&EntryID=75
http://www.logon.cz/?tag=powershell
http://www.wug.cz/Default.aspx?tabid=58&mid=500&ctl=Detail&ItemID=208&VisibleDate=1.12.2008
http://blog.vyvojar.cz/dotnet/archive/2006/11/30/138593.aspx
http://www.wug.cz/Default.aspx?tabid=53&EntryID=106
http://www.wug.cz/Aktuality/tabid/36/ctl/Detail/mid/492/ItemId/270/language/cs-CZ/Default.aspx
http://www.logon.cz/?p=230
http://www.wug.cz/Default.aspx?tabid=58&mid=500&ctl=Detail&ItemID=144&VisibleDate=9.5.2008
http://www.cs.vsb.cz/navrat/vyuka/sps/prednasky/pred10b.pdf

Příkaz vyhledá text „TechNet Powershell“ v českých doménách a pomocí Format-Table vypíše adresy prvních deseti odkazů, které nalezne. Get-BingWeb není standardním příkazem PowerShellu, ale je na něm ukázána jedna ze silných stránek PowerShellu – komunita. Již druhý den po ohlášení nového vyhledávače vytvořil Joe Pruitt knihovnu funkcí pro práci s bingem (PoshBing) a uvolnil ji pro veřejné použití. Pokud ji chcete také vyzkoušet, je ke stažení na CodePlexu.

1.3 Základní pojmy

Než se pustíme do podrobnějšího přehledu, řekneme si něco o terminologii v PowerShellu. Jedná se o základní poučky, které vám umožní začít PowerShell efektivněji a rychleji používat.

1.3.1 Cmdlet

Je základním příkazem PowerShellu. Vyslovuje se jako command-let. Ve verzi 1 je jich v PowerShellu 129. V příkladech výše jsme si ukázali cmdlety Get-Date, Get-Location a Get-Culture.

1.3.2 Jmenná konvence

V předchozím bodě jsme si ukázali tři cmdlety. Nezdá se vám na jejich jméně něco zajímavého? Pokud vám přijde zajímavá konvence Get-<něco>, jste na správné stopě. Vývojový tým PowerShellu zavedl jmennou konvenci, která je v angličtině vyjádřena jako Verb-Noun, čili v češtině Sloveso-PodstatnéJméno. Zároveň se snaží (a dle mých zkušeností úspěšně) tuto konvenci prosadit. V současné době existuje malá skupina sloves pro cmdlety a je v hojné míře používána. Více se můžete dozvědět přímo v blogu vývojového týmu PowerShellu.

Seznam sloves ve verzi 1 je následující:

ps_group

Pro podstatné jméno platí pravidlo, že musí být v jednotném čísle. Proto existuje cmdlet Get-QADUser a nikoli Get-QADUsers.

Velkou výhodou této snahy je možnost „odhadnout“ jméno cmdletu, který právě potřebujete. Z příkladů je to víceméně jasné: chcete-li zjistit aktuální datum, použijte Get-Date; chcete-li datum nastavit, použijte Set-Date.

Na základě předchozích řádek asi dokážete dát dohromady příkaz, kterým zjistíte běžící procesy – je to Get-Process.

1.4 Bezpečnost

Řekněme si ještě něco krátce k bezpečnosti PowerShellu. Microsoft se poučil z hrozeb, které ohrožovaly počítače pomocí skriptů ve VBS a jedním z kroků je, že skripty v PowerShellu (přípona PS1) jsou po nainstalování asociovány s poznámkovým blokem. Tím odpadá „náhodné“ spuštění destruktivního kódu pouhým dvojklikem.

Několik dalších bezpečnostních prvků si ukážeme na příkladu. Zkuste vytvořit textový soubor, který bude obsahovat pouze jednu řádku textu, na které bude zapsán cmdlet Get-Date. Uložte tento soubor jako skript.ps1. Spusťte PowerShell a přejděte v něm do adresáře s vytvořeným skriptem. Pro pohyb použijte příkaz cd, známý z cmd.exe. Následujícím příkazem zkuste skript spustit:

PS C:\Temp\PS> skript.ps1

The term 'skript.ps1' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.

At line:1 char:10

+ skript.ps1 <<<<

Narazili jste na další „bezpečnostní překážku“ – PowerShell vám neumožní spustit skripty z aktuálního adresáře, pokud napíšete pouze jejich jméno. Příkaz musíte napsat následujícím způsobem:

PS C:\Temp\PS> ./skript.ps1

File C:\Temp\PS\script.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.

At line:1 char:2

+ & <<<< "C:\Temp\PS\script.ps1"

Skript se vám opět nespustil, ale chybové hlášení je jiné. Dalším krokem k zabezpečení počítače jsou bezpečnostní politiky (v angličtině Execution policies), které hlídají, zda jsou spouštěné skripty digitálně podepsány. Po nainstalování je nastavena politika Restricted. V tomto módu je umožněno zapisování příkazů přímo v okně PowerShellu, ale pokud chcete spustit skript, PowerShell vám v tom zabrání a zobrazí chybu.

Bezpečnostní politiky jsou celkem čtyři: Restricted, AllSigned, RemoteSigned, Unrestricted. Pokud ji chcete změnit, použijte příkaz Set-ExecutionPolicy a jako parametr použijte jméno jedné ze jmenovaných politik.

Set-ExecutionPolicy RemoteSigned

zajistí, že skripty stažené z internetu nebo doručené mailem budou spuštěny, ale pouze pokud jsou podepsány důvěryhodným certifikátem. Nyní už bez problému spustíte skript, který jste vytvořili.

PS C:\Temp\PS> ./skript.ps1

3. června 2009 23:31:26

Pokud se chcete o politikách dozvědět více, zkuste v PowerShellu spustit příkaz

Get-Help about_signing

Je vidět, že Microsoft se poučil z minulosti a již od začátku navrhl PowerShell i s ohledem na bezpečnost. Poslední krok je ale samozřejmě vždy na uživateli. Pokud změníte bezpečnostní politiku na Unrestricted, není chybou PowerShellu, že spustíte skript z neznámého zdroje a poškodíte svůj počítač, či celou síť.

Doporučení: Nechte na svých počítačích politiku nastavenou alespoň na RemoteSigned, vyhnete se tak mnoha případným problémům.

1.5 Nápověda

Velmi silnou stránkou PowerShellu je jeho nápověda. Již při instalaci se nainstalují tři zajímavé dokumenty: User Guide, Getting Started a Quick Reference. Dohromady se jedná asi o 150 stran doporučeníhodného čtení.

Další možností je nápověda vestavěná přímo uvnitř shellu, dostupná je pomocí příkazu Get-Help. Jako administrátoři máte možná snahu nápovědu zatracovat, podceňovat či vůbec tak nějak nenávidět. V tomto případě by to byla chyba. Nápověda je zpracována velice dobře a už se mnohokrát osvědčila.

ps_list  
Toto je základní výpis informace o vybraném cmdletu. Všimněte si posledních dvou řádek a jejich doporučení. Nejpodrobnější informace získáte pomocí přepínače –Full. Součástí nápovědy ke každému cmdletu je ukázka příkladů použití. Pokud použijete přepínače –Full nebo –Detailed, budou příklady zobrazeny na konci výpisu. Pokud chcete pouze výpis příkladů, použijte přepínač –Examples.

Get-Help Get-Date –Examples

V PowerShellu existuje ještě jeden typ nápovědy – tematická. Každé z témat popisuje použití některých částí PowerShellu, např. aritmetické operace, regulární výrazy, aliasy, atd. Seznam všech témat je zobrazen níže.

ps_list3

Dnes jsme si ukázali některé základní vlastnosti PowerShellu. Příště si povíme o objektech, rouře a provázanosti PowerShellu s .NET Frameworkem. Těšte se…


- David Moravec

Další díly seriálu:
Seriál: Windows Powershell – PS pro programátory (část 6.)
Seriál: Windows Powershell - souborový systém a registry (část 5.)
Seriál: Windows Powershell – dolujeme data aneb jak na WMI (část 4.)
Seriál: Windows Powershell – roury a aliasy (část 3.)
Seriál: Windows Powershell – objekty a roury (část 2.)

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment
  • Len drobne upresnenie k naming convention.  Naming convention je v skutocnosti Module\Verb-Noun, ale pre zjednodusenie sa namespace module automaticky...

    Doteraz to platilo len pre cmdlety. Ako priklad, nasledujuce dva prikazy su uplne identicke:

    Get-ChildItem

    Microsoft.PowerShell.Management\Get-ChildItem

    Od Powershell v2 uz Module\ plati aj pre skripty (resp. moduly .psm1). T.j. ak si vytvorim subor AD.psm1, kde si ukladam vsetky funkcie pre manipulaciu s AD, mozem pouzivat funkciu AD\Get-User (namiesto Get-ADUser).

    V dnesnej dobe sa to zvykne obchadzat tym, ze funkcie maju modul primo v nazve:

    Function AD\Get-User {...}

    Ked sa zmeni koncovka z .ps1 na .psm1, staci len odstranit AD\ prefix.

    Detaily je mozne najst napriklad tu: http://martinzugec.blogspot.com/2009/03/powershell-naming-convention.html

    Oficialna naming convention sa tyka nielen Verb-Noun, ale zaroven aj argumentov a podobne. Velmi uzitocny a bohuzial malo znamy je dokument od Microsoftu (Microsoft Command Line Standard):

    http://www.microsoft.com/technet/scriptcenter/topics/winpsh/cmdline_std.mspx

    K security, v Posh V2 je obrovska zmena - kto niekedy skriptoval napriklad SCCM (ktory bezi pod Local System), tak ju urcite doceni ;) Pre execution policy je mozne nastavit novy prepinac -Bypass, ktory je benevolentnejsi nez -Unrestricted, pretoze vobec neriesi IE zony a umoznuje jednoducho spustat skripty z UNC cesty (jedna z najvacsich nevyhod Posh V1).

    Martin

  • Mimochodem,

    finalni seznam schvalenych sloves je dostupny na http://blogs.msdn.com/powershell/archive/2009/07/15/final-approved-verb-list-for-windows-powershell-2-0.aspx

    Coz vedlo k nekolika vtipkum vzhledem k tomu, ze obsahuje napriklad "slovesa" ConvertFrom a ConvertTo.

    David

  • Interne bol okolo toho celkom boj - specialne okolo "Invoke-", ktore sa nikde mimo vyvojarov nepouziva ;)