Powershell Remoting

Úvod

Tento článek jsem napsal, protože sám jsem v tom měl občas trochu “hokej”. Navíc to potřebuji ke své práci a spousta věcí se pak prolíná s Workflow, které bych taky rád pořádně prostudoval. Takže je to vlastně takový můj tahák…

Remotingem se myslí to, že pracujete ze svého místního počítače přímo na vzdáleném počítači nebo počítačích. Pro omezený remoting (bez potřeby konfigurace vzdáleného počítače) můžete použít nativní cmdlets. Pro neomezený remoting musíte konfigurovat vzdálený počítač – můžete tak používat všechny cmdlety a svoje skripty.

Upozornění: Samozřejmě, jediné co nejde při remotingu, je spouštění programů s GUI, sice je spustíte, ale nevidíte jejich okno. Pokud potřebujete tohle, pak použijte vzdálenou plochu nebo jiný podobný nástroj.

Slovníček pojmů:

  • Cmdlet – nativní příkaz Powershellu.
  • GUI – grafické uživatelské rozhraní.
  • Příkaz – cmdlet, funkce, alias, příkaz DOSu atp.
  • Remote session – viz session.
  • Remoting – ovládání vzdáleného počítače.
  • Session – sezení, uzavřené prostředí, ve kterém můžete pracovat se vzdáleným počítačem – vytvoří pracovní prostor oddělený od vašeho pracovního prostředí na místním počítači.
  • Workflow – session, během které můžete spouštět paralelně a/nebo sekvenčně úlohy na více počítačích současně.

Konfigurace remotingu

Snažte se mít na všech počítačích stejnou verzi Powershellu. Můžete sice vytvářet remote sessions mezi počítači s různými verzemi Powershellu, ale vlastnosti dostupné ve vyšších verzích Powershellu nespustíte na nižší verzi. Samozřejmě Powershell je zpětně kompatibilní!

Všechna nastavení musíte provádět jako administrátor (Run as administrator)!

Jak zjistíte verzi Powershellu?

$PSVersionTable.PSVersion

Systémové požadavky

Požadavky jsou zde uvedeny z hlediska Windows 7 SP1/Windows Server 2008 R2 SP1/Windows Server 2008 SP2.

Ve Windows 8/Windows Server 2012 je instalován implicitně Powershell 3.0; ve Windows 8.1/Windows Server 2012 R2 je instalován implicitně Powershell 4.0 a ve Windows 10 je instalován implicitně Powershell 5.0.

Windows Powershell 2.0

  • Microsoft .NET Framework 2.0 nebo novější
  • Windows Management Framework 2.0

Windows Powershell 3.0

  • Microsoft .NET Framework 4.0 nebo novější
  • Windows Management Framework 3.0

Windows Powershell 4.0

  • Microsoft .NET Framework 4.5 nebo novější
  • Windows Management Framework 4.0

Oprávnění

Pro vytváření remote sessions a spouštění vzdálených příkazů musíte být uživatel buď členem skupiny Administrators na vzdáleném počítači nebo musíte mít oprávnění administrátora.Pověření jsou šifrována. Pokud chcete zvýšit zabezpečení, nastavte WinRM na HTTPS. Pokud se připojíte ke vzdálenému počítači, pak platí politiky vzdáleného počítače!

Konfigurace vzdáleného počítače pro remoting

Pokud budete používat pouze nativní cmdlety, není potřeba konfigurovat vzdálený počítač. Pokud však chcete používat session a všechny příkazy Powershellu, pak musíte konfigurovat vzdálený počítač.

U Windows Server 2012 a vyšší je remoting povolen implicitně. Remoting se dá povolit dvěma způsoby (oba musíte spustit na vzdáleném počítači jako administrátor):

Pro jeden nebo pár počítačů – spusťte Windows Powershell jako administrátor a zadejte cmdlet:

Enable-PSRemoting

nebo v příkazovém řádku spusťte jako administrátor (a to je podle mého lepší způsob) a potvrďte dvakrát yes:

WinRM quickconfig

Pro více počítačů v doménovém prostředí pomocí Group Policy povolte::

“Allow automatic configuration of listeners” v Computer Configuration\Administrative Templates\Windows Components\Windows Remote Management (WinRM)\WinRM service

Potom specifikujte IPv4 a IPv6 filtry (wildcards jsou povoleny).

Příkazem New-PSSession si ověřte, že je remoting nastaven správně.

Základní pojmy

Nativní cmdlets pro remoting

Nativní cmdlety pro remoting nepotřebují konfiguraci vzdáleného počítače pro remoting (samozřejmě to nejsou všechny cmdlety Powershellu!). Tyto cmdlety získávají informace ze vzdáleného počítače pomocí Microsoft .NET Framework. Nativní cmdlety pro remoting, které umožňují přistupovat přímo na vzdálený počítač zjistíte snadno:

 

