PowerShell Remoting

Josef Vágner
6 minuty, 18 sekundy
3

PowerShell je velmi silný a efektivní způsob skriptování, který se postupně rozšířil nejen pro ovládání všech novějších produktů Microsoftu, ale i produktů od jiných výrobců (https://en.wikipedia.org/wiki/Windows_PowerShell#Application_support). Od verze 2.0 lze PowerShell používat i pro vzdálené volání powershellových příkazů. Tzv. remoting umožňuje vzdálená volání procedur z lokálního počítače včetně paralelního zpracování dotazů. Veškerá komunikace je šifrovaná.

Remoting lze iniciovat příkazem Invoke-Command… Druhou možností je připojit se ke vzdálené konzoli příkazem Enter-PSSession –ComputerName <jméno vzdáleného počítače> První verze ještě v některých příkazech nepoužívaly čistý remoting založený na WS-Management (implementován pomocí WinRM), ale pro některé parametry (např. -ComputerName) se volaly RPC nebo DCOM procedury. Od verze 3.0 se jedná o čisté volání webových služeb. Od Windows Serveru 2012 je na serveru již PowerShell Remoting automaticky zapnut. Po správnou funkčnost je ale nutno ještě nastavit několik dalších věcí. Tato nastavení se budou lišit podle toho, zda je lokální počítač ve stejné doméně, jako je vzdálený server, nebo zda se bude jednat o počítač, který je začleněn jen v pracovní skupině. Pozn.: Více o remotingu např. ve free e-knize Secrets of PowerShell Remoting https://www.penflip.com/powershellorg/secrets-of-powershell-remoting.

Počítače v doméně

Pokud jsou oba počítače v doméně, je práce na zprovoznění remotingu poměrně jednoduché. Stačí iniciovat příkaz Enable-PSRemoting [–Force] Ten vám spustí službu WinRM a nastaví její automatické spouštění. Dále nastaví listener, aby poslouchal na všech IP adresách a nastaví na firewallu vyjímky pro WS-Management (ale jen pro protokol HTTP). Pozn. Powershellový příkaz Enable-PSRemoting je v zhruba ekvivalentní příkazu winrm quickconfig. Většinu těchto činností lze nastavovat pomocí skupinové politiky. Viz nastavení Computer Configuration\Policies\Administrative Templates\Windows Components\Windows Remote Management (WinRM)\WinRM Service, Computer Configuration\Policies\Windows Settings\Security Settings\System Services a Computer Configuration\Policies\Windows Settings\Security Settings\Windows Firewall with Advanced Security\Windows Firewall with Advanced Security.

Počítač v pracovní skupině

HTTP

Méně bezpečný, ale jednodušší způsob, je využít protokolu HTTP (přenos se šifruje jen symetrickým klíčem). V tomto případě musíme nejprve zaktualizovat seznam TrustedHosts. Nejprve se přesvědčíme, zda jsou zde již některé počítače vyjmenovány, a to konkrétně příkazem Get-Item –Path WSMan:\localhost\Client\TrustedHosts

Příkazem Set-Item –Path WSMan\localhost\Client\TrustedHosts –Value "<název vzdáleného počítače>" přidáme další počítač(e). Případně pro ulehčení (alespoň na počátku nebo při testech) lze zadat hvězdičku, čímž povolíme remoting pro veškeré počítače. To ale pořád ještě nebude stačit. Pokud je síťová karta nastavena na Public, musíme na vzdáleném serveru spustit příkaz Enable-PSRemoting -SkipNetworkProfileCheck [-Force]

čímž obejdeme případné chybové hlášení (The WinRM client cannot process the request…). Poslední věcí, kterou musíme udělat, tentokráte na lokálním počítači, je přidání IP adres(y) vzdáleného server(ů) do seznamu TrustedHosts (analogicky jako jsme udělali u vzdáleného serveru), případně zde lze zadat hvězdičku. Použijeme opět příkaz Set-Item WSMan:\localhost\Client\TrustedHosts -Value "<IP adresa>" [-Force]

Aby se změny promítly, restartujte službu WinRM Restart-Service WinRm Nakonec i zde spusťte příkaz Enable-PSRemoting

HTTPS

Druhý (bezpečnější) způsob je využít pro přenos protokolu HTTPS. V tuto chvíli se navíc zašifruje komunikace SSL pomocí asymetrického klíče z certifikátu a zároveň se ověří identita obou koncových bodů. Pro tento scénář je ale nutnost použít SSL certifikátu. Samozřejmě lze využít i komerčních certifikátů, ale pro testovací účely ho asi pokaždé nebudeme mít k dispozici. V tom případě lze využít i tzv. self-signed certifikátů, které si můžeme sami (a zdarma) vytvořit. Nemusíte se obávat ani složitého procesu instalace různých pomocných SDK či toolkitů, neboť PowerShell to od verze 4 umí sám. Stačí použít příkazu $Cert = New-SelfSignedCertificate -CertstoreLocation Cert:\LocalMachine\My -DnsName "<FQDN vzdáleného počítače>"

Můžeme si to zkontrolovat v MMC konzoli s add-inem pro certifikáty ve složce Personal\Certificates. Vyexportujeme si certifikát do souboru, buď přímo z MMC konzole nebo powershellovým příkazem Export-Certificate -Cert $Cert -FilePath C:\temp\<název certifikátu>

Poté spustíme příkaz Enable-PSRemoting -SkipNetworkProfileCheck [-Force] čímž eliminujeme případné problémy se sítí typu Public. Příkaz také spustí listener, ale pouze pro HTTP. Zkontrolovat si to můžeme příkazem dir wsman:\localhost\listener Pokud chcete elminovat HTTP listener, můžete to udělat příkazem Get-ChildItem WSMan:\Localhost\listener | Where -Property Keys -eq "Transport=HTTP" | Remove-Item -Recurse Případně lze příkazem Remove-Item -Path WSMan:\Localhost\listener\listener -Recurse odstranit veškeré listenery. Přidání HTTPS listeneru uskutečníte příkazem New-Item -Path WSMan:\LocalHost\Listener -Transport HTTPS -Address -CertificateThumbPrint $Cert.Thumbprint [–Force]

Poslední věc, kterou je nutno udělat, je přidání vyjímek pro firewall pro HTTPS New-NetFirewallRule -DisplayName "Windows Remote Management (HTTPS-In)" -Name "Windows Remote Management (HTTPS-In)" -Profile Any -LocalPort 5986 -Protocol TCP

Případně lze pro zvýšení bezpečnosti odstranit vyjímku na firewallu pro HTTP komunikaci Disable-NetFirewallRule -DisplayName "Windows Remote Management (HTTP-In)" Nyní se přesuneme na stranu klienta, kde naimportujeme na server vygenerovaný certifikát, buď pomocí MMC (do složky Trusted Root Certification Authorities\Certificates) nebo příkazem PowerShellu Import-Certificate -Filepath "C:\temp\<název certifikátu>" -CertStoreLocation "Cert:\LocalMachine\Root"

Pozn. Pokud použijeme komerční certifikát, stačí namísto předchozích příkazů spustit příkaz Set-WSManQuickConfig –UseSSL

Remoting

Nyní lze vyzkoušet remoting příkazem Enter-PSSession -ComputerName <název serveru> [-UseSSL] -Credential (Get-Credential)

nebo Invoke-Command -ComputerName <název serveru> [-UseSSL] -ScriptBlock {Get-Process} -Credential (Get-Credential) Pro název serveru můžete použít jeho FQDN nebo IP adresu. V druhém případě musíte samozřejmě přidat do souboru hosts dvojici IP adresy a název server. Nebo pomocí PowerShellu příkazem Add-Content $Env:SystemRoot\system32\drivers\etc\hosts "<IP adresa> <název serveru>" Pozn.: Pokud se budete připojovat k VM v Azure, nezapomeňte zde ještě povolit příchozí port 5985 pro HTTP resp. 5986 pro HTTPS komunikaci (pro PowerShell verze 4.0 a vyšší).

Pozn.: Pokud potřebujete jednoduše přemisťovat soubory z nebo do Azure, můžete využít free utility od VeeamuFastSCP for Microsoft Azure (https://www.veeam.com/fastscp-azure-vm.html), která využívá pro komunikaci PowerShell remotingu. Na rozdíl od RDP nemá limit 2 GB na soubor, dá se pravidelně spouštět včetně pre- a post- skriptů atd. Aplikace je ale jen pro 64-bitový OS.

Happy remoting!

Autor: Josef Vágner

Následující článek Předchozí článek