Jedną z najlepszych funkcji oferowanych przez PowerShell jest możliwość zdalnego zarządzania serwerami. Pozwala nawet zarządzać grupą jednocześnie.
Przeczytaj poprzednie artykuły z serii:
I pozostańcie czujni przez resztę serii przez cały tydzień.
Zbiorcze zarządzanie serwerami może być uciążliwe, a jeśli wcześniej musieli Państwo zmienić konfigurację IIS na 50 serwerach, będziecie wiedzieli, o co mi chodzi. Są to sytuacje, w których PowerShell Remoting i zdolności językowe skryptów mogą przyjść na ratunek. Korzystając z protokołu HTTP lub bezpieczniejszego protokołu HTTPS, program PowerShell Remoting umożliwia wysyłanie poleceń do zdalnego komputera w sieci użytkownika. Następnie urządzenie uruchamia polecenia i odsyła dane wyjściowe, które z kolei są wyświetlane na ekranie.
Rdzeniem programu PowerShell Remoting jest jedna usługa Windows, usługa Windows Remote Management lub usługa WinRM, która stała się znana. Korzystając z WinRM, możesz skonfigurować jedną lub więcej konfiguracji sesji (zwanych także punktami końcowymi), które w zasadzie są plikami zawierającymi informacje o doświadczeniu, które chcesz przekazać osobie łączącej się ze zdalną instancją PowerShell. Dokładniej, możesz użyć plików konfiguracyjnych sesji, aby określić, kto może i kto nie może się połączyć z instancją, jakie cmdlety i skrypty mogą uruchamiać, a także jaki kontekst zabezpieczeń musi być uruchamiany w ramach sesji. Korzystając z usługi WinRM, ustawiasz także "detektory", które nasłuchują przychodzących żądań PowerShella. Te "słuchacze" mogą być HTTP lub HTTPS i mogą być przypisani do jednego adresu IP na twoim komputerze. Po otwarciu połączenia PowerShell z innym komputerem (technicznie odbywa się to przy użyciu protokołu WS-MAN, który jest oparty na protokole HTTP), połączenie jest powiązane z jednym z tych "detektorów". "Odbiorcy" są wówczas odpowiedzialni za wysyłanie ruchu do aplikacji powiązanej z odpowiednim plikiem konfiguracji sesji; aplikacja (zazwyczaj PowerShell, ale możesz mieć inne aplikacje hostingowe, jeśli chcesz), uruchamia polecenie i przesyła wyniki z powrotem przez "słuchacza" przez sieć i z powrotem na twój komputer.
Pierwszą rzeczą, którą musisz zrobić, to włączyć Remoting na komputerze, z którym chcesz się połączyć. Można to zrobić, uruchamiając następujące:
Enable-PSRemoting
Będziesz musiał odpowiedzieć "tak" na wszystkie monity. Po uruchomieniu Enable-PSRemoting, na komputerze PC wprowadza się kilka zmian:
Jeśli używasz systemu Windows 7, a lokalizacja karty sieciowej jest ustawiona na Publiczny, włączenie funkcji PowerShell Remoting zakończy się niepowodzeniem. Aby to naprawić, wystarczy przejść do lokalizacji sieci domowej lub służbowej. Możesz także pominąć sprawdzanie sieci, wykonując następujące czynności:
Włącz-PSRemotowanie -SkipNetworkProfileCheck
Zalecamy jednak raczej zmienić lokalizację w sieci.
Istnieją dwa sposoby połączenia z innym komputerem za pomocą PowerShell. Jest jedna do jednej metody, która jest bardzo podobna do używania SSH, a następnie istnieje jedna do wielu metod.
Pierwszy sposób połączenia ze zdalnym komputerem za pomocą PowerShell wykorzystuje coś, co nazywa się sesją PowerShell. Po prostu sesja pozwala na uruchamianie poleceń na zdalnym komputerze w sposób interaktywny, podobnie jak na własnej maszynie. Aby otworzyć sesję, wystarczy wpisać:
Enter-PSSession - Nazwa komputera "Darlah"
Monit ten zyska przedrostek oznaczający maszynę, na którą uruchamiasz polecenia cmdlet.
Stąd można naprawdę potraktować prompt tak, jakbyś siedział na zdalnym komputerze. Na przykład, jeśli chcesz zobaczyć wszystkie pliki na dysku C: \, możesz zrobić proste:
Get-ChildItem -Path C: \
Jeśli pochodzisz z Linuksa, możesz pomyśleć o stosowaniu tej jednej do drugiej metody zdalnego przekazywania jako alternatywy PowerShell do SSH.
Drugi sposób korzystania z PowerShell na zdalnym komputerze odbywa się za pomocą polecenia Invoke-Command. Zaletą korzystania z Invoke-Command jest fakt, że można wykonać to samo polecenie na wielu komputerach jednocześnie. Jak możesz sobie wyobrazić, jest to szczególnie przydatne, gdy chcesz zrobić coś takiego, jak zbieranie dzienników zdarzeń z serwerów. Polecenie Invoke-Command ma następującą składnię:
Invoke-Command-ComputerName Darlah, localhost -ScriptBlock Get-EventLog Application -Newest 2
Ponieważ polecenie jest wykonywane równolegle na wszystkich komputerach, będziesz potrzebował jakiegoś sposobu sprawdzenia, z którego komputera pochodzi dany wynik. Możesz to zrobić, patrząc na właściwość PSComputerName.
Kiedy używasz polecenia Invoke-Command, nie masz już obiektów, których możesz oczekiwać w potoku. Widzisz, aby PowerShell mógł pobrać informacje ze zdalnego komputera z powrotem do twojego komputera, potrzebuje sposobu reprezentacji obiektów, które polecenie uruchomiłeś na wyjściach maszyny zdalnej. Obecnie wydaje się, że wybranym sposobem reprezentowania hierarchicznej struktury danych jest użycie XML, co oznacza, że kiedy wydajesz komendę za pomocą polecenia Invoke-Command, wyniki są najpierw serializowane do XML, zanim zostaną odesłane do twojego komputera.Po powrocie do komputera są ponownie przekształcane do postaci z powrotem w obiekt; chodzi o to, że gdy są deserializowane, wszystkie metody, z wyjątkiem metody ToString (), że obiekt został usunięty z niego.
Uwaga: Istnieje kilka wyjątków od tej reguły, na przykład większość prymitywnych typów, takich jak liczby całkowite, może być deserializowana z uwzględnieniem zawartych w niej metod. Istnieje również proces o nazwie Rehydration, w którym niektóre metody można dodać z powrotem do deserializowanych obiektów. Więc bądź ostrożny i pamiętaj, że Get-Member jest twoim przyjacielem.