středa 26. srpna 2009

Discussions with the Architect

Dnes ráno jsem si na Twitteru všiml zprávy o nové třídílné sérii na téma PowerShell. Podtitulek -Discussions with the Architect - dává tušit, že hostem je Jeffrey Snover.

Pokud vás téma zajímá, můžete se na videa podívat na následujících stránkách:

úterý 25. srpna 2009

Jak na Active Directory z PowerShellu

Pokud pracujete s Active Directory a chtěli byste se dozvědět více o skriptování AD pomocí PowerShellu, můžete využít akci firmy Quest Software. Kniha Managing Active Directory with Windows PowerShell: TFM® je nyní dostupná zdarma.

Stačí se zaregistrovat na stránkách Questu a kniha vám bude doručena až do schránky (emailové). Autorem knihy je Jeffrey Hicks, což myslím mluví za vše. Já mám knihu delší dobu z poslední podobné akce a i když se mi na ní ne všechno líbí, klady rozhodně převažují.

středa 19. srpna 2009

AD: Přidání uživatelů do skupiny

O práci s Active Directory jsem toho zde zatím moc nepsal. Vzhledem k tomu, že poslední dobou dělám malinko pořádek ve skupinách, příspěvky budou zřejmě častější. Za posledních pár dní jsem narazil na dvě věci, se kterými se můžete potkat.

