Invoke-Command

Uruchamia polecenia na komputerach lokalnych i zdalnych.

Składnia

Invoke-Command
      [-ScriptBlock] <ScriptBlock>
      [-NoNewScope]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-Session] <PSSession[]>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-FilePath] <String>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-Session] <PSSession[]>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-ComputerName] <String[]>]
      [-Credential <PSCredential>]
      [-Port <Int32>]
      [-UseSSL]
      [-ConfigurationName <String>]
      [-ApplicationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-InDisconnectedSession]
      [-SessionName <String[]>]
      [-HideComputerName]
      [-JobName <String>]
      [-FilePath] <String>
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-ComputerName] <String[]>]
      [-Credential <PSCredential>]
      [-Port <Int32>]
      [-UseSSL]
      [-ConfigurationName <String>]
      [-ApplicationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-InDisconnectedSession]
      [-SessionName <String[]>]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-CertificateThumbprint <String>]
      [<CommonParameters>]
Invoke-Command
      [-Credential <PSCredential>]
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [[-ConnectionUri] <Uri[]>]
      [-AsJob]
      [-InDisconnectedSession]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-AllowRedirection]
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-CertificateThumbprint <String>]
      [<CommonParameters>]
Invoke-Command
      [-Credential <PSCredential>]
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [[-ConnectionUri] <Uri[]>]
      [-AsJob]
      [-InDisconnectedSession]
      [-HideComputerName]
      [-JobName <String>]
      [-FilePath] <String>
      [-AllowRedirection]
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-ScriptBlock] <ScriptBlock>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-VMId] <Guid[]>
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-ScriptBlock] <ScriptBlock>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -VMName <String[]>
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-FilePath] <String>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-VMId] <Guid[]>
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-FilePath] <String>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -VMName <String[]>
      [<CommonParameters>]
Invoke-Command
      [-Port <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      -HostName <String[]>
      [-UserName <String>]
      [-KeyFilePath <String>]
      [-SSHTransport]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-Subsystem <String>]
      [<CommonParameters>]
Invoke-Command
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-RunAsAdministrator]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -ContainerId <String[]>
      [<CommonParameters>]
Invoke-Command
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-FilePath] <String>
      [-RunAsAdministrator]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -ContainerId <String[]>
      [<CommonParameters>]
Invoke-Command
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      -SSHConnection <Hashtable[]>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-AsJob]
      [-HideComputerName]
      -FilePath <String>
      -HostName <String[]>
      [-UserName <String>]
      [-KeyFilePath <String>]
      [-SSHTransport]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-AsJob]
      [-HideComputerName]
      -FilePath <String>
      -SSHConnection <Hashtable[]>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]

Opis

Polecenie Invoke-Command cmdlet uruchamia polecenia na komputerze lokalnym lub zdalnym i zwraca wszystkie dane wyjściowe z poleceń, w tym błędy. Za pomocą jednego Invoke-Command polecenia można uruchamiać polecenia na wielu komputerach.

Aby uruchomić jedno polecenie na komputerze zdalnym, użyj parametru ComputerName . Aby uruchomić serię powiązanych poleceń, które udostępniają dane, użyj New-PSSession polecenia cmdlet , aby utworzyć usługę PSSession (trwałe połączenie) na komputerze zdalnym, a następnie użyć parametru Invoke-CommandSession polecenia , aby uruchomić polecenie w programie PSSession. Aby uruchomić polecenie w rozłączonej sesji, użyj parametru InDisconnectedSession . Aby uruchomić polecenie w zadaniu w tle, użyj parametru AsJob .

Można również użyć Invoke-Command na komputerze lokalnym do uruchomienia bloku skryptu jako polecenia. Program PowerShell uruchamia blok skryptu natychmiast w zakresie podrzędnym bieżącego zakresu.

Przed użyciem Invoke-Command do uruchamiania poleceń na komputerze zdalnym przeczytaj about_Remote.

Począwszy od programu PowerShell 6.0, można użyć protokołu Secure Shell (SSH) do nawiązania połączenia z poleceniami i wywołania ich na komputerach zdalnych. Protokół SSH musi być zainstalowany na komputerze lokalnym, a komputer zdalny musi być skonfigurowany z punktem końcowym SSH programu PowerShell. Zaletą sesji zdalnej programu PowerShell opartej na protokole SSH jest to, że działa ona na wielu platformach (Windows, Linux, macOS). W przypadku sesji opartej na protokole SSH należy użyć parametrów HostName lub SSHConnection w celu określenia komputera zdalnego i odpowiednich informacji o połączeniu. Aby uzyskać więcej informacji o sposobie konfigurowania komunikacji zdalnej SSH programu PowerShell, zobacz PowerShell Remoting Over SSH (Komunikacja zdalna programu PowerShell za pośrednictwem protokołu SSH).

Niektóre przykłady kodu używają splattingu, aby zmniejszyć długość wiersza. Aby uzyskać więcej informacji, zobacz about_Splatting.

Przykłady

Przykład 1. Uruchamianie skryptu na serwerze

W tym przykładzie Test.ps1 skrypt jest uruchamiany na komputerze Server01.

Invoke-Command -FilePath c:\scripts\test.ps1 -ComputerName Server01

Parametr FilePath określa skrypt znajdujący się na komputerze lokalnym. Skrypt jest uruchamiany na komputerze zdalnym, a wyniki są zwracane do komputera lokalnego.

Przykład 2. Uruchamianie polecenia na serwerze zdalnym

W tym przykładzie jest uruchamiane polecenie na komputerze zdalnym Get-Culture Server01.

Invoke-Command -ComputerName Server01 -Credential Domain01\User01 -ScriptBlock { Get-Culture }

Parametr ComputerName określa nazwę komputera zdalnego. Parametr Credential służy do uruchamiania polecenia w kontekście zabezpieczeń Domain01\User01, użytkownik, który ma uprawnienia do uruchamiania poleceń. Parametr ScriptBlock określa polecenie, które ma być uruchamiane na komputerze zdalnym.

W odpowiedzi program PowerShell żąda hasła i metody uwierzytelniania dla konta User01. Następnie uruchamia polecenie na komputerze Server01 i zwraca wynik.

Przykład 3. Uruchamianie polecenia w połączeniu trwałym

W tym przykładzie jest uruchamiane to samo Get-Culture polecenie w sesji przy użyciu połączenia trwałego na komputerze zdalnym o nazwie Server02.

$s = New-PSSession -ComputerName Server02 -Credential Domain01\User01
Invoke-Command -Session $s -ScriptBlock {Get-Culture}

Polecenie New-PSSession cmdlet tworzy sesję na komputerze zdalnym Server02 i zapisuje ją w zmiennej $s . Zazwyczaj można utworzyć sesję tylko wtedy, gdy uruchamiasz serię poleceń na komputerze zdalnym.

Polecenie Invoke-Command cmdlet uruchamia polecenie Get-Culture na serwerze Server02. Parametr Sesja określa sesję zapisaną w zmiennej $s .

W odpowiedzi program PowerShell uruchamia polecenie w sesji na komputerze Server02.

Przykład 4. Używanie sesji do uruchamiania serii poleceń, które współdzielą dane

W tym przykładzie porównane są efekty użycia parametrów ComputerName i Session elementu Invoke-Command. Pokazuje, jak używać sesji do uruchamiania serii poleceń, które współużytkować te same dane.

Invoke-Command -ComputerName Server02 -ScriptBlock {$p = Get-Process PowerShell}
Invoke-Command -ComputerName Server02 -ScriptBlock {$p.VirtualMemorySize}
$s = New-PSSession -ComputerName Server02
Invoke-Command -Session $s -ScriptBlock {$p = Get-Process PowerShell}
Invoke-Command -Session $s -ScriptBlock {$p.VirtualMemorySize}

