Powershell: Włączenie remotingu z maszyny zdalnej. Niemożliwe? Wcale nie!

31-Gru-2015

No dobra. Do włączenia remotingu na serwerze lokalnym służy polecenie

Enable-PSRemoting

Niestety to polecenie nie ma parametru -ComputerName, aby włączyć remoting na systemie zdalnym 🙁

Na szkoleniu Powershell dla administratorów Windows pokazuję, że jeśli chcesz włączyć remoting na maszynie zdalnej, to powinieneś wykorzystać zasady grupy i stosując te zasady do serwerów konfigurować je do włączenia lub wyłączenia remotingu. A co jeśli w firmie konfiguracją domeny zajmuje się ktoś inny!? Nie masz z nim kontaktu, a nawet jeśli masz to nie masz mocy przekonania kolegów o tym, że potrzebujesz włączenia remotingu. Hmmm….

Do zdalneo uruchomienia polecenia można się też posłużyć poleceniem Invoke-WMIMethod. Gdyby tak tej komencie przesłać instrukcję:

powershell.exe -command „{Enable-PSRemoting -Force}”

to cel byłby osiągnięty! Tylko jest jeden problem… Invoke-WMIMethod uruchomi polecenie nie dołączając tokenu administratora (nie jako administrator – elevated). Tymczasem Enable-PSRemoting musi być uruchamiane jako administrator!

Trzeba pokombinować. Jest metoda, która pozwala na sytemie zdalnym uruchmić polecenie jako administrator. Możesz utworzyć zadanie w harmonogramie zadań, do uruchomienia na koncie system i natychmiast to zadanie uruchomić. W zadaniu możesz zdefiniować do uruchomienia właśnie powershella włączającego Remoting!

Takie rozwiązanie proponuje książka Windows Powershell Cookboook. Oto i ono po moich małych przeróbkach Enable-PSRemotingRemotely.txt. A tu parę słów komentarza:

Chcemy pracować z funkcją, a nie skryptem, więc dodajemy nagłówek:

Za chwilę będzie dość złożony tekst z komendami zawierający w sobie kolejne komendy, warto więc włączyć tzw. Strict Mode, który powoduje, że gdy odwołasz się do niezainicjowanej zmiennej to będzie błąd. Bardzo dobry krok w skomplikowanych skryptach!

W kolejnych krokach czasami trzeba skorzystać z credentials, czasami z nazwy użytkownika, a czasami z hasła. Przygotowujemy zmienne:

Teraz konstruujemy skrypt, który przez Invoke-WMIMethod będzie uruchamiany na zdalnym systemie. Wszystkie pracujące tu komendy będą już działać lokalnie na tamtym systemie.

uff… długie to było a co się tam nie działo:

  • tworzymy zmienne na nazwy plików tymczasowych. Wszystkie będą tworzone w profilu użytkownika (odwołanie do $env:temp)
  • Plik log będzie zawierał log z działania skryptu
  • a plik scriptFile zawiera skrypt, w którym znajdzie się polecenie włączające remoting
  • dwa polecenie SCHTASKS po pierwsze tworzą zadanie w harmonogramie, a po drugie uruchamiają to zadanie. Opis schtasks znajdziesz na msdn
  • Pętla for spowalnia skrypt, czekając aż uda się nawiązać połączenie z localhost przez remoting (tak z localhost, bo polecenia są uruchamiane na systemie lokalnym)
  • Na zakończenie zadanie z harmonogramu będzie usunięte i zatrzymamy logowanie. Plik można przejrzeć w celu debuggownaia.

No dobrze. Skrypt już jest gotowy, teraz chcemy go wysłać i wykonać na systemie zdalnym. Dlatego konwertujemy skrypt do postaci Base64.

Teraz wystarczy dokleić zakodowany skrypt do polecenia powershell.exe i uruchomić ten skrypt na maszynie zdalnej przez Invoke-WMIMethod:

Teraz wszystko w rękach powershella. Na dodatek wykonanie zadania w harmonogramie zadania odbywa się asynchronicznie, tzn naszy skrypt przechodzi do kolejnych kroków, a zadanie jeszcze nie zdążyło się wykonać na serwerze. Dlatego jeszcze raz dodajemy pętelkę for, która będzie sprawdzać, czy remoting już działa. Jeśli wszystko jest ok, to w ostatnim kroku wyświetli informacje o maszynie zdalnej:

Komentarze:

  1. Szkolenie Powershell po polsku. Informacja dla studentów | Kursy OnlineKursy Online napisał,

    […] Często pojawiające się pytanie, to czy remoting może być włączony zdalnie i to najlepiej przez jakąś komendę w powershellu. Odpowiedź wydaje się oczywista: NIE! Ale czy na pewno? Jak sugeruje tytuł kolejnego wpisu, chyba jednak powinno się udać! Ja używam tej metody produkcyjnie i u mnie działa. Proste to nie jest, wymaga kilku sztuczek, ale o prawie wszystkich mówimy na naszym kursie, więc jeśli już kończysz materiał – nie powinno być z tym problemu. Powershell: Włączenie remotingu z maszyny zdalnej. Niemożliwe? Wcale nie! […]

Dodaj komentarz:

Autor: Rafał Kraik