neděle 31. ledna 2010

Get-PSNews |? {$_.Week –eq ‘04’}

Uplynulý týden byl opět nabitý zajímavý novinkami a také jedním velkým jubileem. Pro mne osobně se vše neslo v tónu Active Directory.

  • Můj oblíbený produkt – PowerGUI - se dočkal verze 2.0. Novinkou jsou snapshoty v administrační konzoli. Pokud vás zajímají další změny, můžete se podívat do release notes.
  • Začal jsem pracovat na dalším článku pro TechNet Flash, tentokrát na téma Active Directory. Proto se mi hodil další online meeting UKPSUG (UK PowerShell User Group), který se věnoval tématu Windows 2008 R2 AD cmdlets. Pokud již W2K8 R2 používáte, může se vám hodit Quick Reference Guide od Jonathana Medda.
  • Další témata meetingů UKPSUG jsou WMI & WQL (na ten se zvlášť těším) a Windows 7. Obojí z pohledu PowerShellu. Více na stránce Richarda Siddawaye.
  • A ještě jednou Richard – oznámil progres u jeho knihy PowerShell in Practice.
  • Další (velmi vítanou) novinkou je informace o další knize od Manning PublicationsPowerShell in Action, Second Edition. Prvních 15 kapitol je téměř hotovo a měly by být “circulated shortly”. Oproti původnímu plánu byly přidány tři nové kapitoly, takže zatím je celkem plánováno 19 kapitol a čtyři přílohy.
  • Třetí knihou v dnešním přehledu je PowerShell 2.0 TFM. E-book už je dostupný na stránkách Sapien Press. Pokud s PowerShellem začínáte, toto je dle mého názoru pro vás ta nejvhodnější kniha.
  • PowerShell Community Extensions jsou nyní ve fázi bety verze 2.0. Stahovat můžete přímo ze stránek PSCX.
  • Stejcz publikoval skript pro hledání překladu na slovnik.cz. Dost mě to potěšilo, protože jsme se o tomto skriptu před nějakou dobou bavili a já se u něho zasek :( Pokud chcete hledat překlady slov mezi angličtinou a češtinou, podívejte se na modul Translate.

Poslední příspěvek mne vedl z zamyšlení na téma “proč mám rád, když programátoři vytvářejí skripty”. Vzhledem k tomu, že mne ve škole programování nebavilo (dneska bych si kvůli tomu nejradši dal sám pár facek), doháním vše až nyní. Vím, že to je marná snha, ale čtení kódu po zkušenějším mne baví. Více v některém z dalších článků.

Doplnění: Pro samá písmenka jsem zapomněl zmínit to jubileum :( Můj oblíbený PowerScripting Podcast se dočkal epizody s pořadovým číslem 100! Gratuluji Halovi a Jonathanovi a děkuji jim za práci, kterou odvádějí. Jejich podcast byl pro mne impulsem, který mne nakopl v mém PowerShellovském bádání.

čtvrtek 28. ledna 2010

PSRemoteRegistry modul

[EN: Autotranslation]

Jak jsem již psal v posledních Get-PSNews, Shay Levy publikoval modul PSRemoteRegistry. Než se vrhneme na popis, podívejme se, jaké možnosti pro přístup do registru (lokálně či vzdáleně) máme nyní.

  1. Lokálně přes PSDrives: Get-PSDrive -PSProvider *Registry - asi nejčastější metoda, kterou budete používat z konzole nebo ve skriptech.
  2. Vzdáleně přes např. Invoke-Command, Enter-PSSession, ...
  3. Vzdáleně či lokálně přes WMI pomocí třídy StdRegProv. Obsahuje množství zajímavých metod, pokud jste v dobách VBS chtěli prohledat vzdálený registr, byla metoda EnumKey možná vaše první volba.
  4. Vzdáleně či lokálně před .NET třídy Microsoft.Win32.Registry*

Právě čtvrtý způsob využívá popisovaný modul, který zmiňované třídy zapouzdřuje do funkcí. Stáhnout si jej můžete z MSDN, kde je zároveň popsáno, jak jej správně importovat do PowerShellu. Seznam dostupných funkcí je vypsán na stránkách modulu, sami si jej můžete vylistovat pomocí Get-Command -Module PSRemoteRegistry. V tomto článku se můžete podívat na matici funkcí a dostupných parametrů. Součástí modulu je i tématická nápověda about_RemoteRegistry_Module.

Nejprve si ukážeme práci s lokálním počítačem a na konci článku uvedu, jak se lze dotazovat vzdálených počítačů. Otestujme, jestli existuje námi požadovaná větev.

PS C:\> Test-RegKey -Key "SOFTWARE\Makovec"
False



Neexistuje, takže ji vytvoříme

PS C:\> New-RegKey -Key SOFTWARE -Name Makovec
PS C:\> Test-RegKey -Key "SOFTWARE\Makovec"
True



Výborně, nyní si vytvoříme pár testovacích hodnot

PS C:\> 1..10 | % { Set-RegString -Key SOFTWARE\Makovec -Value "RegString$_" -Data $(Get-Random) -Force }



Všimněte si parametru -Force. Pokud jej neuvedete, budete vyzváni, abyste potvrdili zápis (bezpečnostní pojistka). Nyní si můžeme hodnoty zkontrolovat.

PS C:\> Get-RegKey -Key SOFTWARE -Name Makovec
ComputerName Hive Key SubKeyCount ValueCount
------------ ---- --- ----------- ----------
NETBOOK LocalMachine SOFTWARE\Makovec 0 10

PS C:\> Get-RegKey -Key SOFTWARE -Name Makovec | Get-RegValue
ComputerName Hive Key Value Data Type
------------ ---- --- ----- ---- ----
NETBOOK LocalMachine SOFTWARE\Makovec RegString1 1249268748 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString2 1967993881 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString3 1010703330 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString4 86413294 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString5 917742177 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString6 74280723 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString7 526159413 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString8 205545931 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString9 286790375 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString10 2007859651 String



Pojďme si ukázat příklad ze života. Potřebujeme zjistit, na jakém portu komunikuje náš SMS klient na jednotlivých počítačích.

PS C:\> 'PC1','PC2','PC3','PC4' | Get-RegValue -Key SOFTWARE\Microsoft\CCM -Value httpport | ft ComputerName, Value, Data -AutoSize

ComputerName Value Data
------------ ----- ----
PC1 HttpPort 1234
PC2 HttpPort 1111
PC3 HttpPort 1234
PC4 HttpPort 1234


Vidíme, že PC2 potřebuje nutně změnu. Pokud pustíte skript přes více počítačů ve vaší síti, může se stát (a určitě se stane), že některé počítače budou nedostupné a obdržíte chybovou zprávu: Get-RegValue : Exception calling "OpenRemoteBaseKey" with "2" argument(s): "The network path was not found. Pro tyto případy jsou všechny funkce z PSRemoteRegistry modulu vybaveny parametrem -Ping a pokud jej použijete dostanete jasnou zprávu, kde se stala chyba.

PS C:\> 'PC1','PC2','PC3','PC4' | Get-RegValue -Key SOFTWARE\Microsoft\CCM -Value httpport -Ping | ft ComputerName, Value, Data -AutoSize

WARNING: [PC2] doesn't respond to ping.
WARNING: [PC3] doesn't respond to ping.
ComputerName Value Data
------------ ----- ----
PC1 HttpPort 1234
PC4 HttpPort 1234


Do připravovaného článku pro TechNet Flash jsem přidal ukázku, jak použít předchozí příklad na všechny počítače ve vaší doméně. Abych nezapomněl, měli bychom po sobě uklidit.

PS C:\> Remove-RegKey -Key SOFTWARE\Makovec -Force


Musím přiznat, že PSRemoteRegistry jsem okamžitě přidal do svého profilu a za těch pár dní, co jej používám se stal nenahraditelným pomocníkem. Pokud budete někdy potřebovat přistupovat ke vzdáleným registrům, tento modul je pro vás prostě must have.

Uložení záložek z IE7

[EN: Autotranslation]

Poslední dobou se na konci každého pracovního dne probírám otevřenými záložkami v Internet Exploreru a říkám si, kdy to asi budu číst. Většinou přes den otvírám všechno, co mi přijde zajímavé (což jsou pro mne na Twitteru všechny zprávy o PowerShellu :) a pak nestíhám všechno přes den číst. Proto jsem začal používat Evernote a nepřečtené stránky si synchronizuji, abych si je přečetl večer doma. Jelikož jsem vždy ručně kopíroval všechny adresy, nebylo to zrovna pohodlné a rychlé. Rozhodl jsem se, že si tedy udělám skript, který mi všechny otevřené stránky do Evernote klienta nahraje.

Nejprve jsem si myslel, že budu každou instanci IE spouštět z PowerShellu a na konci dne prostě projdu všechny záložky. Což jsem samozřejmě zavrhl okamžitě (vzhledem k množství oken otevíraných externími aplikacemi). Začal jsem brouzdat a objevil příspěvek na Stack Overflow. Celé řešení využívalo COM Shell.Application, který jsem následně využil.

Nejprve jsem jako součást skriptu přidal i možnost exportu do Evernote. Pak jsem ale podlehl (správné :) myšlence na modularitu a pro export vytvořil novou funkci Export-Evernote. Tak můžu v rouře volat libovolný cmdlet a výsledky si číst doma.

Celá funkce tedy vypadá následovně:

function Export-IETabName {

$(
New-Object -Com 'Shell.Application').Windows() |
? {
$_.Name -eq 'Windows Internet Explorer' } |
? {
$_.LocationURL -notlike 'https://remedy*' } |
Select LocationName, LocationURL

}
# function Export-IETabName

Ze všech objektů, které vrátí metoda Windows(), vyberu instance Internet Exploreru, vyfiltruji záložky obsahující stránky, které doma číst nechci (zde Remedy) a dále posílám pouze jméno stránky a její adresu. Před odchodem, tedy mohu použít následující kód

PS C:\> Export-IETabName | Export-Evernote -Sync


a poté mohu s klidem vypnout počítač a odejít.

neděle 24. ledna 2010

Get-PSNews |? {$_.Week –eq '03'}

Uplynulý týden se nesl ve znamení následujících událostí

Posledních několik týdnů se také mluví o větší popularizaci PowerShellu mezi (hlavně) administrátory. Nejvíce je nyní v této souvislosti asi slyšet Jeff Hicks (samozřejmě ale není jediný), který byl hostem v dnes již jednou zmiňovaném podcastu Mind of Root. Poté napsal i krátký příspěvek v jeho blogu. Proto bych chtěl dnešní noviky opět ukončit několika otázkami a budu moc rád, pokud mi na ně odpovíte (klidně se rozepište více :)). Mé odpovědi najdete v komentářích.

  1. Jak dlouho s PowerShellem pracujete?
  2. Pro jaké úkoly PowerShell používáte?
  3. Snažíte se propagovat PowerShell ve vaší práci a nebo si jej radši necháváte pro sebe, abyste měli náskok před kolegy.

neděle 17. ledna 2010

Get-PSNews |? {$_.Week -eq '02'}

Tak jsem tady s druhými letošními novinkami. Tentokrát jich nebude tolik jako před týdnem, ale zato je mezi nimi jedna bomba (tedy alespoň pro mě). Hodně se dnes budeme motat v rouře :)