17930240

Pierwsze dwa polecenia używają parametru ComputerName do Invoke-Command uruchamiania poleceń na komputerze zdalnym Server02. Pierwsze polecenie używa Get-Process polecenia cmdlet do pobrania procesu programu PowerShell na komputerze zdalnym i zapisania go w zmiennej $p . Drugie polecenie pobiera wartość właściwości VirtualMemorySize procesu programu PowerShell.

W przypadku korzystania z parametru ComputerName program PowerShell tworzy nową sesję, aby uruchomić polecenie . Sesja jest zamykana po zakończeniu polecenia. Zmienna została utworzona $p w jednym połączeniu, ale nie istnieje w połączeniu utworzonym dla drugiego polecenia.

Problem został rozwiązany przez utworzenie sesji trwałej na komputerze zdalnym, a następnie uruchomienie obu poleceń w tej samej sesji.

Polecenie New-PSSession cmdlet tworzy sesję trwałą na komputerze Server02 i zapisuje sesję w zmiennej $s . Poniższe Invoke-Command wiersze używają parametru Sesja do uruchamiania obu poleceń w tej samej sesji. Ponieważ oba polecenia są uruchamiane w tej samej sesji, wartość pozostaje aktywna $p .

Przykład 5. Wywoływanie polecenia z blokiem skryptu przechowywanym w zmiennej

W tym przykładzie pokazano, jak uruchomić polecenie przechowywane jako blok skryptu w zmiennej. Po zapisaniu bloku skryptu w zmiennej można określić zmienną jako wartość parametru ScriptBlock .

$command = { Get-WinEvent -LogName PowerShellCore/Operational |
  Where-Object {$_.Message -like "*certificate*"} }
Invoke-Command -ComputerName S1, S2 -ScriptBlock $command

Zmienna $command przechowuje Get-WinEvent polecenie sformatowane jako blok skryptu. Polecenie Invoke-Command jest uruchamiane na $command komputerach zdalnych S1 i S2.

Przykład 6. Uruchamianie pojedynczego polecenia na kilku komputerach

W tym przykładzie pokazano, jak używać Invoke-Command polecenia do uruchamiania jednego polecenia na wielu komputerach.

$parameters = @{
  ComputerName = "Server01", "Server02", "TST-0143", "localhost"
  ConfigurationName = 'MySession.PowerShell'
  ScriptBlock = { Get-WinEvent -LogName PowerShellCore/Operational }
}
Invoke-Command @parameters

Parametr ComputerName określa rozdzielaną przecinkami listę nazw komputerów. Lista komputerów zawiera wartość localhost, która reprezentuje komputer lokalny. Parametr ConfigurationName określa konfigurację sesji alternatywnej. Parametr ScriptBlock jest uruchamiany Get-WinEvent w celu pobrania dzienników zdarzeń programu PowerShellCore/Operational z każdego komputera.

Przykład 7. Pobieranie wersji programu hosta na wielu komputerach

W tym przykładzie jest pobierana wersja programu hosta programu PowerShell uruchomionego na 200 komputerach zdalnych.

$version = Invoke-Command -ComputerName (Get-Content Machines.txt) -ScriptBlock {(Get-Host).Version}

Ponieważ jest uruchamiane tylko jedno polecenie, nie trzeba tworzyć trwałych połączeń z poszczególnymi komputerami. Zamiast tego polecenie używa parametru ComputerName , aby wskazać komputery. Aby określić komputery, używa Get-Content polecenia cmdlet do pobrania zawartości pliku Machine.txt, pliku nazw komputerów.

Polecenie Invoke-Command cmdlet uruchamia Get-Host polecenie na komputerach zdalnych. Używa notacji kropkowej, aby uzyskać właściwość Version hosta programu PowerShell.

Te polecenia są uruchamiane pojedynczo. Po zakończeniu wykonywania poleceń dane wyjściowe poleceń ze wszystkich komputerów są zapisywane w zmiennej $version . Dane wyjściowe zawierają nazwę komputera, z którego pochodzą dane.

Przykład 8. Uruchamianie zadania w tle na kilku komputerach zdalnych

W tym przykładzie jest uruchamiane polecenie na dwóch komputerach zdalnych. Polecenie Invoke-Command używa parametru AsJob , aby polecenie było uruchamiane jako zadanie w tle. Polecenia są uruchamiane na komputerach zdalnych, ale zadanie istnieje na komputerze lokalnym. Wyniki są przesyłane na komputer lokalny.

$s = New-PSSession -ComputerName Server01, Server02
Invoke-Command -Session $s -ScriptBlock {Get-EventLog system} -AsJob

Id   Name    State      HasMoreData   Location           Command
---  ----    -----      -----         -----------        ---------------
1    Job1    Running    True          Server01,Server02  Get-EventLog system

$j = Get-Job
$j | Format-List -Property *

HasMoreData   : True
StatusMessage :
Location      : Server01,Server02
Command       : Get-EventLog system
JobStateInfo  : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : e124bb59-8cb2-498b-a0d2-2e07d4e030ca
Id            : 1
Name          : Job1
ChildJobs     : {Job2, Job3}
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}
StateChanged  :

$results = $j | Receive-Job

Polecenie New-PSSession cmdlet tworzy sesje na komputerach zdalnych Server01 i Server02. Polecenie Invoke-Command cmdlet uruchamia zadanie w tle w każdej sesji. Polecenie używa parametru AsJob , aby uruchomić polecenie jako zadanie w tle. To polecenie zwraca obiekt zadania, który zawiera dwa obiekty podrzędne zadania, jeden dla każdego z zadań uruchomionych na dwóch komputerach zdalnych.

Polecenie Get-Job zapisuje obiekt zadania w zmiennej $j . Zmienna $j jest następnie potokowana do polecenia cmdlet, Format-List aby wyświetlić wszystkie właściwości obiektu zadania na liście. Ostatnie polecenie pobiera wyniki zadań. Potokuje obiekt zadania do $jReceive-Job polecenia cmdlet i przechowuje wyniki w zmiennej $results .

Przykład 9. Uwzględnij zmienne lokalne w poleceniu uruchamianym na komputerze zdalnym

W tym przykładzie pokazano, jak uwzględnić wartości zmiennych lokalnych w poleceniu uruchamianym na komputerze zdalnym. Polecenie używa Using modyfikatora zakresu do identyfikowania zmiennej lokalnej w zdalnym poleceniu. Domyślnie wszystkie zmienne są definiowane w sesji zdalnej. Modyfikator Using zakresu został wprowadzony w programie PowerShell 3.0. Aby uzyskać więcej informacji na temat Using modyfikatora zakresu, zobacz about_Remote_Variables i about_Scopes.

$Log = "PowerShellCore/Operational"
Invoke-Command -ComputerName Server01 -ScriptBlock {Get-WinEvent -LogName $Using:Log -MaxEvents 10}

Zmienna $Log przechowuje nazwę dziennika zdarzeń, PowerShellCore/Operational. Polecenie Invoke-Command cmdlet jest uruchamiane Get-WinEvent na serwerze Server01, aby pobrać dziesięć najnowszych zdarzeń z dziennika zdarzeń. Wartość parametru LogName to $Log zmienna poprzedzona modyfikatorem Using zakresu wskazująca, że została utworzona w sesji lokalnej, a nie w sesji zdalnej.

Przykład 10: Ukrywanie nazwy komputera

