Seriál: Windows PowerShell – PS a Active Directory (část 7.)

Dnes podíváme na oblast, která možná zajímá většinu z vás – administraci Active Directory pomocí PowerShelu.

1.1 Možnosti

Nejprve se podívejme, jaké možnosti máme. Jako první můžeme spustit následující příkaz

PS C:\> admgmt.msc

OK, beru zpět, tuto metodu asi nemůžeme považovat za úplně PowerShell-like. Použitím některé z následujících technik už jsme na tom ale v konzoli PowerShellu lépe.

Já budu většinu příkladů ukazovat na cmdletech od firmy Quest. Mám k tomu dva hlavní důvody.

  1. Přístup přes ADSI mi přijde moc VBS-like. Nutno říci, že to není špatná cesta – pro některé z vás možná ta jediná použitelná (pokud mate například zakázáno instalovat nástroje třetích stran), nicméně na ADSI bylo v minulosti opravdu tolik příkladů, že by to bylo nošením dříví do lesa (krátkému srovnání se ale stejně budu věnovat). Pokud vás přístup přes ADSI bude zajímat, podívejte se na konec článku, kde uvádím odkaz na jednu moc zajímavou knihu.
  2. Nativní cmdlety (pro Windows 2008 R2) nejsou ještě tolik rozšířené. Přecijen R2 server tu s námi není tak dlouho a i když rozhodně předpokládám v budoucnu opravdu široké použití, zatím to prostě není ono.

1.2 Základní práce s AD

Typickým použitím PowerShellu při přístupu do AD je dotazovaní na uživatele, skupiny, členství ve skupinách, atd. Oproti AD konzoli máme výhodu v tom, že v konzoli množství dotazů ani nejsme schopni (při rozumném čase a úsilí) splnit. Zkuste například spočítat (a následně zobrazit v koláčovém grafu) množství lidí v konkrétních odděleních (organizačních jednotkách). Bez použití PowerShellu (nebo nástrojů třetích stran) máte práci asi tak na hodinu, s PowerShellem vyřešíte tento úkol za pět minut a zbytek oné hodiny se můžete koukat na slidy z poslední TechNet konference.

Poznámka: Cmdlety od firmy Quest jsou dostupné volně ke stažení. Nainstalujte je klasickým způsobem a poté je přidáte do aktuální konzole PoweShellu pomocí příkazu

PS C:\> Add-PSSnapIn Quest.*

Pokud je máte správně nainstalované, měl by vám následující příkaz vrátit všechny cmdlety pro práci s AD.

PS C:\> Get-Command –Module Quest.*

Pojďme si rovnou ukázat příklad z praxe:

PS C:\> Get-QADUser | Group-Object ParentContainer | Sort-Object Count -Descending | Select-Object Count, Name -First 5 | Out-Chart -xField 'Name' -yField 'Count'

Tímto příkazem zjistíme pět oddělení s největším počtem zaměstnanců a zobrazíme je v grafu. Out-Chart není standardním příkazem PowerShellu a můžete si jej stáhnout ze stránek Chada Millera. Jako první provedeme pomocí Get-QADUser dotaz na všechny uživatele, pak je sdružíme podle organizační jednotky, seřadíme podle počtu a následně zobrazíme. Většinu cmdletů znáte z předchozích dílů a nyní vše skládáme dohromady pomocí rour v jeden funkční celek.

Dalším typickým dotazem do AD je zjišťování uživatelů se zamčenými nebo disablovanými účty.

PS C:\> Get-QADUser –SearchRoot domain.cz/UserOU –Locked

PS C:\> Get-QADUser -Disabled

Naprosto jednoduchý přístup, který přebírá vše dobré, co jste se již v PowerShellu naučili. Pokud chcete zamčené uživatele odemknout, stačí přidat rouru a další cmdlet a mate zase všechny uživatele zpět odemčené.

PS C:\> Get-QADUser –Locked | Unlock-QADUser

Jistě jste si všimli, že použité cmdlety mají strukturu <Verb>-QAD<Noun> . Firma Quest správně tušila, že i Microsoft přijde se svými cmdlety a přidáním prefixu QAD se vyhnula případným budoucím konfliktům. Na Windows 2008 R2 opravdu existuje cmdlet Get-ADUser.