První z nich je zjišťení FSMO rolí. Pokud s AD pracujete častěji určitě znáte příkaz netdom query fsmo. Stejné informace zjistíte pomocí následujících příkazů PowerShellu:
PS C:\> [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest() | fl *RoleOwner

SchemaRoleOwner : server1.domena.net
NamingRoleOwner : server1.domena.net

PS C:\> [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() | fl *RoleOwner

PdcRoleOwner : server2.sub.domena.net
RidRoleOwner : server2.sub.domena.net
InfrastructureRoleOwner : server2.sub.domena.net

Pro přehlednější výpis si můžete předchozí příkazy zabalit do funkce, ale to už je pouze otázka vkusu (a šetření času).
Druhou věcí, se kterou jsem se potkal, je kopie členů skupiny do jiné skupiny. Opět existuje několik cest, jak to udělat (např. pomocí ds* příkazů), ale v tuto chvíli vidím PowerShell jako lepší řešení. Já se ještě rozhodl zadání trochu upravit, taže výsledkem bylo: Vzít všechny členy skupiny users.all, vybrat pouze účty, které jsou enabled a přidat je do skupiny users.all.new.
Tři úkoly, tři cmdlety, dvě roury.
PS C:\> Get-QADGroupMember 'users.all' | Get-QADUser -Enabled | Add-QADGroupMember 'users.all.new'

Edit: Poté, co jsem se přepl na počítač s nejnovější verzi cmdletů od Questu zjistil jsem, že přidali nový parametr pro Get-QADUser. Správně by tedy mohlo být i toto (celá akce je pak o mnoho rychlejší - na mém počítači 12x):
PS C:\> Get-QADUser -MemberOf 'users.all' -Enabled | Add-QADGroupMember 'users.all.new'

Použité cmdlety nejsou standardní součástí PowerShellu, ale dají se zdarma stáhnout z webu firmy Quest Software.

neděle 9. srpna 2009

PowerShell in Practice - první pohled

Včera jsem si objednal další knihu o PowerShellu - PowerShell in Practice. Knihu vydá (vysvětlím vzápětí) nakladatelství Manning Publications

Budoucí čas jsem použil zcela záměrně, Manning nabízí možnost přístupu k jednotlivým kapitolám knihy ihned po jejich napsání. To přináší výhody jak pro nakladatele, tak pro čtenáře. Autor je v kontaktu se čtenáři a Ti mohou (ale není to pravidlo) ovlivnit obsah knihy (samozřejmě v určitých mezích). Manning tento program nazývá Manning Early Access Program (MEAP). 

Autorem knihy je Richard Siddaway - PowerShell MVP, zakladatel UK PowerShell User Group, blogger.

První varování - kniha není učebnicí PowerShellu! Obsahuje sice kapitoly PowerShell fundamentals a Learning PowerShell, ale na šedesáti stranách nemůžete očekávat zázraky. Jedná se opravdu o velice lehký úvod. V dalších dvou kapitolách je popsána práce s .NET, COM objekty WMI a také skriptování obecně.

Další kapitoly jsou již brány tématicky a věnují se například práci s uživatelskými účty, mailboxy (Exchange 2007), DNS, AD, IIS 7, SQL Server. Nedá mi to, abych knihu nesrovnával s Windows PowerShell Cookbook od Lee Holmese. V Cookbooku je schéma následující: otázka - odpověď. V PowerShell in Practice je dané téma a toto téma je zpracováno do kapitol. Jak už jsem řekl, vzhledem k rozsahu knihy není možné obsáhnout téma do hloubky.

Zatím jsem knihu jen tak prolétl, ale jsem z ní trochu rozpačitý. Na naučení základů PowerShellu jsou lepší jiné a pokud chcete zvládnout PowerShell pro konkrétní produkt, jsou zde popsány základy a na trhu existují i podrobnější knihy (např. pro AD nebo Exchange). na druhou stranu - já si knihu kupoval s tím, že se dozvím právě ty základy ovládání produktů, se kterými nepracuji a to kniha splňuje. Mimoto jsem měl kupón na slevu 37%, takže jsem za zhruba 300 Kč získal další relativně dobrý zdroj névých informací.

Ke knize se ještě vrátím až ji budu mít pročtenou podrobněji.

sobota 8. srpna 2009

Scripting Games 2009 - Event 3

Třetí úkol se jmenoval The shot put.

Divize Advanced
V zadaném vstupním souboru bylo potřeba najít slova (řádky), které obsahují pouze jednu samohlásku (mohla se opakovat), čili ananas je správně, ale ahoj nikoli.
  1. gc './Wordlist_ADV3.txt' |? {(($_.ToCharArray() -match '[aeiouy]'| group)|measure-object).count -eq 1} | out-file result.txt
Použil jsem one-liner, který provádí následující:
  1. načte vstupní soubor
  2. vstupní řádku převede na pole znaků ($_.ToCharArray()). Pokud je v poli znaků pouze jedna samohláska
  3. vypíše vstupní řádku do souboru
Ani v tomto případě se nejednalo o žádnou záludnost. Je dobré vědět, že řetězec znaků lze převést na pole znaků pomocí metody ToCharArray().

Divize Beginners
Vstupní soubor se měl rozdělit na dva a v každém novém souboru měl být jeden odstavec originálního souboru. Ten se měl poté přejmenovat.
  1. (gc s*)[0..4] | Out-File 'First par.txt'
  2. (gc s*)[6..8] | Out-File 'Second par.txt'
  3. ren 'shot put.txt' 'Shot put.old'
V tomto případě jsem nehodlal ztrácet čas a problém jsem vyřešil jako kdyby to bylo ve skutečnosti - bez nějakého ošetřování pomocí tupého kódu.

Získávání informací z WMI

V jednom z předchozích článků jsem slíbil, že se někdy podrobněji podíváme na přístup do WMI pomocí PowerShellu. Ta doba právě nastala :)
O WMI (Windows Management Instrumentation) jste jistě alespoň slyšeli. Pokud ne, určitě vám doporučuji se podívat, k čemu je WMI dobré - můžete začít na Wikipedii nebo na stránkách Microsoftu. Pro potřeby tohoto článku budu předpokládat, že máte alespoň základní představu o tom, k čemu WMI slouží.
Úkol pro všechny následující příklady bude stejný: zjistit všechny běžící procesy s názvem notepad.exe a vypsat jejich ProcessID. Na konci každého příkladu uvedu průměrný čas rychlosti zpracování pro 10 stejných dotazů.
Filtrování pomocí Where-Object
Zrějmě prvním nápadem bude použití standardních příkazů PowerShellu bez nějakého hlubšího zkoumání dalších okolností.
PS C:\> gwmi Win32_Process |? {$_.Name -eq 'notepad.exe'} | select ProcessId
ProcessId
---------
     2072
     5228
Tento postup je přímočarý a pokud potřebujete z WMI "tahat" data pouze příležitostně, bude vám zřejmě stačit. Pokud budete s WMI pracovat častěji (a budete zpracovávat větší množství dat) začne vám za chvíli vadit rychlost (resp. pomalost) zpracování dat. Nevýhodou tohoto přístupu je totiž to, že čtete z WMI všechny procesy a ty pak rourou posíláte cmdletu Where-Object (v mém příkladu zastoupeném jeho aliasem '?' - znak otazník).
Rychlost: 1535 ms
Parametr -Filter
Cmdlet Get-WmiObject má parametr -Filter. Použítím tohoto parametru filtrujete data již na úrovni WMI a dále pracujete pouze s procesy (objekty), které splňují zadané kritérium.
PS C:\> gwmi Win32_Process -filter "name='notepad.exe'" | select ProcessID

ProcessID
---------
     2072
     5228
Rychlost zpracování v tomto případě je 595 ms. Cmdlet Select-Object (resp. jeho alias select) je v tomto případě použit z toho důvodu, že filter nám vrací všechny vlastnosti a my jsme na začátku řekli, že budeme vypisovat pouze ID procesu.
Parametr -Query
Pokud ovládáte jazyk WQL (WMI Query Language) můžete pomocí něj specifikovat dotaz v parametru -Query. Celý příkaz by pak vypadal následovně:
PS C:\> gwmi -Query "SELECT ProcessID FROM Win32_Process WHERE Name='notepad.exe'"

__GENUS : 2
__CLASS : Win32_Process
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ProcessId : 2072

__GENUS : 2
__CLASS : Win32_Process
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ProcessId : 5228
PowerShell přidal do výpisu ještě několik vlastností, které nás momentálně nezajímají (začínají dvěma podtržítky). Pokud bychom je chtěli odstranit, můžeme opět použít cmdlet Select-Object. Rychlost zpracování byla 573 ms.
Shrnutí
Z předchozích příkladů je vidět, že pokud chcete pracovat s WMI je dobré si rozmyslet, jakým způsobem k němu budete přistupovat. Pokud občas potřebujete okamžitý výsledek z lokálního počítače (a vámi dotazovaná třída nemá tisíce členů), první postup vám možná bude vyhovovat. V případě většího množství dat (případně dotazů na vzdálený počítač) je dobré se naučit používat parametry -Filter nebo -Query.

čtvrtek 6. srpna 2009

Hej, mistře Šelíku!

V posledním vydání TechNet Flash zpravodaje zaujaly mistra Šelíka dvě věci.
  1. Strip jeho kamaráda mistra Skriptíka.
  2. První díl ze série článků o PowerShellu - snad se nám blýská na lepší časy.
Mistr Skriptík tentokrát řešil práci se službami, pojďme se podívat.

Vzhledem k tomu, že služby jsou jednou ze základních komponent, se kterou se administrátor Windows může potkat, má v sobě PowerShell zabudováno hned několik cmdletů pro práci s nimi.

PS C:\> Get-Help *-service | Select name
Name
----
Get-Service
Stop-Service
Start-Service
Suspend-Service
Resume-Service
Restart-Service
Set-Service
New-Service

My se podíváme na Get-Service, Stop-Service a Start-Service. Pro zjištění stavu všech služeb použijeme Get-Service - dostaneme výpis všech služeb včetně jejich aktuálního stavu (výpis jsem notně zkrátil).
PS C:\> Get-Service
Status Name
------ ----
Stopped ADAM_Test
Stopped Alerter
Running ALG
Stopped AppMgmt
Stopped aspnet_state
Running AudioSrv
Running BITS
Running Browser
Running CryptSvc
Running DcomLaunch
Running Dhcp
Running Eventlog
Running EventSystem
Running Spooler

Pro zastavení služby použijeme Stop-Service (spsv) a pro spuštění Start-Service (sasv). V závorkách jsou uvedeny aliasy pro dané cmdlety (pro Get-Service je to gsv).
PS C:\> gsv spooler

Status Name DisplayName
------ ---- -----------
Running Spooler Print Spooler
PS C:\> spsv spooler
PS C:\> gsv spooler

Status Name DisplayName
------ ---- -----------
Stopped Spooler Print Spooler
PS C:\> sasv spooler
PS C:\> gsv spooler

Status Name DisplayName
------ ---- -----------
Running Spooler Print Spooler

Je vidět, že pomocí PowerShellu je práce se službami přímočará a velice jednoduchá.
Pokud je někdo zvídavý a přecijen by chtěl pracovat se službami přes WMI, lze pro zastavení spooleru použít následující příkaz:
PS C:\> (gwmi Win32_Service -filter "name='spooler'").StopService()

__GENUS : 2
__CLASS : __PARAMETERS
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ReturnValue : 0

Vidíme, že ReturnValue je nula, čili služba byla zastavena úspěšně. Pokud by ReturnValue byla jiná, lze její význam najít na MSDN.
To by bylo pro dnešek vše. Jdu stejně jako mistr Skriptík vyhlížet Windows 7.
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.

sobota 1. srpna 2009

Hej, mistře Šelíku!

Po odmlce způsobené pracovní zátěží a poté zaslouženou dovolenou jsme se s mistrem Šelíkem vrátili zpět do práce.

Pro základní práci s procesy lze v PowerShellu použít cmdlet Get-Process (nebo můžete použít alias gps). Při prostém zadání bez parametrů vypíše seznam běžících procesů. Pokud vás zajímá konkrétní proces, stačí uvést jeho jméno.

PS C:\> Get-Process powershell
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
656 14 55592 63296 270 4,29 264 powershell

V případě, že chcete vypsat všechny informace, použijte Format-List
PS C:\> Get-Process powershell | Format-List *
V tomto případě bych se ovšem přikláněl k použítí aliasů

PS C:\> gps powershell | fl *
PS C:\> gps pow* | fl *

přičemž druhý zápis by mohl způsobit "problémy" pokud na vašem počítači poběží proces s názvem např. powercfg.

Jistě jste si všimli, že ve výpisu není nikde vidět vlastník procesu. Je tedy nutné - na radu mistra Skriptíka - použít přístup přes WMI. V PowerShellu je přístup do WMI geniálně jednoduchou záležitostí. Je několik možností, jak cmdlet Get-WmiObject použít. Nyní je nebudu porovnávat, ale beru to jako námět na další článek. Nebudu ani vypisovat výsledek, protože to vždy bude jméno uživatele, který proces spustil. Při práci z příkazové řádky vždy používám pro Get-WmiObject jeho alias gwmi - ušetřím tím přesně $("get-wmiobject".length - "gwmi".length) znaků :)

PS C:\> gwmi win32_process |? {$_.name -eq 'powershell.exe'} | % {$_.GetOwner().User}
PS C:\> (gwmi win32_process |? {$_.name -eq 'powershell.exe'}).GetOwner().User
PS C:\> (gwmi win32_process -filter "name='powershell.exe'").GetOwner().user
PS C:\> (gwmi -query "select * from Win32_Process where name='powershell.exe'").GetOwner().User

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.