W tym przykładzie pokazano efekt użycia parametru HideComputerName polecenia Invoke-Command. HideComputerName nie zmienia obiektu zwracane przez to polecenie cmdlet. Zmienia tylko ekran. Nadal można użyć poleceń cmdlet Format , aby wyświetlić właściwość PsComputerName dowolnego z obiektów, których dotyczy problem.

Invoke-Command -ComputerName S1, S2 -ScriptBlock {Get-Process PowerShell}

PSComputerName    Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   ProcessName
--------------    -------  ------    -----      ----- -----   ------     --   -----------
S1                575      15        45100      40988   200     4.68     1392 PowerShell
S2                777      14        35100      30988   150     3.68     67   PowerShell

Invoke-Command -ComputerName S1, S2 -ScriptBlock {Get-Process PowerShell} -HideComputerName

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   ProcessName
-------  ------    -----      ----- -----   ------     --   -----------
575      15        45100      40988   200     4.68     1392 PowerShell
777      14        35100      30988   150     3.68     67   PowerShell

Pierwsze dwa polecenia służą Invoke-Command do uruchamiania Get-Process polecenia dla procesu programu PowerShell. Dane wyjściowe pierwszego polecenia zawierają właściwość PsComputerName , która zawiera nazwę komputera, na którym uruchomiono polecenie. Dane wyjściowe drugiego polecenia, które używa hideComputerName, nie zawierają kolumny PsComputerName .

Przykład 11. Używanie słowa kluczowego Param w bloku skryptu

Słowo Param kluczowe i parametr ArgumentList są używane do przekazywania wartości zmiennych do nazwanych parametrów w bloku skryptu. W tym przykładzie są wyświetlane nazwy plików rozpoczynające się literą a i mają .pdf rozszerzenie.

Aby uzyskać więcej informacji na temat słowa kluczowego Param , zobacz about_Language_Keywords.

$parameters = @{
    ComputerName = "Server01"
    ScriptBlock = { Param ($param1,$param2) Get-ChildItem -Name $param1 -Include $param2 }
    ArgumentList = "a*", "*.pdf"
}
Invoke-Command @parameters

aa.pdf
ab.pdf
ac.pdf
az.pdf

Invoke-Command używa parametru ScriptBlock , który definiuje dwie zmienne $param1 i $param2. Get-ChildItem używa nazwanych parametrów, Name i Include z nazwami zmiennych. ArgumentList przekazuje wartości do zmiennych.

Przykład 12. Używanie $args zmiennej automatycznej w bloku skryptu

Zmienna automatyczna $args i parametr ArgumentList są używane do przekazywania wartości tablicy do pozycji parametrów w bloku skryptu. W tym przykładzie jest wyświetlana zawartość katalogu serwera plików .txt . Parametr Get-ChildItemŚcieżka to pozycja 0, a parametr filtru to pozycja 1.

Aby uzyskać więcej informacji na temat zmiennej $args , zobacz about_Automatic_Variables

$parameters = @{
    ComputerName = "Server01"
    ScriptBlock = { Get-ChildItem $args[0] $args[1] }
    ArgumentList = "C:\Test", "*.txt*"
}
Invoke-Command @parameters

Directory: C:\Test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           6/12/2019    15:15            128 alog.txt
-a---           7/27/2019    15:16            256 blog.txt
-a---           9/28/2019    17:10             64 zlog.txt

Invoke-Command używa parametru ScriptBlock i Get-ChildItem określa $args[0] wartości tablicy i $args[1] . ArgumentList przekazuje $args wartości tablicy do pozycji parametrów Get-ChildItemścieżki i filtru.

Przykład 13: Uruchamianie skryptu na wszystkich komputerach wymienionych w pliku tekstowym

W tym przykładzie Invoke-Command użyto polecenia cmdlet do uruchomienia skryptu Sample.ps1 na wszystkich komputerach wymienionych w Servers.txt pliku. Polecenie używa parametru FilePath do określenia pliku skryptu. To polecenie umożliwia uruchomienie skryptu na komputerach zdalnych, nawet jeśli plik skryptu nie jest dostępny dla komputerów zdalnych.

Invoke-Command -ComputerName (Get-Content Servers.txt) -FilePath C:\Scripts\Sample.ps1 -ArgumentList Process, Service

Po przesłaniu polecenia zawartość Sample.ps1 pliku jest kopiowana do bloku skryptu, a blok skryptu jest uruchamiany na każdym z komputerów zdalnych. Ta procedura jest równoważna użyciu parametru ScriptBlock w celu przesłania zawartości skryptu.

Przykład 14: Uruchamianie polecenia na komputerze zdalnym przy użyciu identyfikatora URI

W tym przykładzie pokazano, jak uruchomić polecenie na komputerze zdalnym zidentyfikowanym przez identyfikator URI (Uniform Resource Identifier). W tym konkretnym przykładzie jest uruchamiane Set-Mailbox polecenie na zdalnym serwerze Exchange.

$LiveCred = Get-Credential
$parameters = @{
  ConfigurationName = 'Microsoft.Exchange'
  ConnectionUri = 'https://ps.exchangelabs.com/PowerShell'
  Credential = $LiveCred
  Authentication = 'Basic'
  ScriptBlock = {Set-Mailbox Dan -DisplayName "Dan Park"}
}
Invoke-Command @parameters

Pierwszy wiersz używa Get-Credential polecenia cmdlet do przechowywania poświadczeń identyfikatora Windows Live ID w zmiennej $LiveCred . Program PowerShell monituje użytkownika o wprowadzenie poświadczeń usługi Windows Live ID.

Zmienna $parameters to tabela skrótu zawierająca parametry, które mają zostać przekazane do Invoke-Command polecenia cmdlet. Polecenie Invoke-Command cmdlet uruchamia Set-Mailbox polecenie przy użyciu konfiguracji sesji Microsoft.Exchange . Parametr ConnectionURI określa adres URL punktu końcowego serwera Exchange. Parametr Credential określa poświadczenia przechowywane w zmiennej $LiveCred . Parametr AuthenticationMechanism określa użycie uwierzytelniania podstawowego. Parametr ScriptBlock określa blok skryptu, który zawiera polecenie.

Przykład 15. Użyj opcji sesji

W tym przykładzie pokazano, jak utworzyć i użyć parametru SessionOption .

$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
Invoke-Command -ComputerName server01 -UseSSL -ScriptBlock { Get-HotFix } -SessionOption $so -Credential server01\user01

Polecenie New-PSSessionOption cmdlet tworzy obiekt opcji sesji, który powoduje, że zdalny koniec nie weryfikuje urzędu certyfikacji, nazwy kanonicznej i list odwołania podczas oceniania przychodzącego połączenia HTTPS. Obiekt SessionOption jest zapisywany w zmiennej $so .

Uwaga

Wyłączenie tych kontroli jest wygodne do rozwiązywania problemów, ale oczywiście nie jest bezpieczne.

Polecenie Invoke-Command cmdlet uruchamia Get-HotFix zdalnie. Parametr SessionOption otrzymuje zmienną $so .

Przykład 16. Zarządzanie przekierowaniem identyfikatora URI w poleceniu zdalnym

W tym przykładzie pokazano, jak za pomocą parametrów AllowRedirection i SessionOption zarządzać przekierowaniem identyfikatora URI w zdalnym poleceniu.

$max = New-PSSessionOption -MaximumRedirection 1
$parameters = @{
  ConnectionUri = "https://ps.exchangelabs.com/PowerShell"
  ScriptBlock = { Get-Mailbox dan }
  AllowRedirection = $true
  SessionOption = $max
}
Invoke-Command @parameters

