Często zadawane pytania dotyczące komunikacji zdalnej w programie PowerShell

Podczas pracy zdalnej wpisz polecenia w programie PowerShell na jednym komputerze (znanym jako "komputer lokalny"), ale polecenia są uruchamiane na innym komputerze (nazywanym "komputerem zdalnym"). Doświadczenie pracy zdalnej powinno być tak samo jak praca bezpośrednio na komputerze zdalnym, jak to możliwe.

Uwaga

Aby można było używać komunikacji zdalnej programu PowerShell, należy skonfigurować komputer zdalny do komunikacji zdalnej. Aby uzyskać więcej informacji, zobacz about_Remote_Requirements.

Czy na obu komputerach musi być zainstalowany program PowerShell?

Tak. Aby pracować zdalnie, komputery lokalne i zdalne muszą mieć program PowerShell, program Microsoft .NET Framework i protokół Web Services for Management (WS-Management). Wszystkie pliki i inne zasoby potrzebne do wykonania określonego polecenia muszą znajdować się na komputerze zdalnym.

Komputery z programem Windows PowerShell 3.0 i komputerami z programem Windows PowerShell 2.0 mogą łączyć się ze sobą zdalnie i uruchamiać polecenia zdalne. Jednak niektóre funkcje, takie jak możliwość odłączenia od sesji i ponownego nawiązywania z nią połączenia, działają tylko wtedy, gdy oba komputery korzystają z programu Windows PowerShell 3.0.

Musisz mieć uprawnienia do nawiązywania połączenia z komputerem zdalnym, uprawnienia do uruchamiania programu PowerShell oraz uprawnienia dostępu do magazynów danych (takich jak pliki i foldery) oraz rejestru na komputerze zdalnym.

Aby uzyskać więcej informacji, zobacz about_Remote_Requirements.

Jak działa komunikacja zdalna?

Po przesłaniu polecenia zdalnego polecenie jest przesyłane przez sieć do aparatu programu PowerShell na komputerze zdalnym i jest uruchamiane w kliencie programu PowerShell na komputerze zdalnym. Wyniki polecenia są wysyłane z powrotem do komputera lokalnego i wyświetlane w sesji programu PowerShell na komputerze lokalnym.

Aby przesyłać polecenia i odbierać dane wyjściowe, program PowerShell używa protokołu WS-Management. Aby uzyskać informacje na temat protokołu WS-Management, zobacz protokół WS-Management Protocol w dokumentacji systemu Windows.

Począwszy od programu Windows PowerShell 3.0, sesje zdalne są przechowywane na komputerze zdalnym. Dzięki temu można odłączyć się od sesji i ponownie nawiązać połączenie z inną sesją lub innym komputerem bez przerywania poleceń lub utraty stanu.

Czy komunikacja zdalna programu PowerShell jest bezpieczna?

Podczas nawiązywania połączenia z komputerem zdalnym system używa poświadczeń nazwy użytkownika i hasła na komputerze lokalnym lub poświadczeń, które podajesz w poleceniu, aby zalogować się do komputera zdalnego. Poświadczenia i pozostała część transmisji są szyfrowane.

Aby dodać dodatkową ochronę, można skonfigurować komputer zdalny do używania protokołu SECURE Sockets Layer (SSL) zamiast protokołu HTTP do nasłuchiwania żądań zdalnego zarządzania systemem Windows (WinRM). Następnie użytkownicy mogą używać parametru Invoke-CommandUseSSL poleceń cmdlet , New-PSSessioni Enter-PSSession podczas nawiązywania połączenia. Ta opcja używa bezpieczniejszego kanału HTTPS zamiast protokołu HTTP.

Czy wszystkie polecenia zdalne wymagają komunikacji zdalnej programu PowerShell?

L.p. Niektóre polecenia cmdlet mają parametr ComputerName , który umożliwia pobieranie obiektów z komputera zdalnego.

Te polecenia cmdlet nie używają komunikacji zdalnej programu PowerShell. Dlatego można ich używać na dowolnym komputerze z uruchomionym programem PowerShell, nawet jeśli komputer nie jest skonfigurowany do komunikacji zdalnej programu PowerShell lub jeśli komputer nie spełnia wymagań dotyczących komunikacji zdalnej programu PowerShell.