# Cmdlety, které umožňují remoting bez speciální konfigurace mají parametr ComputerName a nemají session parametr

Get-Command | where { $_.Parameters.Keys -contains “ComputerName” -and $_.Parameters.Keys -NotContains “Session”}

# ale ono stačí zadat jen

Get-Command -ParameterName ComputerName

Většinou se v parametru ComputerName zadává jméno jednoho počítače, lze však i více – názvy počítačů oddělujte čárkou. Lze samozřejmě předávat jména počítačů pomocí roury, ale pozor – jen u cmdlets, které mají v nápovědě k danému cmdletu uvedeno True u hodnoty Accept pipeline input! Pokud je tento parametr nastaven na False, pak v případě použití více počítačů použijte proměnnou, do které uložíte názvy počítačů nebo si do proměnné načtěte obsah textového souboru s názvy počítačů.

Session

Session je uzavřené prostředí, ve kterém můžete pracovat se vzdáleným počítačem a využívat všech možností Powershellu. Počet session není teoreticky omezen, ale samozřejmě každá session spotřebovává zdroje. Implicitně je nastaveno maximálně 32 současných session, ale to si můžete změnit parametrem ThrottleLimit. Cmdlety, které tento parametr podporují najdete snadno:

Get-Command -ParameterName ThrottleLimit

Session mohou být dočasné (temporary), interaktivní (interactive) a trvalé (persistent). Nativní cmdlets nepoužívají session! A nyní si trochu přiblížíme typy session::

Temporary session

Vznikají u cmdletu Invoke-Command s parametrem Computername – Powershell zřídí připojení pouze pro tento cmdlet a po ukončení cmdletu toto připojení uzavře. Jakékoliv proměnné nebo funkce, jež byly v rámci tohoto cmdletu definovány se ztratí.

Interactive session

V rámci této interaktivní session se můžete připojit pouze k jednomu vzdálenému počítači. Příkazy jež zadáváte, jsou spuštěny přímo na vzdáleném počítači, stejně jako byste je zadávali přímo na něm – v rámci interaktivní session zadáváte přímo příkazy do příkazového řádku a pracujete tak přímo na vzdáleném počítači.

Cmdlets pro interaktivní session:

 

# Zahájení interactive session
Enter-PSSession Server1

RemotePC\PS> … a zde můžete zadávat libovolné příkazy (jste přímo na vzdáleném počítači)

# Ukončení interactive session
Exit-PSSession

Persistent session

Persistent session je trvalá session, na kterou se můžete odkazovat v cmdlets Pomocí persistent session můžete spustit sérii vzdálených příkazů, jež sdílejí data, jako jsou funkce, aliasy, proměnné.

 

# Zahájení persistent session New-PSSession

$pss = New-PSSession –ComputerName RemotePC, RemoteServer

# Ukončení persistent session Remove-PSSession

Remove-PSSession $pss

Odpojení persistent session

Ve Windows Powershell 2.0 při odpojení session je tato session odstraněna i ze vzdáleného počítače. Od Windows Powershell verze 3.0 a vyšší (musí být stejná verze Powershellu samozřejmě na místním i vzdáleném počítači) je session ukládána na vzdáleném počítači a tak se můžete od persistent session odpojit a později z libovolného počítače opět připojit. To je výhoda, protože si můžete svůj počítač restartovat a pak se zase na session připojit nebo se připojit na session třeba odjinud. Pro Interactive session to neplatí!

Odpojené relace jsou udržovány v odpojeném stavu, dokud neodstraníte PSSession na vzdáleném počítači např. použitím cmdlets Remove-PSSession.

Příkazy v odpojeném persistent session pokračují tedy i po odpojení, do chvíle, dokud se buď ukončí sekvence příkazů či skript nebo se ukončí v okamžiku zaplnění výstupního bufferu nebo dojde k vypršení časového limitu:

  1. Abyste zabránili zaplnění výstupního buffer v případě odpojení od session použijte parametr OutputBufferingMode v cmdlets Disconnect-PSSession, New-PSSessionOption, nebo New-PSTransportOption cmdlets.
  2. Můžete nastavit časové prodlevy o PSSession pomocí IdleTimeoutSec nebo idleTimeout parametrů u cmdlets Disconnect-PSSession, New-PSSessionOption, nebo New-PSTransportOption.

Následující cmdlety podporují vlastnost odpojení:

Disconnect-PSSession:  Disconnects a PSSession.
Connect-PSSession:     Connects to a disconnected PSSession.
Receive-PSSession:     Gets the results of commands that ran
                       in disconnected sessions.