Polecenie New-PSSessionOption cmdlet tworzy obiekt PSSessionOption zapisany w zmiennej $max . Polecenie używa parametru MaximumRedirection , aby ustawić właściwość MaximumConnectionRedirectionCount obiektu PSSessionOption na 1.

Polecenie Invoke-Command cmdlet uruchamia Get-Mailbox polecenie na zdalnym Microsoft Exchange Server. Parametr AllowRedirection zapewnia jawne uprawnienia do przekierowywania połączenia do alternatywnego punktu końcowego. Parametr SessionOption używa obiektu sesji przechowywanego w zmiennej $max .

W związku z tym, jeśli komputer zdalny określony przez identyfikator ConnectionURI zwróci komunikat przekierowania, program PowerShell przekierowuje połączenie, ale jeśli nowe miejsce docelowe zwróci inny komunikat przekierowania, wartość liczby przekierowań 1 zostanie przekroczona i Invoke-Command zwróci błąd niepowodujący zakończenia.

Przykład 17. Uzyskiwanie dostępu do udziału sieciowego w sesji zdalnej

W tym przykładzie pokazano, jak uzyskać dostęp do udziału sieciowego z sesji zdalnej. Do zademonstrowania przykładu służą trzy komputery. Server01 to komputer lokalny, Server02 to komputer zdalny, a Net03 zawiera udział sieciowy. Serwer01 łączy się z serwerem Server02, a następnie serwer02 wykonuje drugi przeskok do net03 w celu uzyskania dostępu do udziału sieciowego. Aby uzyskać więcej informacji na temat sposobu komunikacji zdalnej programu PowerShell obsługuje przeskoki między komputerami, zobacz Tworzenie drugiego przeskoku w programie PowerShell Remoting.

Wymagane delegowanie dostawcy obsługi zabezpieczeń poświadczeń (CredSSP) jest włączone w ustawieniach klienta na komputerze lokalnym i w ustawieniach usługi na komputerze zdalnym. Aby uruchomić polecenia w tym przykładzie, musisz być członkiem grupy Administratorzy na komputerze lokalnym i komputerze zdalnym.

Enable-WSManCredSSP -Role Client -DelegateComputer Server02
$s = New-PSSession Server02
Invoke-Command -Session $s -ScriptBlock {Enable-WSManCredSSP -Role Server -Force}
$parameters = @{
  ComputerName = 'Server02'
  ScriptBlock = { Get-Item \\Net03\Scripts\LogFiles.ps1 }
  Authentication = "CredSSP"
  Credential = "Domain01\Admin01"
}
Invoke-Command @parameters

Polecenie Enable-WSManCredSSP cmdlet umożliwia delegowanie CredSSP z komputera lokalnego Server01 do komputera zdalnego Server02. Parametr Rola określa klienta , aby skonfigurować ustawienie klienta CredSSP na komputerze lokalnym.

New-PSSession Tworzy obiekt PSSession dla serwera Server02 i przechowuje obiekt w zmiennej $s .

Polecenie Invoke-Command cmdlet używa zmiennej $s do nawiązywania połączenia z komputerem zdalnym Server02. Parametr ScriptBlock jest uruchamiany Enable-WSManCredSSP na komputerze zdalnym. Parametr Rola określa serwer, aby skonfigurować ustawienie serwera CredSSP na komputerze zdalnym.

Zmienna $parameters zawiera wartości parametrów do nawiązania połączenia z udziałem sieciowym. Polecenie Invoke-Command cmdlet uruchamia Get-Item polecenie w sesji w programie $s. To polecenie pobiera skrypt z \\Net03\Scripts udziału sieciowego. Polecenie używa parametru Authentication z wartością CredSSP i parametru Credential z wartością Domain01\Admin01.

Przykład 18. Uruchamianie skryptów na wielu komputerach zdalnych

W tym przykładzie skrypt jest uruchamiany na ponad stu komputerach. Aby zminimalizować wpływ na komputer lokalny, łączy się z każdym komputerem, uruchamia skrypt, a następnie odłącza się od każdego komputera. Skrypt będzie nadal uruchamiany w sesjach rozłączonych.

$parameters = @{
  ComputerName = (Get-Content -Path C:\Test\Servers.txt)
  InDisconnectedSession = $true
  FilePath = "\\Scripts\Public\ConfigInventory.ps1"
  SessionOption = @{OutputBufferingMode="Drop";IdleTimeout=43200000}
}
Invoke-Command @parameters

Polecenie używa Invoke-Command polecenia do uruchomienia skryptu. Wartość parametru ComputerName to Get-Content polecenie, które pobiera nazwy komputerów zdalnych z pliku tekstowego. Parametr InDisconnectedSession rozłącza sesje zaraz po uruchomieniu polecenia. Wartość parametru FilePath to skrypt uruchamiany Invoke-Command na każdym komputerze.

Wartość SessionOption jest tabelą skrótów. Wartość OutputBufferingMode jest ustawiona na Wartość Drop , a wartość IdleTimeout jest ustawiona na 432000000 milisekund (12 godzin).

Aby uzyskać wyniki poleceń i skryptów uruchamianych w rozłączonych sesjach, użyj Receive-PSSession polecenia cmdlet .

Przykład 19: Uruchamianie polecenia na komputerze zdalnym przy użyciu protokołu SSH

W tym przykładzie pokazano, jak uruchomić polecenie na komputerze zdalnym przy użyciu protokołu Secure Shell (SSH). Jeśli na komputerze zdalnym skonfigurowano protokół SSH w celu wyświetlenia monitu o podanie haseł, zostanie wyświetlony monit o hasło. W przeciwnym razie należy użyć uwierzytelniania użytkownika opartego na kluczu SSH.

Invoke-Command -HostName UserA@LinuxServer01 -ScriptBlock { Get-MailBox * }

Przykład 20: Uruchamianie polecenia na komputerze zdalnym przy użyciu protokołu SSH i określanie klucza uwierzytelniania użytkownika

W tym przykładzie pokazano, jak uruchomić polecenie na komputerze zdalnym przy użyciu protokołu SSH i określić plik klucza na potrzeby uwierzytelniania użytkownika. Nie zostanie wyświetlony monit o podanie hasła, chyba że uwierzytelnianie klucza zakończy się niepowodzeniem, a komputer zdalny jest skonfigurowany tak, aby zezwalał na podstawowe uwierzytelnianie haseł.

Invoke-Command -HostName UserA@LinuxServer01 -ScriptBlock { Get-MailBox * } -KeyFilePath /UserA/UserAKey_rsa

Przykład 21: Uruchamianie pliku skryptu na wielu komputerach zdalnych przy użyciu protokołu SSH jako zadania

W tym przykładzie pokazano, jak uruchomić plik skryptu na wielu komputerach zdalnych przy użyciu protokołu SSH i zestawu parametrów SSHConnection . Parametr SSHConnection przyjmuje tablicę tabel skrótów, które zawierają informacje o połączeniu dla każdego komputera. W tym przykładzie wymagane jest, aby docelowe komputery zdalne miały skonfigurowany protokół SSH do obsługi uwierzytelniania użytkowników opartego na kluczach.

$sshConnections =
@{ HostName="WinServer1"; UserName="Domain\UserA"; KeyFilePath="C:\Users\UserA\id_rsa" },
@{ HostName="UserB@LinuxServer5"; KeyFilePath="/Users/UserB/id_rsa" }
$results = Invoke-Command -FilePath c:\Scripts\CollectEvents.ps1 -SSHConnection $sshConnections

Parametry

-AllowRedirection

Umożliwia przekierowanie tego połączenia do alternatywnego identyfikatora URI (Uniform Resource Identifier).

