mRemote: polecenie PowerShell jako External Tool

Aplikacja mRemote pozwala używać ze definiowanymi połączeniami zewnętrznych narzędzi. Funkcja ta pozwala uruchomić CMD, przeglądarkę internetowa, aplikacje VNC, czy konsolę PowerShell.
Dzięki External Tool udało się nam odczytać zapisane hasło połączenia, użyliśmy do tego celu zmiennej %password% i wiersza poleceń. W dokumentacji zmiennych jest więcej, jak zatem z ich użyciem zdefiniować własne External Tool? Jak je zdefiniować aby wykonywał dla nas określone polecenie PowerShell? Jak wykonać skrypt PowerShell na maszynie która mamy zdefiniowaną w połączeniach aplikacji mRemote? Jak wykonać zdalnie polecenie PowerShell z uzyciem mRemote i External Tool?

Zacznijmy od tego co chcemy uzyskać, w naszym przykładzie planujemy utworzyć External Tool który wykorzysta zapisane w połączeniu poświadczenia tak aby z użyciem konsoli PowerShell nawiązać sesje WinRM. Mamy plik połączeń ze zdefiniowanym dostępem RDP i chcemy aby pod prawym przyciskiem pojawiło się External Tool do nawiązywania sesji zdalnej (z użyciem poświadczeń używanych przez pulpit zdalny):

Zacznijmy od samego polecenia konsoli, gdybyśmy mieli użyć PowerShell otworzenie sesji zdalnej z użyciem WinRM potrzebowalibyśmy poświadczeń i adresu docelowego:

$cred = Get-Credential
$comp = "dc.sprawdzone.it"
Enter-PSSession -ComputerName $comp -Credential $cred


Zatem brakuje nam zmiennej poświadczeń ($cred) i nazwy komputera ($comp) z którym chcemy się połączyć – te informacje powinniśmy pobrać z połączenia zdefiniowanego w mRemote. W samej aplikacji mamy następujące zmienne:

%USERNAME%
%PASSWORD%
%DOMAIN%

z których zbudujemy nasze poświadczenia

i %HOSTNAME%
czyli nasz przyszły adres sesji

z użyciem tych elementów przerabiamy nasz początkowy skrypt – nie pytamy już o poświadczenia przypisując je do zmiennej $cred. W zamian tworzymy nowy obiekt poświadczeń z użyciem zmiennych mRemote i podmieniamy zmienną $comp na %HOSTNAME%

$pwd = ConvertTo-SecureString '%PASSWORD%' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList @('%DOMAIN%\%USERNAME%', $pwd)

Enter-PSSession -ComputerName %Hostname% -Credential $cred


Jesteśmy już prawie gotowi jednak External Tool wymaga aby nasz polecenie sformatowane zostało do postaci jednej linii i uruchamiane jako parametr do powershell.exe.

Modyfikujemy więc dalej skrypt, usuwając wiersze po każdym poleceniu dodając średnik ;

Dodatkowo umieszczając całą jego zawartość w parametrze Command poprzedzając go parametrem NoExit, całość wygląda następująco:

-NoExit -Command "$pwd = ConvertTo-SecureString '%PASSWORD%' -AsPlainText -Force; $cred = New-Object System.Management.Automation.PSCredential -ArgumentList @('%DOMAIN%\%USERNAME%', $pwd); Enter-PSSession -ComputerName %Hostname% -Credential $cred"


W ten sposób mamy gotowy skrypt, otwieramy mRemote i przechodzimy do narzędzi i dalej do External Tool

w oknie opcji dodajemy nową pozycje, w której wypełnimy odpowiednie pola:

Jako nazwę pliku uruchamiamy PowerShell, korzystając ze ścieżki:

%WINDIR%\system32\WindowsPowerShell\v1.0\PowerShell.exe

Naszym argumentem będzie cały skrypt – pamiętajmy jeszcze o nazwie pod jaką ma się wyświetlać:


UWAGA: Zanim uruchomimy nasze narzędzie musimy pamiętać o zasadzie działania WinRM – aby z komputera niewpiętego do domeny (albo znajdującego się w innej domenie) nawiązać sesje, maszyna docelowa musi zostać dodana do tzw. Trusted Hosts. Do tego celu używamy polecenia PowerShell:

Set-Item WSMan:\localhost\Client\TrustedHosts -Value 'dc.sprawdzone.it'


W moim przypadku łącze się z wieloma domenami i setkami maszyn dlatego pozwoliłem sobie na konfiguracje dodająca dowolne maszyny do Trusted Host (jest to mniej bezpieczne rozwiązanie ale nie wyobrażam sobie dodawać do listy każdej nowej maszyny, każdego nowego kontrahenta):

Set-Item WSMan:\localhost\Client\TrustedHosts -Value '*'

Mamy już skonfigurowane zasady działania WinRm, mamy gotowe nasze External Tool – czas sprawdzić jak działa całość. Wybieramy z listy zdefiniowane połączenie RDP (takie gdzie mamy uzupełniony login i hasło) a następnie prawym przyciskiem myszy wybieramy narzędzia i nasz Enter-PSSesion:

Po chwili otworzy się domyślna dla PowerShell konsola:

i działa!

Dla zainteresowanych którzy chcieli by za pomocą External Tools uruchomić jakiś zdalny skrypt lub kilka poleceń w bloku bez nawiązywania sesji polecam Invoke-Command i parametr -ScriptBlock { }

Przykład dla skryptu pokazującego ostatni zainstalowany update:

-NoExit -Command "$pwd = ConvertTo-SecureString '%PASSWORD%' -AsPlainText -Force; $cred = New-Object System.Management.Automation.PSCredential -ArgumentList @('%DOMAIN%\%USERNAME%', $pwd); Invoke-Command -ComputerName %Hostname% -Credential $cred -ScriptBlock { Get-HotFix | Select-Object HotFixID, InstalledBy, InstalledOn -Last 1 }"

Jeżeli mój wpis Ci się spodobał, pomógł w pracy? Chcesz mnie wspierać? Postaw kawę! To dzięki waszemu wsparciu nie ma reklam! Poniżej kod QR do płatności który jest jednocześnie linkiem do PayPal możesz też wpłacić BLIK z użyciem Przelewy24.pl