Seriál: Hyper-V ve Windows Server 2016 – 3. část: Powershell Direct

Na začátek se chci omluvit za pozdní vydání - nemoci nechodí po horách, ale po lidech. Snad už budu do konce roku zdravý a žádný další díl nezdržím. Minule jsem sliboval, že se v tomto díle podíváme na Nested Virtualization, ale rozhodl jsem se prohodit pořadí s funkcí Powershell Direct, protože pro Vás finišuji v souvislosti s Nested Virtualization skript, který se Vám pravděpodobně bude velmi líbit! Powershell Direct je novinkou, která potěší mnohé Powershell-friendly administrátory, kteří sem tam potřebují něco skriptit ve virtuálních mašinách zatímco mají puštěný Powershell na Hyper-V hostu.

Jak to funguje?

Tato funkcionalita využívá přímého spojení do VM skrze VMBus z parent partition a tím pádem není závislá na síťovém spojení do VM, nebo nastavení firewallu ve VM. To je velmi užitečné hlavně v případech, kdy je VM nedostupná po síti, nebo když provádíte scripting na hostu nad velkým množstvím VM a nechcete řešit jak je která VM nastavená z pohledu IP adres či DNS názvů. Praktickým příkladem může být tedy VM, která je umístěná do VLAN ve které není také host, či případně VM u níž FW blokuje většinu připojení. Powershell Direct Vám umožní vytvořit session, ale stejně tak ho lze použít pouze pro poslání příkazu či bloku příkazů do VM.

Zabezpečení Powershell Direct

Přestože má Powershell direct skrze VMBus přímý přístup k Powershell remotingu, tak se na něj vztahují stejná pravidla jako na klasické spojení přes síť. To znamená, že aby se uživatel mohl připojit z hosta do VM, musí mít administrátorská práva ve VM! Není nutné se tedy obávat, že by mohl neautorizovaný uživatel provádět zásahy do VM přes Powershell Direct. Dále je nutné Powershell konzoli na hostu spustit s admin právy, aby bylo možné přistupovat do VM.

Jak to lze využít?

Využití se pro Powershell Direct vyskytuje mnoho. Jen namátkou pár možných - výpisy stavů služeb ve VM, instalace features do VM, restart služeb ve VM, refresh Group policies, konfigurace FW pravidel, reinstalace agentů, konfigurace sítí, konfigurace názvů, atd. Je toho opravdu hodně a kreativitě se meze nekladou. Věřím, že každý si najde nějaký způsob využití Powershell Direct pro sebe.

Praktické příklady

Jak už jsem zmínil výše, máte několik možností jak využít Powershell Direct – session, command a nebo command block.

Session Powershell Direct

Pokud se rozhodnete pro session, tak se přepínáte do VM a dokud session neukončíte, tak všechny následující vstupy zadáváte ve VM. Pro práci v session stačí zadat (viz také video níže):

 Enter-PSSession –VMName "Nazev VM" -Credential "domena\ucet" 

Command Powershell Direct

Pro zaslání jednoho příkazu do VM se hodí následující příkaz:

 Invoke-Command –VMName "Nazev VM" -Credential "domena\ucet" {Restart-Service –Name "Spooler" -Verbose} 

Scriptblock Powershell Direct

Pokud chcete ve VM provést větší množství operací, hodí se použít scriptblock. Ten může například vypadat takto:

  $VMCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "WUGDays\Kamil", (ConvertTo-SecureString -AsPlainText "tajneheslo1@" -Force) 
Invoke-Command -VMName "Domain Controller 1" -Credential $VMCredential -ScriptBlock {   Get-ComputerInfo | fl Win*   Get-NetIPAddress | ft   } 

Další informace

Pokud se chcete dozvědět více informací, můžete čerpat například z MSDN: https://msdn.microsoft.com/en-us/virtualization/hyperv_on_windows/user_guide/vmsession

Kam dál?

Powershell Direct začíná být zajímavější o to víc, když přišel s dalším vylepšením a to konkrétně Powershell JEA! Jedná se o funkci, která umožní definovat co může který uživatel v Powershellu provést. Ale o tom více až v dalším článku, který vydám mimo tento seriál, protože se netýká jen Hyper-V, ale rozhodně je v něm velmi užitečný. Příští týden už se můžete těšit na slibovaný díl o Nested Virtualization...

Kamil Roman
Nezávislý konzultant a školitel
Tento článek byl publikován na blogu autora: https://itblog.kamilrt.net/2016/10/21/serial-hyper-v-ve-windows-server-2016-3-cast-powershell-direct/