pondělí 11. ledna 2010

Hrátky s parametry

[EN: Autotranslation]

Dnes jsem si hrál s modulem PSRemoteRegistry od Shaye Levyho. Testoval jsem různé parametry a napadlo mě, vypsat si tabulku, kde v řádkách budou vylistované funkce a ve sloupcích jednotlivé parametry. Vznikl mi následující výtvor:



Poté mě napadlo udělat malou statistiku pro standardní cmdlety. Nevím, jestli je to užitečné, ale já jsem se při tvorbě skriptu i výsledků dobře bavil :)

  • Počet cmdletů v modulech Microsoft.*: 236
  • Počet parametrů použitých v těchto cmdletech: 449
  • Počet kombinací cmdlet/parametr: 3491
  • Parametry, které jsou dostupné pro každý cmdlet: Zde určitě nikoho nepřekvapí (pokud ano, Get-Help about_CommonParameters je váš přítel pro následujících 10 minut :), že jsou to takzvané Common Parameters: Verbose, Debug, WarningAction, WarningVariable, ErrorAction, ErrorVariable, OutVariable, OutBuffer. Vyskytují se - ano, hádáte správně - 236x.
  • Další v pořadí jsou: Confirm, WhatIf (85), Force (68), Name (67), InputObject, Credential (54), Path (52). Ostatní parametry se vyskytují méně než 50x.
  • Parametrů, které se vyskytují pouze u jednoho cmdletu je 270.
  • Cmdlet s největším počtem parametrů: New-ModuleManifest (38)
  • Další v pořadí: Invoke-Command (28), New-PSSessionOption (28), Get-WSManInstance (28), Get-WmiObject (26), Set-WmiInstance, Invoke-WmiMethod (25).
  • Nejméně parametrů: Get-Culture, Get-Transaction, Get-Host, Get-PSCallStack, Get-UICulture, Exit-PSSession, Stop-Transcript, Get-WSManCredSSP (8).