Jeśli używasz parametru ConnectionURI , lokalizacja docelowa zdalna może zwrócić instrukcję, aby przekierować do innego identyfikatora URI. Domyślnie program PowerShell nie przekierowuje połączeń, ale można użyć tego parametru, aby umożliwić mu przekierowanie połączenia.

Można również ograniczyć liczbę przekierowań połączenia, zmieniając wartość opcji sesji MaximumConnectionRedirectionCount . Użyj parametru New-PSSessionOptionMaximumRedirection polecenia cmdlet lub ustaw właściwość MaximumConnectionRedirectionCount zmiennej $PSSessionOption preferencji. Wartość domyślna to 5.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ApplicationName

Określa segment nazwy aplikacji identyfikatora URI połączenia. Użyj tego parametru, aby określić nazwę aplikacji, jeśli nie używasz parametru ConnectionURI w poleceniu .

Wartość domyślna to wartość zmiennej $PSSessionApplicationName preferencji na komputerze lokalnym. Jeśli ta zmienna preferencji nie jest zdefiniowana, wartość domyślna to WSMAN. Ta wartość jest odpowiednia dla większości zastosowań. Aby uzyskać więcej informacji, zobacz about_Preference_Variables.

Usługa WinRM używa nazwy aplikacji, aby wybrać odbiornik do obsługi żądania połączenia. Wartość tego parametru powinna być zgodna z wartością właściwości URLPrefix odbiornika na komputerze zdalnym.

Type:String
Position:Named
Default value:$PSSessionApplicationName if set on the local computer, otherwise WSMAN
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-ArgumentList

Dostarcza wartości parametrów dla skryptblock. Parametry w bloku skryptu są przekazywane według pozycji z wartości tablicy dostarczonej do ArgumentList. Jest to znane jako splatting tablicy. Aby uzyskać więcej informacji na temat zachowania argumentlist, zobacz about_Splatting.

Type:Object[]
Aliases:Args
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-AsJob

Wskazuje, że to polecenie cmdlet uruchamia polecenie jako zadanie w tle na komputerze zdalnym. Użyj tego parametru, aby uruchomić polecenia, które potrwają dużo czasu.

Gdy używasz parametru AsJob , polecenie zwraca obiekt reprezentujący zadanie, a następnie wyświetla wiersz polecenia. Możesz kontynuować pracę w sesji, gdy zadanie zostanie zakończone. Aby zarządzać zadaniem, użyj *-Job poleceń cmdlet. Aby uzyskać wyniki zadania, użyj Receive-Job polecenia cmdlet .

Parametr AsJob przypomina zdalne uruchamianie Start-Job polecenia cmdlet za pomocą Invoke-Command polecenia cmdlet. Jednak w przypadku zadania AsJob zadanie jest tworzone na komputerze lokalnym, mimo że zadanie jest uruchamiane na komputerze zdalnym. Wyniki zadania zdalnego są automatycznie zwracane do komputera lokalnego.

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

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Authentication

Określa mechanizm używany do uwierzytelniania poświadczeń użytkownika. Uwierzytelnianie CredSSP jest dostępne tylko w systemach Windows Vista, Windows Server 2008 i nowszych wersjach systemu operacyjnego Windows.

Dopuszczalne wartości tego parametru są następujące:

  • Domyślny
  • Podstawowa
  • Credssp
  • Szyfrowane
  • Kerberos
  • Negotiate
  • NegotiateWithImplicitCredential

Wartość domyślna to Domyślna.

Aby uzyskać więcej informacji na temat wartości tego parametru, zobacz AuthenticationMechanism Enumeration (Wyliczenie AuthenticationMechanism).

Przestroga

Uwierzytelnianie dostawcy obsługi zabezpieczeń poświadczeń (CredSSP), w którym poświadczenia użytkownika są przekazywane do komputera zdalnego do uwierzytelnienia, jest przeznaczone do poleceń wymagających uwierzytelniania w więcej niż jednym zasobie, na przykład uzyskiwania dostępu do udziału sieci zdalnej. Ten mechanizm zwiększa ryzyko bezpieczeństwa operacji zdalnej. Jeśli bezpieczeństwo komputera zdalnego zostanie naruszone, poświadczenia przekazane do niego mogą służyć do kontrolowania sesji sieciowej. Aby uzyskać więcej informacji, zobacz Dostawca obsługi zabezpieczeń poświadczeń.

Type:AuthenticationMechanism
Accepted values:Basic, Default, Credssp, Digest, Kerberos, Negotiate, NegotiateWithImplicitCredential
Position:Named
Default value:Default
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-CertificateThumbprint

Określa cyfrowy certyfikat klucza publicznego (X509) konta użytkownika z uprawnieniami do nawiązywania połączenia z rozłączną sesją. Wprowadź odcisk palca certyfikatu certyfikatu.

Certyfikaty są używane w uwierzytelnianiu opartym na certyfikatach klienta. Mogą być mapowane tylko na konta użytkowników lokalnych i nie działają z kontami domeny.

Aby uzyskać odcisk palca certyfikatu, użyj Get-Item polecenia lub Get-ChildItem w dysku PowerShell Cert: drive.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ComputerName

Określa komputery, na których jest uruchamiane polecenie. Wartością domyślną jest komputer lokalny.

Gdy używasz parametru ComputerName , program PowerShell tworzy tymczasowe połączenie, które jest używane tylko do uruchamiania określonego polecenia, a następnie jest zamykane. Jeśli potrzebujesz trwałego połączenia, użyj parametru Sesja .

Wpisz nazwę NETBIOS, adres IP lub w pełni kwalifikowaną nazwę domeny co najmniej jednego komputera na liście rozdzielanej przecinkami. Aby określić komputer lokalny, wpisz nazwę komputera, localhost lub kropkę (.).

Aby użyć adresu IP w wartości ComputerName, polecenie musi zawierać parametr Credential . Komputer musi być skonfigurowany do transportu HTTPS lub adres IP komputera zdalnego musi być uwzględniony na liście Zaufanych hostów usługi WinRM komputera lokalnego. Aby uzyskać instrukcje dotyczące dodawania nazwy komputera do listy TrustedHosts , zobacz How to Add a Computer to the Trusted Host List (Jak dodać komputer do listy zaufanych hostów).

W systemie Windows Vista i nowszych wersjach systemu operacyjnego Windows, aby uwzględnić komputer lokalny w wartości ComputerName, należy uruchomić program PowerShell przy użyciu opcji Uruchom jako administrator .

Type:String[]
Aliases:Cn
Position:0
Default value:Local computer
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ConfigurationName

Określa konfigurację sesji, która jest używana dla nowej sesji PSSession.

Wprowadź nazwę konfiguracji lub w pełni kwalifikowany identyfikator URI zasobu dla konfiguracji sesji. Jeśli określisz tylko nazwę konfiguracji, następujący identyfikator URI schematu jest wstępnie utworzony: http://schemas.microsoft.com/PowerShell.

W przypadku użycia z protokołem SSH ten parametr określa podsystem do użycia na obiekcie docelowym zgodnie z definicją w pliku sshd_config. Wartością domyślną powershell protokołu SSH jest podsystem.

Konfiguracja sesji dla sesji znajduje się na komputerze zdalnym. Jeśli określona konfiguracja sesji nie istnieje na komputerze zdalnym, polecenie zakończy się niepowodzeniem.

Wartość domyślna to wartość zmiennej $PSSessionConfigurationName preferencji na komputerze lokalnym. Jeśli ta zmienna preferencji nie jest ustawiona, wartość domyślna to Microsoft.PowerShell. Aby uzyskać więcej informacji, zobacz about_Preference_Variables.