Te polecenia cmdlet obejmują następujące elementy:

  • Get-Hotfix
  • Rename-Computer
  • Restart-Computer
  • Stop-Computer

Aby znaleźć wszystkie polecenia cmdlet z parametrem ComputerName , wpisz:

Get-Help * -Parameter ComputerName
# or
Get-Command -ParameterName ComputerName

Aby określić, czy parametr ComputerName określonego polecenia cmdlet wymaga komunikacji zdalnej programu PowerShell, zobacz opis parametru. Aby wyświetlić opis parametru, wpisz:

Get-Help <cmdlet-name> -Parameter ComputerName

Na przykład:

Get-Help Get-Hotfix -Parameter ComputerName

W przypadku wszystkich innych poleceń użyj Invoke-Command polecenia cmdlet .

Jak mogę uruchomić polecenie na komputerze zdalnym?

Aby uruchomić polecenie na komputerze zdalnym, użyj Invoke-Command polecenia cmdlet .

Ujmij polecenie w nawiasach klamrowych ({}), aby utworzyć blok skryptu. Użyj parametru ScriptBlock polecenia , Invoke-Command aby określić polecenie .

Możesz użyć parametru ComputerName parametru , Invoke-Command aby określić komputer zdalny. Możesz też utworzyć trwałe połączenie z komputerem zdalnym (sesją), a następnie użyć parametru Invoke-Command Sesja , aby uruchomić polecenie w sesji.

Na przykład następujące polecenia uruchamiają Get-Process polecenie zdalnie.

Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-Process}

#  - OR -

Invoke-Command -Session $s -ScriptBlock {Get-Process}

Aby przerwać zdalne polecenie, wpisz CTRL+C. Żądanie przerwania jest przekazywane do komputera zdalnego, gdzie kończy zdalne polecenie.

Aby uzyskać więcej informacji na temat poleceń zdalnych, zobacz about_Remote i tematy Pomocy dotyczące poleceń cmdlet, które obsługują komunikacji zdalnej.

Czy mogę po prostu telnet na komputerze zdalnym?

Możesz użyć Enter-PSSession polecenia cmdlet , aby rozpocząć sesję interaktywną z komputerem zdalnym.

W wierszu polecenia programu PowerShell wpisz:

Enter-PSSession <ComputerName>

Wiersz polecenia zmieni się, aby pokazać, że masz połączenie z komputerem zdalnym.

<ComputerName>\C:>

Teraz polecenia, które są uruchamiane na komputerze zdalnym tak, jakby były wpisywane bezpośrednio na komputerze zdalnym.

Aby zakończyć sesję interaktywną, wpisz:

Exit-PSSession

Sesja interaktywna to sesja trwała korzystająca z protokołu WS-Management. Nie jest on taki sam jak w przypadku korzystania z telnetu, ale zapewnia podobne środowisko.

Aby uzyskać więcej informacji, zobacz Enter-PSSession.

Czy mogę utworzyć trwałe połączenie?

Tak. Polecenia zdalne można uruchamiać, określając nazwę komputera zdalnego, jego nazwę NetBIOS lub jego adres IP. Można też uruchamiać polecenia zdalne, określając sesję programu PowerShell (PSSession), która jest połączona z komputerem zdalnym.

W przypadku korzystania z parametru ComputerName programu Invoke-Command lub Enter-PSSessionprogram PowerShell ustanawia tymczasowe połączenie. Program PowerShell używa połączenia do uruchamiania tylko bieżącego polecenia, a następnie zamyka połączenie. Jest to bardzo wydajna metoda uruchamiania jednego polecenia lub kilku niepowiązanych poleceń, nawet na wielu komputerach zdalnych.

Gdy używasz New-PSSession polecenia cmdlet do utworzenia programu PSSession, program PowerShell ustanawia trwałe połączenie dla programu PSSession. Następnie można uruchomić wiele poleceń w programie PSSession, w tym polecenia, które udostępniają dane.

Zazwyczaj program PSSession tworzy serię powiązanych poleceń, które udostępniają dane. W przeciwnym razie tymczasowe połączenie utworzone przez parametr ComputerName jest wystarczające dla większości poleceń.