Další zadání může být například následující. “Dokážeme zjistit, kolik jsme v loňském roce vytvářeli nových účtů?” Toto se vám může hodit v případě plánování zdrojů a alespoň přibližně můžete odhadnout vaše následné náklady. Řešením je tento krátký one-liner. Termínem one-liner se rozumí příkaz PowerShellu, který napíšete na jednu řádku. Už jsem ale viděl i one-linery na několik (desítek) řádek, pouze vhodně spojené rourou.

PS C:\> Get-QADUser -CreatedAfter "1/1/2009 00:00" -SearchRoot 'domena/czOU'

Nutno podotknout, že účty po odchodu lidí nemažu, ale nechávám je určitou dobu ve speciální organizační jednotce, což se mi pro tento případ hodilo. Pro rozdělení na jednotlivá oddělení bych postupoval stejně jako v prvním příkladě.

1.3 Vytvoření nového uživatele

Pojďme si porovnat vytvoření nového uživatele pomocí ADSI a Quest cmdletů. Pokud jste někdy vytvářeli účty ve VBS, asi jste právě ADSI použili. Proto pro vás nebude následující příklad žádným překvapením:

PS C:\> $OU = [ADSI]LDAP://ou=czOU,dc=domain,dc=cz
PS C:\> $User = $OU.Create("user", "cn=DavidM")
PS C:\> $User.Put("sAMAccountName", "davidm")
PS C:\> $User.SetInfo()

Pomocí Quest cmdletů vytvoříme uživatele následujícím způsobem:

PS C:\> New-QADUser -samAccountName 'davidm' -name 'DavidM' -ParentContainer 'OU=czOU,DC=domain,DC=cz'

Ve Windows 2008 R2 můžete použít následující příkaz:

PS C:\> New-ADUser -SamAccountName "davidm" -DisplayName "DavidM" -Path 'OU=czOU,DC=domain,DC=cz'

Při vytváření jednoho uživatele asi výhody konzole nepocítíte, ale představte si nástupy nových lidí každý rok a čas strávený s přípravou PowerShellí verze se vám vyplatí. Nebudu zde ukazovat použití při načítání nových uživatelů z CSV souboru. Takových příkladů existují na webu desítky. Odkážu vás ale na TechNet Magazine, kde se právě tomuto úkolu věnoval v několika pokračováních Don Jones.

1.4 Práce se skupinami

Pokud vytvoříte nového uživatele, musíte (měli byste) ho také přiřadit do skupiny. Opět se jedná o jednoduchý příkaz.

PS C:\> Add-QADGroupMember –identity cz\ProxyServerAccess –member davidm

Pokud potřebujete později zjistit všechny uživatele konkrétní skupiny, pomůže vám tento cmdlet:

PS C:\> Get-QADGroupMember cz\ProxyServerAccess

Práci se skupinami a vytváření uživatele můžete také spojit do jednoho příkazu

New-QADUser | Add-QADGroupMember

Úplně stejně můžete pracovat i s počítači. Asi dokážete odhadnout jméno cmdletu pro práci s nimi.

PS C:\> Get-QADComputer –SearchRoot ‘domain.cz/Domain Controllers’

Pokud budete některé cmdlety používat častěji a nehodí se vám jejich základní parametry, můžete si vytvořit vlastní funkci, do které tento cmdlet “zapouzdříte” (o funkcích si možná povíme něco později). Na mém počítači mohu například zjistit počet mnou upravených AD cmdletů takto:

PS C:\> (Get-Command *-DMAD* | Measure-Object).Count
12

1.5 Další informace

Dnešní téma jsme vzali trochu “letem, světem”. Důvod je jednoduchý. Při práci s Active Directory je dobré si uvědomit jednu základní věc. Všechny potřebné cmdlety jsou vám k dispozici a je pouze na vás, jak je budete kombinovat dohromady. Vždy je dobré znát základy PowerShellu (cmdlety, které jsem ukazoval v předchozích dílech) a vše nové si přizpůsobit pro vlastní potřebu.

O PowerShellu a Active Directory bylo napsáno už mnoho článků. Nechtěl jsem zde opakovat některé často používané konstrukce. Pokud vás ale tento článek trochu vtáhl do tématu a rádi byste se dozvěděli více, uvádím zde několik zajímavých odkazů

- 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.)
Seriál: Windows Powershell – úvod (část 1.)