Určitě bych mohl pokračovat dále, ale myslím, že tohle pro přehled stačí. Pokud chcete dělat vlastní výzkumy, zde je kód:




  1. function Get-CommandParameter {   

  2.   

  3.     param (   

  4.         [Parameter(   

  5.             ValueFromPipeline=$true,   

  6.             ValueFromPipelineByPropertyName=$true  

  7.         )]         

  8.         [string[]]$Name=""  

  9.     )   

  10.        

  11.     PROCESS {   

  12.            

  13.         foreach ($c in $Name) {   

  14.   

  15.             # receive all parameters   

  16.             $cParams = (Get-Command $c).Parameters.Keys   

  17.                

  18.             # process every parameter and create object   

  19.             foreach ($p in $cParams) {   

  20.            

  21.                 $psObj = New-Object PSObject -Property @{   

  22.                     Command=$c  

  23.                     Parameter=$p  

  24.                 } # psObj        

  25.                    

  26.                 $psObj         

  27.             } # foreach $p   

  28.         } # foreach $c     

  29.     } # PROCESS   

  30. # function Get-CommandParameter  


Použití je poté následující:
PS C:\> $a = Get-Command -CommandType cmdlet Get-CommandParameter
PS C:\> $a.Count
3491

neděle 10. ledna 2010

Get-PSNews |? {$_.Week -eq '01'}

V minulém článku jsem uvedl špatné číslo týdne. Po konzultaci s kalendářem jsem zjistil, že první týden nového roku je ten uplynulý. Zároveň jsem se rozhodl zkrátit název článku a z dlouhého textu jsem vypustil Write-Host (které bych asi stejně změnil na Write-Output) i vlastnost CreationTime. Nyní je název kratší a číslo týdne je viditelné na první pohled. Co nám tedy první týden nového roku přichystal na poli PowerShellu:

sobota 9. ledna 2010

Hej, mistře Šelíku!

Mistr Skriptík se doslechl, že PowerShell je nyní ve verzi 2 a zajímalo ho, jestli by mistr Šelík neměl nějaký tip na vypnutí vzdáleného počítače bez použití WMI.



Brutalita a přímočarost Šelíkova řešení je odporná:

PS C:\Stop-Computer netbook

Vzdálený počítač se vypne a do logu se zapíše následující informace:

PS C:\Get-EventLog -LogName System -ComputerName netbook -Source user32 -Newest 1

EntryType : Information
Source : USER32
Message : The process winlogon.exe has initiated the restart of NETBOOK for the following reason: No title for this reason could be found
Minor Reason: 0xff
Shutdown Type: shutdown
Comment:

V PowerShellu v2 byly přidání cmdlety pro práci se vzdáleným počítačem, protože vypnutí (ale hlavně restart) vzdáleného počítače je jeden ze základních administrátorských úkonů. Jsou dostupné následující cmdlety:
  • Add-Computer a Remove-Computer pro přidávání/odebírání počítače z/do domény nebo pracovní skupiny.
  • Checkpoint-Computer a Restore-Computer pro práci se System restore.
  • Restart-Computer a Stop-Computer pro vzdálený restart nebo vypnutí počítače.

Banner mistra Skriptíka je stažen ze stránek TechNet Flash zpravodaje. Děkuji týmu TechNetu za možnost jeho použití pro potřeby tohoto článku.

čtvrtek 7. ledna 2010

Recenze: Windows PowerShell 2.0 Best Practices

K Vánocům jsem si pořídil novou knihu o PowerShellu – Best Practices. Autorem je Ed Wilson AKA Scripting Guy. Rozhodně se nejedná o žádnou brožuru do kapsy (narozdíl od například PowerShell Administrator’s Pocket Consultant), má 752 stran a váží víc než můj netbook.

Kniha je rozčleněna do pěti částí (17. kapitol + 6 příloh) a obsahuje CD, na kterém jsou popisované skripty a několik dalších informací. Kniha není určena pro začátečníky. Předpokládá, že znáte základy a ve skriptech nevysvětluje použité konstrukce. Na druhou stranu – pokud jste alespoň o trochu chápavější než dlažební kostka, nebudete mít většinou s pochopením problém a chybějící informaci si dohledáte například v nápovědě.

Na stránkách Microsoft Press si můžete přečíst, jak je kniha členěna (anglicky).

Část 1. – Úvod

Tato část je rozdělena do čtyř kapitol. První dvě se věnují opravdu základům PowerShellu. Novým cmdletům (práce s WMI, *-Computer, …), případně novým parametrům starých cmdletů (např. parametr -ComputerName). Další dvě kapitoly se věnují (pro mne překvapivě) práci s Active Directory včetně ukázky práce s databází nebo Excelem (pro účely importu dat). Pro všechny příklady jsou bohužel použity akcelerátory [ADSI] a [ADSiSearcher] a není zde zmínka od AD cmdletech. Chápu, že ne všichni mají doménu s Windows 2008 R2 serverem, ale osobně bych tyto dvě zmiňované kapitoly oželel. V této části se objevuje i další neduh – osobně nepotřebuji výpisy na tři strany, které dostanu na konzoli jednoduchým příkazem, např. Get-WmiObject Win32_Process | Get-Member.

Část 2. – Plánování

Zde začínám opět výtkou. V knize nazvané Best Practices bych nečekal použití RegRead. Proč??? Pokud lidem ukážeme, že mohou v PowerShellu “používat syntaxi z VBS”, těžko pak budou hledat důvod pro přechod. V prvním příkladu této kapitoly je krásně ukázán největší neduh knihy – opět se vracím k VBS – PowerShell skript s VBS syntaxí. Uvedu jej celý:

$path = "HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine"
$psv = Get-ItemProperty -Path $path
$psv.RunTimeVersion

Chápal bych tento příklad v kontextu vysvětlení, že jej lze napsat lépe (i bez ztráty čitelnosti), například takto:

Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine" -Name RunTimeVersion

nebo po prostudování nápovědy takto:

Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine" RunTimeVersion

a pokud chcete opravdu jen číslo verze, není problém použít následující kód:

(Get-ItemProperty -path HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine).RunTimeVersion

Zbytek kapitoly se věnuje zjišťování verzí .NETu nebo operačního systému. V další kapitole se mluví a profilech, vytváření funkcí, proměnných, PSDrives (mimochodem tomuto tématu se věnuji v dalším díle seriálu pro TechNet Flash). Další kapitola ukazuje WMI, registry (konečně je zde ukázáno “správné” řešení příkladu z první kapitoly, ale s poznámkou, že řešení je matoucí – nechápu!) Na konci kapitoly je letmo zmíněna .NET třída System.Math a zbytek kapitoly okupuje opět COM (příklad tvorby CAB souboru).

V poslední kapitole je ukázán cmdlet Invoke-Command a poté opět Active Directory. [ADSISearcher], ds* příkazy (proč?) a konečně zmínka a AD cmdletech (ukázán je ovšem pouze jediný). Konec kapitoly je věnován benefitům skriptů.

Část 3. – Design

V návrhu funkcí jsou probírány například vstupní parametry nebo filtry a poté navazuje kapitola o tvobě nápovědy, včetně třinácti pravidel pro psaní efektivních komentářů. V následující kapitole jsou probrány moduly a také tvorba nápovědy pro funkce (?). V další kapitole je ukázána práce se vstupem a výstupem a popsány novinky v PowerShellu v2 z hlediska advanced functions. Ukázána je dále práce s heslem (uložení do souboru, registru, …) a výstupy (soubor, obrazovka). Poslední kapitola se věnuje ošetřování chyb ve skriptech. Osobně bych očekával větší ukázku použití konstrukce try-catch-finally.

Část 4. Testování a nasazení

Popisuje testování z různých pohledů, jako například rychlost nebo komplexnost. Dále jsou popsány parametry Debug a WhatIf. V části nazvané spouštění skriptů je ukázáno jak změnit ExecutionPolicy nebo pracovat s číslování verzí. Vyloženě výsměchem je část nazvaná Understanding Code Signing – na jedné straně se dozvíte, že existuje cmdlet Set-AuthenticodeSignature, ale o jeho použití se nedozvíte vůbec nic (zato jsou ukázány dva screenshoty).

Část 5. – Optimalizace

Tato část je rozdělena na dvě kapitoly. V první je ukazováno logování do souboru, event logu a registru. Poslední kapitola se věnuje debugování pomocí Set-PSDebug a cmdletů *-PSBreakpoint.

Přílohy

Obsahují kapitoly: Seznam cmdletů, Common Verbs, Useful COM Objects, Useful WMI Classes, Useful .NET Classes, WMI Error Messages.

Shrnutí mých dojmů

Z prědchozích řádek je asi jasné jaký bude můj závěr. Musím říct, že kniha mě zklamala. Měl bych dvě hlavní výtky: 1) Knihou prostupuje stín VB Scriptu 2) Obsah mi přijde řazený značně chaoticky – některá témata jsou ukázána na různých místech a pokud si chcete přečíst informace (např. o AD), najdete je “rozházené” po knize. Na to množství stran, si myslím, že užitečných informací je v knize žalostně málo. Pokud čtete help a sledujete blogy, moc nového si neodnesete. Rozhodně se nejedná o žádné Best Practices. Na druhou stranu, každá propagace PowerShellu je dobrá a pokud tato kniha přítáhne k PowerShellu víc lidí, bude to jen dobře. Dobrým počinem knihy jsou i vložené "Inside Track" od lidí jako např. Jeffrey Snover, Brandon Shell a další.

Za oficiální cenu 60 dolarů (38 na Amazonu) si nemyslím, že je tato kniha rozumnou investicí. Rozhodně bych spíše doporučil počkat do konce ledna na Windows PowerShell 2.0: TFM od Sapien Press ($35 za ebook nebo $42 za tištěnou knihu).

neděle 3. ledna 2010

Get-PSNews |? {$_.CreationTime -lt "7days"}; Write-Host "Týden 1"

Se začátkem nového roku bych se rád vrátil s novinkami ze světa PowerShellu. Vždy bych chtěl shrnout, co se stalo v uplynulém týdnu ve světě tohoto skvělého skriptovacího jazyku. Prozatím nás čekají novinky pouze za tři dny a tudíž bude dnešek hodně krátký.

Pro dnešek by to bylo vše a přeju vám všem v tomto roce hodně pěkných zážitků s PowerShellem (ale i ve světě mimo něj).