Type:String
Position:Named
Default value:$PSSessionConfigurationName if set on the local computer, otherwise Microsoft.PowerShell
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-ConnectionUri

Określa identyfikator URI (Uniform Resource Identifier), który definiuje punkt końcowy połączenia sesji. Identyfikator URI musi być w pełni kwalifikowany.

Format tego ciągu jest następujący:

<Transport>://<ComputerName>:<Port>/<ApplicationName>

Wartość domyślna jest następująca:

http://localhost:5985/WSMAN

Jeśli nie określisz identyfikatora URI połączenia, możesz użyć parametrów UseSSL i Port , aby określić wartości identyfikatora URI połączenia.

Prawidłowe wartości segmentu Transport identyfikatora URI to HTTP i HTTPS. Jeśli określisz identyfikator URI połączenia z segmentem Transport, ale nie określisz portu, sesja zostanie utworzona przy użyciu portów standardów: 80 dla protokołu HTTP i 443 dla protokołu HTTPS. Aby użyć domyślnych portów komunikacji zdalnej programu PowerShell, określ port 5985 dla protokołu HTTP lub 5986 dla protokołu HTTPS.

Jeśli komputer docelowy przekierowuje połączenie z innym identyfikatorem URI, program PowerShell uniemożliwia przekierowanie, chyba że użyjesz parametru AllowRedirection w poleceniu .

Type:Uri[]
Aliases:URI, CU
Position:0
Default value:http://localhost:5985/WSMAN
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ContainerId

Określa tablicę identyfikatorów kontenerów.

Type:String[]
Position:Named
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Credential

Określa konto użytkownika, które ma uprawnienia do wykonania tej akcji. Wartość domyślna to użytkownik bieżący.

Wpisz nazwę użytkownika, taką jak User01 lub Domain01\User01, lub wprowadź obiekt PSCredential wygenerowany przez Get-Credential polecenie cmdlet. Jeśli wpiszesz nazwę użytkownika, zostanie wyświetlony monit o wprowadzenie hasła.

Poświadczenia są przechowywane w obiekcie PSCredential , a hasło jest przechowywane jako secureString.

Uwaga

Aby uzyskać więcej informacji na temat ochrony danych za pomocą protokołu SecureString , zobacz Jak bezpieczny jest protokół SecureString?.

Type:PSCredential
Position:Named
Default value:Current user
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-EnableNetworkAccess

Wskazuje, że to polecenie cmdlet dodaje interakcyjny token zabezpieczający do sesji sprzężenia zwrotnego. Token interaktywny umożliwia uruchamianie poleceń w sesji sprzężenia zwrotnego, które pobierają dane z innych komputerów. Na przykład można uruchomić polecenie w sesji, która kopiuje pliki XML z komputera zdalnego do komputera lokalnego.

Sesja sprzężenia zwrotnego to sesja PSSession , która pochodzi i kończy się na tym samym komputerze. Aby utworzyć sesję sprzężenia zwrotnego, pomiń parametr ComputerName lub ustaw jego wartość na kropkę (.), localhost lub nazwę komputera lokalnego.

Domyślnie sesje sprzężenia zwrotnego są tworzone przy użyciu tokenu sieciowego, który może nie zapewniać wystarczających uprawnień do uwierzytelniania na komputerach zdalnych.

Parametr EnableNetworkAccess jest skuteczny tylko w sesjach sprzężenia zwrotnego. Jeśli podczas tworzenia sesji na komputerze zdalnym używasz funkcji EnableNetworkAccess , polecenie zakończy się pomyślnie, ale parametr zostanie zignorowany.

Dostęp zdalny można zezwolić na dostęp zdalny w sesji sprzężenia zwrotnego przy użyciu wartości CredSSP parametru uwierzytelniania , który deleguje poświadczenia sesji do innych komputerów.

Aby chronić komputer przed złośliwym dostępem, rozłączone sesje sprzężenia zwrotnego, które mają tokeny interakcyjne, które są tworzone przy użyciu funkcji EnableNetworkAccess, można ponownie połączyć tylko z komputera, na którym utworzono sesję. Rozłączone sesje korzystające z uwierzytelniania CredSSP można ponownie połączyć z innymi komputerami. Aby uzyskać więcej informacji, zobacz Disconnect-PSSession.

Ten parametr został wprowadzony w programie PowerShell 3.0.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-FilePath

Określa skrypt lokalny, który to polecenie cmdlet jest uruchamiane na co najmniej jednym komputerze zdalnym. Wprowadź ścieżkę i nazwę pliku skryptu lub potok ścieżkę skryptu do Invoke-Command. Skrypt musi istnieć na komputerze lokalnym lub w katalogu, do którego komputer lokalny może uzyskać dostęp. Użyj metody ArgumentList , aby określić wartości parametrów w skry skrycie.

W przypadku użycia tego parametru program PowerShell konwertuje zawartość określonego pliku skryptu na blok skryptu, przesyła blok skryptu na komputer zdalny i uruchamia go na komputerze zdalnym.

Type:String
Aliases:PSPath
Position:1
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-HideComputerName

Wskazuje, że to polecenie cmdlet pomija nazwę komputera każdego obiektu z wyświetlania danych wyjściowych. Domyślnie nazwa komputera, który wygenerował obiekt, jest wyświetlana na ekranie.

Ten parametr ma wpływ tylko na wyświetlanie danych wyjściowych. Nie zmienia obiektu.

Type:SwitchParameter
Aliases:HCN
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-HostName

Określa tablicę nazw komputerów dla połączenia opartego na protokole Secure Shell (SSH). Jest to podobne do parametru ComputerName , z tą różnicą, że połączenie z komputerem zdalnym jest nawiązywane przy użyciu protokołu SSH, a nie windows WinRM.

Ten parametr został wprowadzony w programie PowerShell 6.0.

Type:String[]
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-InDisconnectedSession

Wskazuje, że to polecenie cmdlet uruchamia polecenie lub skrypt w rozłączonej sesji.

W przypadku użycia parametru Invoke-CommandInDisconnectedSession program tworzy sesję trwałą na każdym komputerze zdalnym, uruchamia polecenie określone przez parametr ScriptBlock lub FilePath, a następnie rozłącza się z sesją. Polecenia są nadal uruchamiane w rozłączonych sesjach. Polecenie InDisconnectedSession umożliwia uruchamianie poleceń bez konieczności utrzymywania połączenia z sesjami zdalnymi. Ponieważ sesja zostanie rozłączona przed zwróceniem jakichkolwiek wyników, funkcja InDisconnectedSession upewnia się, że wszystkie wyniki polecenia są zwracane do ponownie połączonej sesji, zamiast dzielić między sesje.

Nie można użyć polecenia InDisconnectedSession z parametrem Session lub parametrem AsJob .

Polecenia używające polecenia InDisconnectedSession zwracają obiekt PSSession reprezentujący rozłączonej sesji. Nie zwracają danych wyjściowych polecenia. Aby nawiązać połączenie z rozłączną sesją, użyj Connect-PSSession poleceń cmdlet lub Receive-PSSession . Aby uzyskać wyniki poleceń uruchomionych w sesji, użyj Receive-PSSession polecenia cmdlet . Aby uruchomić polecenia, które generują dane wyjściowe w rozłączonej sesji, ustaw wartość opcji sesji OutputBufferingMode na Drop. Jeśli zamierzasz nawiązać połączenie z rozłączną sesją, ustaw limit czasu bezczynności w sesji, aby zapewnić wystarczający czas na nawiązanie połączenia przed usunięciem sesji.

Możesz ustawić tryb buforowania danych wyjściowych i limit czasu bezczynności w parametrze SessionOption lub w zmiennej $PSSessionOption preferencji. Aby uzyskać więcej informacji na temat opcji sesji, zobacz New-PSSessionOption i about_Preference_Variables.