Aby uzyskać więcej informacji na temat sesji, zobacz about_PSSessions.

Czy można uruchamiać polecenia na więcej niż jednym komputerze jednocześnie?

Tak. Parametr Invoke-Command ComputerName polecenia cmdlet akceptuje wiele nazw komputerów, a parametr Sesja akceptuje wiele psSessions.

Po uruchomieniu Invoke-Command polecenia program PowerShell uruchamia polecenia na wszystkich określonych komputerach lub we wszystkich określonych psSessions.

Program PowerShell może zarządzać setkami współbieżnych połączeń zdalnych. Jednak liczba poleceń zdalnych, które można wysłać, może być ograniczona przez zasoby komputera i jego pojemność do ustanawiania i obsługi wielu połączeń sieciowych.

Aby uzyskać więcej informacji, zobacz przykład w temacie Invoke-Command Pomoc.

Gdzie znajdują się moje profile?

Profile programu PowerShell nie są uruchamiane automatycznie w sesjach zdalnych, więc polecenia, które dodaje profil, nie są obecne w sesji. Ponadto zmienna automatyczna $profile nie jest wypełniana w sesjach zdalnych.

Aby uruchomić profil w sesji, użyj Invoke-Command polecenia cmdlet .

Na przykład następujące polecenie uruchamia profil CurrentUserCurrentHost z komputera lokalnego w sesji w $sprogramie .

Invoke-Command -Session $s -FilePath $profile

Następujące polecenie uruchamia profil CurrentUserCurrentHost z komputera zdalnego w sesji w $sprogramie . Ponieważ zmienna $profile nie jest wypełniana, polecenie używa jawnej ścieżki do profilu.

Invoke-Command -Session $s {
  . "$home\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"
}

Po uruchomieniu tego polecenia polecenia, które profil dodaje do sesji, są dostępne w pliku $s.

Skrypt uruchamiania można również użyć w konfiguracji sesji, aby uruchomić profil w każdej sesji zdalnej korzystającej z konfiguracji sesji.

Aby uzyskać więcej informacji na temat profilów programu PowerShell, zobacz about_Profiles. Aby uzyskać więcej informacji na temat konfiguracji sesji, zobacz Register-PSSessionConfiguration.

Jak ograniczanie przepływności działa na poleceniach zdalnych?

Aby ułatwić zarządzanie zasobami na komputerze lokalnym, program PowerShell zawiera funkcję ograniczania poszczególnych poleceń, która pozwala ograniczyć liczbę współbieżnych połączeń zdalnych ustanowionych dla każdego polecenia.

Wartość domyślna to 32 połączenia współbieżne, ale można użyć parametru ThrottleLimit poleceń cmdlet, aby ustawić niestandardowy limit ograniczania dla określonych poleceń.

W przypadku korzystania z funkcji ograniczania należy pamiętać, że jest ona stosowana do każdego polecenia, a nie do całej sesji ani do komputera. Jeśli uruchamiasz polecenia współbieżnie w kilku sesjach lub sesjach PSSessions, liczba współbieżnych połączeń jest sumą współbieżnych połączeń we wszystkich sesjach.

Aby znaleźć polecenia cmdlet z parametrem ThrottleLimit , wpisz:

Get-Help * -Parameter ThrottleLimit
-or-
Get-Command -ParameterName ThrottleLimit

Czy dane wyjściowe poleceń zdalnych różnią się od danych wyjściowych lokalnych?

Jeśli używasz programu PowerShell lokalnie, wysyłasz i odbierasz obiekty programu .NET Framework "live"; Obiekty "live" to obiekty, które są skojarzone z rzeczywistymi programami lub składnikami systemu. Podczas wywoływania metod lub zmieniania właściwości obiektów na żywo zmiany wpływają na rzeczywisty program lub składnik. Po zmianie właściwości programu lub składnika właściwości obiektu, które je reprezentują, również się zmieniają.

Jednak ponieważ większość obiektów na żywo nie może być przesyłana za pośrednictwem sieci, program PowerShell "serializuje" większość obiektów wysyłanych w poleceniach zdalnych, czyli konwertuje każdy obiekt na serię elementów danych XML (Constraint Language in XML [CLiXML]) na potrzeby transmisji.