Get-PSSession:         Gets PSSessions on the local computer or
                       on remote computers.
Invoke-Command:        InDisconnectedSession parameter creates
                       a PSSession and disconnects immediately.
Jak se odpojit od session?
Get-PSSession -ComputerName Server01 | Disconnect-PSSession
Jak se znova připojit k PSSesions?
 

# Na vzdáleném počítači

Get-PSSession -ComputerName Server1

# Na místním počítači

Get-PSSession

Invoke cmdlet

Invoke-Command je cmdlet, který umožňuje spustit příkaz, blok příkazů nebo script na vzdáleném (nebo i místním samozřejmě) počítači či počítačích a vrací výsledek do vaší konzole. Tzn., že nepracujete přímo na vzdáleném počítači, jen dostanete zpátky požadovaná data.

Pomocí Invoke-Command také můžete spustit příkaz, blok příkazů či skript, který máte na lokálním počítači. Potřebujete-li spustit lokální skript na vzdáleném počítači, použijte parametr FilePath. Výsledek je vrácen do vašeho lokálního počítače.

Tento cmdlet v případě použití parametru ComputerName si otevře temporary session a po ukončení si ji zase sám zavře, aniž byste se museli o nějakou session starat. Znamená to, že všechny proměnné ze vzdáleného počítače či počítačů se ztratí.

Druhá možnost je – pokud potřebujete dál pracovat s proměnnými atp. – vytvořit persistentní session (jak je vysvětleno výše) a pomocí parametru Session s ní pracovat. Pokud vytvoříte persistent session pro více počítačů, pak se příkazy spouští pro každý uvedený počítač.

ComputerName parametr tedy slouží v situacích, kdy potřebujete spustit jeden nebo více nesouvisejících příkazů na jednom nebo více počítačích a nepotřebujete uchovávat funkce a proměnné. Pokud chcete použít cmdlet Invoke-Command na místním počítači, uveďte do parametru ComputerName hodnotu . (tečka) nebo “localhost”.

Session parametr slouží v situacích, kdy potřebujete sdílet data.

Remote proměnné

Proměnné použité v příkazech pro remoting jsou definované v dané session. Nelze sdílet proměnné v různých session.

Pokud chcete v příkazech pro remoting použít místní proměnné, tak u Windows Powershellu verze 2.0 musíte použít parametr ArgumentList a u verze 3.0 a vyšší můžete jednodušeji použít modifikátor rozsahu Using:

 

C:\PS>$ps = “Windows PowerShell”

# Windows Powershell 2.0

C:\PS>Invoke-Command -ComputerName S1 -ScriptBlock {param($log) Get-WinEvent -logname $log} -ArgumentList $ps

# Windows Powershell 3.0 a vyšší

# Syntaxe

$Using:<VariableName>
# Použití
$USing:$ps

Shrnutí

Stručný postup pro zprovoznění remotingu

(podrobně v kapitole Konfigurace remotingu):

  1. Nainstalujte si na všech počítačích, ke kterým budete přistupovat stejnou verzi Windows Management Framework (obsahuje Windows Powershell) a k tomu příslušný .NET Framework (ke stažení na Microsoft Download Center). Doporučuji vám, pokud chcete přistupovat na vzdálený počítač pomocí Powershellu, aby na všech počítačích byla stejná verze Powershellu. Přece jen mezi jednotlivými verzemi Powershellu jsou rozdíly a vyšší verze umožňují lepší “fíčury”.
  2. Na všech počítačích povolte remoting, ať už ručně nebo pomocí Group Policy.
  3. Udělte práva uživatelům, kteří budou moci používat remoting.

Co se k čemu hodí

  1. Potřebujete spustit cmdlet na vzdáleném počítači a nemáte provedou konfiguraci pro remoting – použijte nativní cmdlet pro remoting.
  2. Potřebujete spustit příkaz nebo skriptna jednom či více vzdálených počítačích nakonfigurovaných pro remoting, aniž byste potřebovali s výstupem dále pracovat – použijte Invoke-Command.
  3. Potřebujete přímo pracovat na daném vzdáleném počítači nakonfigurovaném pro remoting – použijte interactive session.
  4. Potřebujete pracovat současně na více vzdálených počítačích nakonfigurovaných pro remoting – použijte persistent session.

Pro přerušení příkazu použijte CTRL+C.

Zdroje:

about_Remote.help.txt

about_Remote_Disconnected_Sessions.help.txt

about_Remote_FAQ.help.txt

about_Remote_Jobs.help.txt

about_Remote_Output.help.txt

about_Remote_Requirements.help.txt

about_Remote_Troubleshooting.help.txt

about_Remote_Variables.help.txt

about_Session_Configuration_Files.help.txt

about_Session_Configurations.help.txt

WS-Management Protocol