Aby uzyskać więcej informacji na temat funkcji Rozłączone sesje, zobacz about_Remote_Disconnected_Sessions.

Ten parametr został wprowadzony w programie PowerShell 3.0.

Type:SwitchParameter
Aliases:Disconnected
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

Określa dane wejściowe polecenia. Wprowadź zmienną zawierającą obiekty lub wpisz polecenie lub wyrażenie, które pobiera obiekty.

W przypadku korzystania z parametru InputObject użyj $Input zmiennej automatycznej w wartości parametru ScriptBlock do reprezentowania obiektów wejściowych.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-JobName

Określa przyjazną nazwę zadania w tle. Domyślnie zadania mają nazwę Job<n>, gdzie <n> jest liczbą porządkową.

Jeśli używasz parametru JobName w poleceniu, polecenie jest uruchamiane jako zadanie i Invoke-Command zwraca obiekt zadania, nawet jeśli w poleceniu nie zostanie dołączone zadanie AsJob .

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

Type:String
Position:Named
Default value:Job<n>
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-KeyFilePath

Określa ścieżkę pliku klucza używaną przez protokół Secure Shell (SSH) do uwierzytelniania użytkownika na komputerze zdalnym.

Protokół SSH umożliwia uwierzytelnianie użytkowników za pośrednictwem kluczy prywatnych i publicznych jako alternatywę dla podstawowego uwierzytelniania haseł. Jeśli komputer zdalny jest skonfigurowany do uwierzytelniania za pomocą klucza, ten parametr może służyć do podania klucza identyfikującego użytkownika.

Ten parametr został wprowadzony w programie PowerShell 6.0.

Type:String
Aliases:IdentityFilePath
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-NoNewScope

Wskazuje, że to polecenie cmdlet uruchamia określone polecenie w bieżącym zakresie. Domyślnie Invoke-Command uruchamia polecenia we własnym zakresie.

Ten parametr jest prawidłowy tylko w poleceniach uruchamianych w bieżącej sesji, czyli polecenia pomijające parametry ComputerName i Session .

Ten parametr został wprowadzony w programie PowerShell 3.0.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Port

Określa port sieciowy na komputerze zdalnym, który jest używany dla tego polecenia. Aby nawiązać połączenie z komputerem zdalnym, komputer zdalny musi nasłuchiwać na porcie używanym przez połączenie. Domyślne porty to 5985 (port usługi WinRM dla protokołu HTTP) i 5986 (port WinRM dla protokołu HTTPS).

Przed użyciem alternatywnego portu skonfiguruj odbiornik WinRM na komputerze zdalnym do nasłuchiwania na tym porcie. Aby skonfigurować odbiornik, wpisz następujące dwa polecenia w wierszu polecenia programu PowerShell:

Remove-Item -Path WSMan:\Localhost\listener\listener* -Recurse

New-Item -Path WSMan:\Localhost\listener -Transport http -Address * -Port \<port-number\>

Nie używaj parametru Port , chyba że musisz. Port ustawiony w poleceniu dotyczy wszystkich komputerów lub sesji, na których jest uruchamiane polecenie. Alternatywne ustawienie portu może uniemożliwić uruchomienie polecenia na wszystkich komputerach.

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-RemoteDebug

Służy do uruchamiania wywołanego polecenia w trybie debugowania w zdalnej sesji programu PowerShell.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-RunAsAdministrator

Wskazuje, że to polecenie cmdlet wywołuje polecenie jako administrator.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ScriptBlock

Określa polecenia do uruchomienia. Należy ująć polecenia w nawiasy klamrowe ({ }), aby utworzyć blok skryptu. W przypadku używania Invoke-Command polecenia do zdalnego uruchamiania wszystkie zmienne w poleceniu są oceniane na komputerze zdalnym.

Uwaga

Parametry bloku skryptu można przekazać tylko z argumentlist według pozycji. Nie można przekazać parametrów przełącznika przez położenie. Jeśli potrzebujesz parametru, który zachowuje się jak typ SwitchParameter , zamiast tego użyj typu logicznego .

Type:ScriptBlock
Aliases:Command
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Session

Określa tablicę sesji, w których to polecenie cmdlet uruchamia polecenie. Wprowadź zmienną zawierającą obiekty PSSession lub polecenie, które tworzy lub pobiera obiekty PSSession , takie jak New-PSSession polecenie lub Get-PSSession .

Podczas tworzenia programu PSSession program PowerShell ustanawia trwałe połączenie z komputerem zdalnym. Użyj programu PSSession , aby uruchomić serię powiązanych poleceń, które współużytkujące dane. Aby uruchomić jedno polecenie lub serię niepowiązanych poleceń, użyj parametru ComputerName . Aby uzyskać więcej informacji, zobacz about_PSSessions.

Type:PSSession[]
Position:0
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-SessionName

Określa przyjazną nazwę rozłączonej sesji. Możesz użyć nazwy , aby odwołać się do sesji w kolejnych poleceniach, takich jak Get-PSSession polecenie. Ten parametr jest prawidłowy tylko w przypadku parametru InDisconnectedSession .

Ten parametr został wprowadzony w programie PowerShell 3.0.