Gdy program PowerShell odbiera serializowany obiekt, konwertuje kod XML na zdeserializowany typ obiektu. Zdeserializowany obiekt jest dokładnym rekordem właściwości programu lub składnika w poprzednim czasie, ale nie jest już "żywy", czyli nie jest już bezpośrednio skojarzony z składnikiem. Metody są usuwane, ponieważ nie są już skuteczne.

Zazwyczaj można używać zdeserializowanych obiektów tak samo jak obiekty na żywo, ale należy pamiętać o ich ograniczeniach. Ponadto obiekty zwracane przez Invoke-Command polecenie cmdlet mają dodatkowe właściwości, które ułatwiają określenie źródła polecenia.

Niektóre typy obiektów, takie jak obiekty DirectoryInfo i identyfikatory GUID, są konwertowane z powrotem na obiekty na żywo po ich odebraniu. Te obiekty nie wymagają specjalnej obsługi ani formatowania.

Aby uzyskać informacje na temat interpretowania i formatowania zdalnych danych wyjściowych, zobacz about_Remote_Output.

Czy można zdalnie uruchamiać zadania w tle?

Tak. Zadanie w tle programu PowerShell to polecenie programu PowerShell uruchamiane asynchronicznie bez interakcji z sesją. Po uruchomieniu zadania w tle wiersz polecenia jest zwracany natychmiast i można kontynuować pracę w sesji, gdy zadanie jest uruchamiane, nawet jeśli jest uruchamiane przez dłuższy czas.

Zadanie w tle można uruchomić nawet wtedy, gdy inne polecenia są uruchomione, ponieważ zadania w tle są zawsze uruchamiane asynchronicznie w sesji tymczasowej.

Zadania w tle można uruchamiać na komputerze lokalnym lub zdalnym. Domyślnie zadanie w tle jest uruchamiane na komputerze lokalnym. Można jednak użyć parametru Invoke-Command AsJob polecenia cmdlet, aby uruchomić dowolne zdalne polecenie jako zadanie w tle. Można też użyć Invoke-Command polecenia do zdalnego uruchomienia Start-Job polecenia.

Aby uzyskać więcej informacji na temat zadań w tle w programie PowerShell, zobacz about_Jobs i about_Remote_Jobs.

Czy można uruchamiać programy systemu Windows na komputerze zdalnym?

Polecenia zdalne programu PowerShell umożliwiają uruchamianie programów opartych na systemie Windows na komputerach zdalnych. Można na przykład uruchomić Shutdown.exe program lub Ipconfig.exe na komputerze zdalnym.

Nie można jednak użyć poleceń programu PowerShell, aby otworzyć interfejs użytkownika dla dowolnego programu na komputerze zdalnym.

Po uruchomieniu programu systemu Windows na komputerze zdalnym polecenie nie zostanie ukończone, a wiersz polecenia programu PowerShell nie zostanie zwrócony, dopóki program nie zostanie zakończony lub dopóki nie zostanie wciśnięty klawisz CTRL+C, aby przerwać polecenie. Jeśli na przykład uruchomisz Ipconfig.exe program na komputerze zdalnym, wiersz polecenia nie zostanie zwrócony do momentu Ipconfig.exe ukończenia.

Jeśli używasz poleceń zdalnych do uruchomienia programu z interfejsem użytkownika, proces programu zostanie uruchomiony, ale interfejs użytkownika nie zostanie wyświetlony. Polecenie programu PowerShell nie zostanie ukończone, a wiersz polecenia nie zostanie zwrócony do momentu zatrzymania procesu programu lub do momentu naciśnięcia klawisza CTRL+C, który przerywa działanie polecenia i zatrzymuje proces.

Jeśli na przykład używasz polecenia programu PowerShell do uruchamiania Notepad na komputerze zdalnym, proces Notatnik jest uruchamiany na komputerze zdalnym, ale interfejs użytkownika Notatnik nie jest wyświetlany. Aby przerwać polecenie i przywrócić wiersz polecenia, naciśnij klawisze CTRL+C.

Czy mogę ograniczyć polecenia, które użytkownicy mogą uruchamiać zdalnie na moim komputerze?

Tak. Każda sesja zdalna musi używać jednej z konfiguracji sesji na komputerze zdalnym. Konfiguracje sesji można zarządzać na komputerze (oraz uprawnieniami do tych konfiguracji sesji), aby określić, kto może uruchamiać polecenia zdalnie na komputerze i które polecenia mogą uruchamiać.

Konfiguracja sesji konfiguruje środowisko dla sesji. Konfigurację można zdefiniować przy użyciu zestawu, który implementuje nową klasę konfiguracji lub za pomocą skryptu uruchamianego w sesji. Konfiguracja może określić polecenia, które są dostępne w sesji. Ponadto konfiguracja może obejmować ustawienia, które chronią komputer, takie jak ustawienia, które ograniczają ilość danych, które sesja może odbierać zdalnie w jednym obiekcie lub poleceniu. Można również określić deskryptor zabezpieczeń, który określa uprawnienia wymagane do korzystania z konfiguracji.

Polecenie Enable-PSRemoting cmdlet tworzy domyślne konfiguracje sesji na komputerze: Microsoft.PowerShell, Microsoft.PowerShell.Workflow i Microsoft.PowerShell32 (tylko systemy operacyjne 64-bitowe). Enable-PSRemotingUstawia deskryptor zabezpieczeń dla konfiguracji, aby zezwolić na korzystanie z nich tylko członkom grupy Administracja istratorów na komputerze.

Polecenia cmdlet konfiguracji sesji umożliwiają edytowanie domyślnych konfiguracji sesji, tworzenie nowych konfiguracji sesji oraz zmienianie deskryptorów zabezpieczeń wszystkich konfiguracji sesji.

Począwszy od programu Windows PowerShell 3.0, New-PSSessionConfigurationFile polecenie cmdlet umożliwia tworzenie niestandardowych konfiguracji sesji przy użyciu pliku tekstowego. Plik zawiera opcje ustawiania trybu języka oraz określania poleceń cmdlet i modułów, które są dostępne w sesjach korzystających z konfiguracji sesji.

Gdy użytkownicy używają poleceń cmdlet , New-PSSessionlub Enter-PSSession , mogą użyć parametru Invoke-CommandConfigurationName, aby wskazać konfigurację sesji, która jest używana na potrzeby sesji. Ponadto mogą zmienić domyślną konfigurację używaną przez sesje, zmieniając wartość $PSSessionConfigurationName zmiennej preferencji w sesji.

Aby uzyskać więcej informacji na temat konfiguracji sesji, zobacz Pomoc dotyczącą poleceń cmdlet konfiguracji sesji. Aby znaleźć polecenia cmdlet konfiguracji sesji, wpisz:

Get-Command *PSSessionConfiguration

Co to są konfiguracje wentylatora i wentylatora?

Najczęstszym scenariuszem komunikacji zdalnej programu PowerShell obejmującym wiele komputerów jest konfiguracja jeden do wielu, w której jeden komputer lokalny (komputer administratora) uruchamia polecenia programu PowerShell na wielu komputerach zdalnych. Jest to nazywane scenariuszem "fan-out".

Jednak w niektórych przedsiębiorstwach konfiguracja jest wiele do jednego, gdzie wiele komputerów klienckich łączy się z jednym komputerem zdalnym z uruchomionym programem PowerShell, takim jak serwer plików lub kiosk. Jest to nazywane konfiguracją "fan-in".

Komunikacja zdalna programu PowerShell obsługuje zarówno konfiguracje fan-out, jak i fan-in.

W przypadku konfiguracji fan-out program PowerShell używa protokołu Web Services for Management (WS-Management) i usługi WinRM obsługującej implementację usługi WS-Management firmy Microsoft. Gdy komputer lokalny łączy się z komputerem zdalnym, usługa WS-Management ustanawia połączenie i używa wtyczki dla programu PowerShell do uruchomienia procesu hosta programu PowerShell (Wsmprovhost.exe) na komputerze zdalnym. Użytkownik może określić alternatywny port, konfigurację sesji alternatywnej i inne funkcje w celu dostosowania połączenia zdalnego.