Type:String[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-SessionOption

Określa opcje zaawansowane dla sesji. Wprowadź obiekt SessionOption , taki jak obiekt utworzony za pomocą New-PSSessionOption polecenia cmdlet lub tabela skrótów, w której klucze są nazwami opcji sesji, a wartości są wartościami opcji sesji.

Wartości domyślne opcji są określane przez wartość zmiennej $PSSessionOption preferencji, jeśli jest ustawiona. W przeciwnym razie wartości domyślne są ustanawiane przez opcje ustawione w konfiguracji sesji.

Wartości opcji sesji mają pierwszeństwo przed wartościami domyślnymi sesji ustawionymi w zmiennej $PSSessionOption preferencji i w konfiguracji sesji. Nie mają jednak pierwszeństwa przed maksymalnymi wartościami, limitami przydziału ani limitami ustawionymi w konfiguracji sesji.

Aby uzyskać opis opcji sesji, które zawierają wartości domyślne, zobacz New-PSSessionOption. Aby uzyskać informacje o zmiennej $PSSessionOption preferencji, zobacz about_Preference_Variables. Aby uzyskać więcej informacji na temat konfiguracji sesji, zobacz Informacje o konfiguracjach sesji.

Type:PSSessionOption
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-SSHConnection

Ten parametr przyjmuje tablicę tabel skrótów, w których każda tabela skrótów zawiera co najmniej jeden parametr połączenia wymagany do nawiązania połączenia protokołu Secure Shell (SSH). Parametr SSHConnection jest przydatny do tworzenia wielu sesji, w których każda sesja wymaga różnych informacji o połączeniu.

Tabela skrótów ma następujące elementy członkowskie:

  • ComputerName (lub Nazwa hosta)
  • Port
  • Nazwę użytkownika
  • KeyFilePath (lub IdentityFilePath)

ComputerName (lub HostName) jest jedyną wymaganą parą klucz-wartość.

Ten parametr został wprowadzony w programie PowerShell 6.0.

Type:Hashtable[]
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-SSHTransport

Wskazuje, że połączenie zdalne zostało nawiązane przy użyciu protokołu Secure Shell (SSH).

Domyślnie program PowerShell używa usługi Windows WinRM do nawiązywania połączenia z komputerem zdalnym. Ten przełącznik wymusza użycie parametru HostName programu PowerShell do ustanowienia połączenia zdalnego opartego na protokole SSH.

Ten parametr został wprowadzony w programie PowerShell 6.0.

Type:SwitchParameter
Accepted values:true
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Subsystem

Określa podsystem SSH używany do nowej pssession.

Określa podsystem do użycia w obiekcie docelowym zgodnie z definicją w sshd_config. Podsystem uruchamia określoną wersję programu PowerShell ze wstępnie zdefiniowanymi parametrami. Jeśli określony podsystem nie istnieje na komputerze zdalnym, polecenie zakończy się niepowodzeniem.

Jeśli ten parametr nie jest używany, wartością domyślną jest podsystem "powershell".

Type:String
Position:Named
Default value:powershell
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-ThrottleLimit

Określa maksymalną liczbę połączeń współbieżnych, które można ustanowić, aby uruchomić to polecenie. Jeśli pominiesz ten parametr lub wprowadzisz wartość 0, zostanie użyta wartość domyślna 32.

Limit ograniczania dotyczy tylko bieżącego polecenia, a nie sesji lub komputera.

Type:Int32
Position:Named
Default value:32
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-UserName

Określa nazwę użytkownika konta używanego do uruchamiania polecenia na komputerze zdalnym. Metoda uwierzytelniania użytkownika zależy od konfiguracji protokołu Secure Shell (SSH) na komputerze zdalnym.

Jeśli protokół SSH jest skonfigurowany do podstawowego uwierzytelniania przy użyciu hasła, zostanie wyświetlony monit o podanie hasła użytkownika.

Jeśli protokół SSH jest skonfigurowany do uwierzytelniania użytkownika opartego na kluczach, ścieżkę pliku klucza można podać za pośrednictwem parametru KeyFilePath i nie zostanie wyświetlony monit o hasło. Jeśli plik klucza użytkownika klienta znajduje się w znanej lokalizacji SSH, parametr KeyFilePath nie jest wymagany do uwierzytelniania opartego na kluczach, a uwierzytelnianie użytkownika odbywa się automatycznie na podstawie nazwy użytkownika. Aby uzyskać więcej informacji, zobacz dokumentację protokołu SSH platformy dotyczącą uwierzytelniania użytkowników opartego na kluczach.

Nie jest to parametr wymagany. Jeśli parametr UserName nie zostanie określony, dla połączenia zostanie użyta bieżąca zalogowana nazwa użytkownika.

Ten parametr został wprowadzony w programie PowerShell 6.0.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-UseSSL

Wskazuje, że to polecenie cmdlet używa protokołu Secure Sockets Layer (SSL) do nawiązania połączenia z komputerem zdalnym. Domyślnie protokół SSL nie jest używany.

WS-Management szyfruje całą zawartość programu PowerShell przesyłaną przez sieć. Parametr UseSSL to dodatkowa ochrona, która wysyła dane za pośrednictwem protokołu HTTPS zamiast PROTOKOŁU HTTP.

Jeśli używasz tego parametru, ale protokół SSL nie jest dostępny na porcie używanym dla polecenia, polecenie zakończy się niepowodzeniem.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-VMId

Określa tablicę identyfikatorów maszyn wirtualnych.

Type:Guid[]
Aliases:VMGuid
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-VMName

Określa tablicę nazw maszyn wirtualnych.

Type:String[]
Position:Named
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

Dane wejściowe

ScriptBlock

Możesz przekazać polecenie w bloku skryptu do Invoke-Command. Użyj zmiennej automatycznej $Input , aby reprezentować obiekty wejściowe w poleceniu .

Dane wyjściowe

System.Management.Automation.PSRemotingJob, System.Management.Automation.Runspaces.PSSession, or the output of the invoked command

To polecenie cmdlet zwraca obiekt zadania, jeśli używasz parametru AsJob . Jeśli określisz parametr InDisconnectedSession , Invoke-Command zwraca obiekt PSSession . W przeciwnym razie zwraca dane wyjściowe wywołanego polecenia, czyli wartość parametru ScriptBlock .

Uwagi

W systemie Windows Vista, a nowsze wersje systemu operacyjnego Windows, aby użyć parametru Invoke-CommandComputerName do uruchomienia polecenia na komputerze lokalnym, należy uruchomić program PowerShell przy użyciu opcji Uruchom jako administrator.

Po uruchomieniu poleceń na wielu komputerach program PowerShell łączy się z komputerami w kolejności, w której są wyświetlane na liście. Jednak dane wyjściowe polecenia są wyświetlane w kolejności odbierania jej z komputerów zdalnych, co może się różnić.

Błędy, które wynikają z polecenia uruchamianego Invoke-Command , są uwzględniane w wynikach polecenia. Błędy, które mogłyby spowodować zakończenie błędów w poleceniu lokalnym, są traktowane jako błędy niepowodujące zakończenia w zdalnym poleceniu. Ta strategia zapewnia, że kończenie błędów na jednym komputerze nie zamyka polecenia na wszystkich komputerach, na których jest uruchomiona. Ta praktyka jest używana nawet wtedy, gdy polecenie zdalne jest uruchamiane na jednym komputerze.

Jeśli komputer zdalny nie znajduje się w domenie zaufanej przez komputer lokalny, komputer może nie być w stanie uwierzytelnić poświadczeń użytkownika. Aby dodać komputer zdalny do listy zaufanych hostów w usłudze WS-Management, użyj następującego polecenia w dostawcy WSMAN , gdzie <Remote-Computer-Name> jest nazwą komputera zdalnego:

Set-Item -Path WSMan:\Localhost\Client\TrustedHosts -Value \<Remote-Computer-Name\>

Gdy rozłączysz usługę PSSession przy użyciu parametru InDisconnectedSession , stan sesji jest rozłączony , a dostępność to Brak. Wartość właściwości State jest względna względem bieżącej sesji. Wartość Rozłączone oznacza, że usługa PSSession nie jest połączona z bieżącą sesją. Nie oznacza to jednak, że sesja PSSession jest odłączona od wszystkich sesji. Może być połączony z inną sesją. Aby określić, czy możesz nawiązać połączenie z sesją, czy ponownie nawiązać połączenie, użyj właściwości Availability .

Wartość Availability (Brak) wskazuje, że można nawiązać połączenie z sesją. Wartość Zajęty wskazuje, że nie można nawiązać połączenia z usługą PSSession , ponieważ jest połączona z inną sesją. Aby uzyskać więcej informacji na temat wartości właściwości State sesji, zobacz RunspaceState. Aby uzyskać więcej informacji na temat wartości właściwości Availability sesji, zobacz RunspaceAvailability.

Parametry HostName i SSHConnection zostały dołączone do programu PowerShell 6.0. Zostały one dodane w celu zapewnienia komunikacji zdalnej programu PowerShell na podstawie protokołu Secure Shell (SSH). Programy PowerShell i SSH są obsługiwane na wielu platformach (Windows, Linux, macOS) i komunikacji zdalnej programu PowerShell na tych platformach, na których zainstalowano i skonfigurowano program PowerShell oraz protokół SSH. Jest to oddzielone od poprzedniej komunikacji zdalnie systemu Windows opartej na usłudze WinRM, a wiele określonych funkcji i ograniczeń usługi WinRM nie ma zastosowania. Na przykład limity przydziału oparte na usłudze WinRM, opcje sesji, niestandardowa konfiguracja punktu końcowego i funkcje rozłączenia/ponownego połączenia nie są obecnie obsługiwane. Aby uzyskać więcej informacji o sposobie konfigurowania komunikacji zdalnej SSH programu PowerShell, zobacz PowerShell Remoting Over SSH (Komunikacja zdalna programu PowerShell za pośrednictwem protokołu SSH).