Aby obsługiwać konfigurację "fan-in", program PowerShell używa internetowych usług informacyjnych (IIS) do hostowania usług WS-Management, ładowania wtyczki programu PowerShell i uruchamiania programu PowerShell. W tym scenariuszu zamiast uruchamiać każdą sesję programu PowerShell w osobnym procesie, wszystkie sesje programu PowerShell są uruchamiane w tym samym procesie hosta.

Hostowanie usług IIS i zdalne zarządzanie fanami nie jest obsługiwane w systemie Windows XP lub Windows Server 2003.

W konfiguracji fana użytkownik może określić identyfikator URI połączenia i punkt końcowy HTTP, w tym transport, nazwę komputera, port i nazwę aplikacji. Usługi IIS przekazują wszystkie żądania o określonej nazwie aplikacji do aplikacji. Wartość domyślna to WS-Management, która może hostować program PowerShell.

Można również określić mechanizm uwierzytelniania i zablokować lub zezwolić na przekierowywanie z punktów końcowych HTTP i HTTPS.

Czy mogę przetestować komunikacja zdalną na jednym komputerze, który nie jest w domenie?

Tak. Komunikacja zdalna programu PowerShell jest dostępna nawet wtedy, gdy komputer lokalny nie znajduje się w domenie. Możesz użyć funkcji komunikacji zdalnie, aby nawiązać połączenie z sesjami i utworzyć sesje na tym samym komputerze. Funkcje działają tak samo jak podczas nawiązywania połączenia z komputerem zdalnym.

Aby uruchomić polecenia zdalne na komputerze w grupie roboczej, zmień następujące ustawienia systemu Windows na komputerze.

Uwaga: te ustawienia wpływają na wszystkich użytkowników w systemie i mogą sprawić, że system będzie bardziej narażony na złośliwy atak. Podczas wprowadzania tych zmian należy zachować ostrożność.

  • Windows Vista, Windows 7, Windows 8:

    Utwórz następujący wpis rejestru, a następnie ustaw jego wartość na 1: LocalAccountTokenFilterPolicy w HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

    Aby dodać ten wpis, możesz użyć następującego polecenia programu PowerShell:

    $parameters = @{
      Path='HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System'
      Name='LocalAccountTokenFilterPolicy'
      propertyType='DWord'
      Value=1
    }
    New-ItemProperty @parameters
    
  • Windows Server 2003, Windows Server 2008, Windows Server 2012, Windows Server 2012 R2:

    Nie są wymagane żadne zmiany, ponieważ domyślne ustawienie zasad "Dostęp do sieci: udostępnianie i model zabezpieczeń dla kont lokalnych" to "Klasyczny". Sprawdź, czy ustawienie zostało zmienione.

Czy można uruchamiać polecenia zdalne na komputerze w innej domenie?

Tak. Zazwyczaj polecenia są uruchamiane bez błędu, chociaż może być konieczne użycie parametru Invoke-CommandCredential elementu , New-PSSessionlub Enter-PSSession poleceń cmdlet w celu podania poświadczeń członka grupy Administracja istrators na komputerze zdalnym. Czasami jest to wymagane nawet wtedy, gdy bieżący użytkownik jest członkiem grupy Administracja istratorów na komputerach lokalnych i zdalnych.

Jeśli jednak komputer zdalny nie znajduje się w domenie zaufanej przez komputer lokalny, komputer zdalny może nie być w stanie uwierzytelnić poświadczeń użytkownika.

Aby włączyć uwierzytelnianie, użyj następującego polecenia, aby dodać komputer zdalny do listy zaufanych hostów dla komputera lokalnego w usłudze WinRM. Wpisz polecenie w wierszu polecenia programu PowerShell.

Set-Item WSMan:\localhost\Client\TrustedHosts -Value <Remote-computer-name>

Aby na przykład dodać komputer Server01 do listy zaufanych hostów na komputerze lokalnym, wpisz następujące polecenie w wierszu polecenia programu PowerShell:

Set-Item WSMan:\localhost\Client\TrustedHosts -Value Server01

Czy program PowerShell obsługuje komunikacji zdalnej za pośrednictwem protokołu SSH?