Udostępnij za pośrednictwem


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>]
      [-ConnectingTimeout <int>]
      [<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ć pojedyncze 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ć pssession (trwałe połączenie) na komputerze zdalnym, a następnie użyć parametru Session polecenia , Invoke-Command aby uruchomić polecenie w 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 polecenia 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), aby nawiązać połączenie z poleceniami i wywoływać je na komputerach zdalnych. Protokół SSH musi być zainstalowany na komputerze lokalnym, a komputer zdalny musi być skonfigurowany przy użyciu punktu końcowego protokołu SSH programu PowerShell. Zaletą sesji zdalnej programu PowerShell opartej na protokole SSH jest to, że działa na wielu platformach (Windows, Linux, macOS). W przypadku sesji opartej na protokole SSH parametry HostName lub SSHConnection umożliwiają określenie komputera zdalnego i odpowiednich informacji o połączeniu. Aby uzyskać więcej informacji na temat konfigurowania komunikacji zdalnej protokołu SSH programu PowerShell, zobacz Komunikacja zdalna programu PowerShell za pośrednictwem protokołu SSH.

Niektóre przykłady kodu używają fragmentowania, 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, który znajduje 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 uruchomiono Get-Culture polecenie na komputerze zdalnym 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 do uruchomienia 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 trwałym połączeniu

Ten przykład uruchamia 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 sesję można utworzyć tylko wtedy, gdy uruchamiasz serię poleceń na komputerze zdalnym.

Polecenie Invoke-Command cmdlet uruchamia Get-Culture polecenie 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. Uruchamianie serii poleceń współużytkujących dane za pomocą sesji

W tym przykładzie porównaliśmy efekty używania parametrów ComputerName i Session elementu Invoke-Command. Pokazuje, jak używać sesji do uruchamiania serii poleceń, które współużytkujące 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

Dwa pierwsze polecenia używają parametru ComputerName do Invoke-Command uruchamiania poleceń na komputerze zdalnym Server02. Pierwsze polecenie używa Get-Process polecenia cmdlet , aby pobrać proces programu PowerShell na komputerze zdalnym i zapisać 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ę do uruchomienia polecenia. Sesja jest zamykana po zakończeniu wykonywania polecenia. Zmienna została utworzona $p w jednym połączeniu, ale nie istnieje w połączeniu utworzonym dla drugiego polecenia.

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

Polecenie New-PSSession cmdlet tworzy trwałą sesję 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 -FilterScript { $_.Message -like '*certificate*' }
}
Invoke-Command -ComputerName S1, S2 -ScriptBlock $command

Zmienna $command przechowuje Get-WinEvent polecenie sformatowane jako blok skryptu. Polecenie Invoke-Command uruchamia polecenie przechowywane 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 uruchomiona 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 każdym z komputerów. 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 uruchomiono 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ń uruchamianych na dwóch komputerach zdalnych.

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

Przykład 9: uwzględnianie zmiennych lokalnych 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 poleceniu zdalnym. 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 Using poprzedzona modyfikatorem 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 zwracany 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 -HideComputerName -ScriptBlock {
    Get-Process PowerShell
}

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, które zaczynają 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-Commandużywa parametru ScriptBlock, który definiuje dwie zmienne i $param2$param1 . Get-ChildItem używa nazwanych parametrów, Name i Include z nazwami zmiennych. ArgumentList przekazuje wartości do zmiennych.

Przykład 12: używanie zmiennej automatycznej $args 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 wyświetlana jest zawartość .txt katalogu serwera plików. Get-ChildItem Parametr Ścieżka to pozycja 0, a parametr Filtr 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 użyto Invoke-Command polecenia cmdlet , aby uruchomić Sample.ps1 skrypt 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.

$parameters = @{
    ComputerName = (Get-Content Servers.txt)
    FilePath     = 'C:\Scripts\Sample.ps1'
    ArgumentList = 'Process', 'Service'
}
Invoke-Command @parameters

Po przesłaniu polecenia zawartość Sample.ps1 pliku jest kopiowana do bloku skryptu, a blok skryptu jest uruchamiany na każdym komputerze zdalnym. 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 uruchomiono 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 w zmiennej $LiveCred . Program PowerShell monituje użytkownika o wprowadzenie poświadczeń identyfikatora Windows Live ID.

Zmienna $parameters jest tabelą skrótów zawierającą 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 zawierający 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
$parameters = @{
    ComputerName  = 'server01'
    UseSSL        = $true
    ScriptBlock   = { Get-HotFix }
    SessionOption = $so
    Credential    = 'server01\user01'
}
Invoke-Command @parameters

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 testów jest wygodne w przypadku rozwiązywania problemów, ale oczywiście nie jest bezpieczne.

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

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

W tym przykładzie pokazano, jak używać parametrów AllowRedirection i SessionOption do zarządzania przekierowaniem identyfikatora URI w poleceniu zdalnym.

$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 serwerze 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 zwraca komunikat przekierowania, program PowerShell przekierowuje połączenie, ale jeśli nowy obiekt docelowy zwróci kolejny 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. Serwer01 jest komputerem lokalnym, Server02 jest komputerem zdalnym, a Net03 zawiera udział sieciowy. Serwer01 nawiązuje połączenie 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 o tym, jak komunikacja zdalna programu PowerShell obsługuje przeskoki między komputerami, zobacz Tworzenie drugiego przeskoku w komunikacji zdalnej programu PowerShell.

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ązania 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 pliku $s. To polecenie pobiera skrypt z \\Net03\Scripts udziału sieciowego. Polecenie używa parametru Authentication z wartością CredSSP i credential parametru 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 rozłącza się z każdym komputerem. Skrypt nadal działa w rozłączonych sesjach.

$parameters = @{
  ComputerName          = (Get-Content -Path C:\Test\Servers.txt)
  InDisconnectedSession = $true
  FilePath              = '\\Scripts\Public\ConfigInventory.ps1'
  SessionOption         = @{
      OutputBufferingMode = 'Drop'
      IdleTimeout         = [timespan]::FromHours(12)
  }
}
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 natychmiast po uruchomieniu polecenia. Wartość parametru FilePath to skrypt Invoke-Command uruchamiany na każdym komputerze.

Wartość SessionOption jest tabelą skrótów. Wartość OutputBufferingMode jest ustawiona na Drop , a wartość IdleTimeout jest ustawiona na 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 konieczne będzie użycie uwierzytelniania użytkowników opartego na kluczach 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 do zezwalania na podstawowe uwierzytelnianie hasłem.

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

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\GetInfo.ps1 -SSHConnection $sshConnections

Parametry

-AllowRedirection

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

Jeśli używasz parametru ConnectionURI , zdalne miejsce docelowe 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żesz również ograniczyć liczbę przekierowań połączenia, zmieniając wartość opcji sesji MaximumConnectionRedirectionCount . Użyj parametru New-PSSessionOption MaximumRedirection polecenia cmdlet lub ustaw właściwość MaximumConnectionRedirectionCount zmiennej $PSSessionOption preferencji. Domyślna wartość wynosi 5.

Typ:SwitchParameter
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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.

Typ:String
Position:Named
Domyślna wartość:$PSSessionApplicationName if set on the local computer, otherwise WSMAN
Wymagane:False
Akceptowanie danych wejściowych potoku:True
Akceptowanie symboli wieloznacznych: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 nazywaneplatting tablicy. Aby uzyskać więcej informacji na temat zachowania argumentlist, zobacz about_Splatting.

Typ:Object[]
Aliasy:Args
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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 zajmują 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 polecenie cmdlet do Invoke-Command zdalnego uruchamiania Start-Job 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.

Typ:SwitchParameter
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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:

  • Wartość domyślna
  • Podstawowy
  • Credssp
  • Trawić
  • Kerberos
  • Negocjacja
  • NegotiateWithImplicitCredential

Wartość domyślna to Wartość domyślna.

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

Uwaga

Uwierzytelnianie dostawcy obsługi zabezpieczeń poświadczeń (CredSSP), w którym poświadczenia użytkownika są przekazywane do komputera zdalnego do uwierzytelnienia, jest przeznaczone dla poleceń wymagających uwierzytelniania w więcej niż jednym zasobie, takich jak uzyskiwanie dostępu do zdalnego udziału sieciowego. Ten mechanizm zwiększa ryzyko bezpieczeństwa operacji zdalnej. W przypadku naruszenia zabezpieczeń komputera zdalnego poświadczenia przekazywane do niego mogą służyć do kontrolowania sesji sieciowej. Aby uzyskać więcej informacji, zobacz Dostawca obsługi zabezpieczeń poświadczeń.

Typ:AuthenticationMechanism
Dopuszczalne wartości:Basic, Default, Credssp, Digest, Kerberos, Negotiate, NegotiateWithImplicitCredential
Position:Named
Domyślna wartość:Default
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-CertificateThumbprint

Określa certyfikat cyfrowego klucza publicznego (X509) konta użytkownika, które ma uprawnienia do nawiązywania połączenia z rozłączonej sesji. Wprowadź odcisk palca 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 Certyfikat programu PowerShell.

Typ:String
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-ComputerName

Określa komputery, na których jest uruchamiane polecenie. Wartość domyślna to komputer lokalny.

W przypadku korzystania z 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 .

Typ:String[]
Aliasy:Cn
Position:0
Domyślna wartość:Local computer
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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żywania z protokołem SSH ten parametr określa podsystem do użycia w 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.

Typ:String
Position:Named
Domyślna wartość:$PSSessionConfigurationName if set on the local computer, otherwise Microsoft.PowerShell
Wymagane:False
Akceptowanie danych wejściowych potoku:True
Akceptowanie symboli wieloznacznych:False

-ConnectingTimeout

Określa czas w milisekundach dozwolony do ukończenia początkowego połączenia SSH. Jeśli połączenie nie zostanie ukończone w określonym czasie, zostanie zwrócony błąd.

Ten parametr został wprowadzony w programie PowerShell 7.2

Typ:Int32
Position:Named
Domyślna wartość:Unlimited
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-ConnectionUri

Określa jednolity identyfikator zasobu (URI), 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 do innego identyfikatora URI, program PowerShell uniemożliwia przekierowanie, chyba że użyjesz parametru AllowRedirection w poleceniu .

Typ:Uri[]
Aliasy:URI, CU
Position:0
Domyślna wartość:http://localhost:5985/WSMAN
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-ContainerId

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

Typ:String[]
Position:Named
Domyślna wartość:None
Wymagane:True
Akceptowanie danych wejściowych potoku:True
Akceptowanie symboli wieloznacznych: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 SecureString , zobacz Jak bezpieczny jest protokół SecureString?.

Typ:PSCredential
Position:Named
Domyślna wartość:Current user
Wymagane:False
Akceptowanie danych wejściowych potoku:True
Akceptowanie symboli wieloznacznych: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. Można na przykład 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ę powodzeniem, 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.

Typ:SwitchParameter
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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 argumentuList, 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.

Typ:String
Aliasy:PSPath
Position:1
Domyślna wartość:None
Wymagane:True
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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.

Typ:SwitchParameter
Aliasy:HCN
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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 wykonywane przy użyciu protokołu SSH, a nie windows WinRM.

Ten parametr został wprowadzony w programie PowerShell 6.0.

Typ:String[]
Position:Named
Domyślna wartość:None
Wymagane:True
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-InDisconnectedSession

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

Gdy używasz parametru InDisconnectedSession , Invoke-Command tworzy trwałą sesję 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. Funkcja InDisconnectedSession umożliwia uruchamianie poleceń bez obsługi 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ć się między sesjami.

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 odłączonej sesji, 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.

Typ:SwitchParameter
Aliasy:Disconnected
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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 używania parametru InputObject użyj $Input zmiennej automatycznej w wartości parametru ScriptBlock , aby reprezentować obiekty wejściowe.

Typ:PSObject
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:True
Akceptowanie symboli wieloznacznych: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 nie dołączysz zadania AsJob w poleceniu.

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

Typ:String
Position:Named
Domyślna wartość:Job<n>
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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.

Typ:String
Aliasy:IdentityFilePath
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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.

Typ:SwitchParameter
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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. Porty domyślne to 5985 (port WinRM dla protokołu HTTP) i 5986 (port WinRM dla protokołu HTTPS).

Przed użyciem portu alternatywnego skonfiguruj odbiornik WinRM na komputerze zdalnym, aby nasłuchiwać 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 ma zastosowanie do wszystkich komputerów lub sesji, na których jest uruchamiane polecenie. Ustawienie alternatywnego portu może uniemożliwić uruchomienie polecenia na wszystkich komputerach.

Typ:Int32
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-RemoteDebug

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

Typ:SwitchParameter
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-RunAsAdministrator

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

Typ:SwitchParameter
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-ScriptBlock

Określa polecenia do uruchomienia. Dołącz polecenia w nawiasach klamrowych ({ }), aby utworzyć blok skryptu. W przypadku używania polecenia Invoke-Command do zdalnego uruchamiania wszystkie zmienne w poleceniu są oceniane na komputerze zdalnym.

Uwaga

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

Typ:ScriptBlock
Aliasy:Command
Position:0
Domyślna wartość:None
Wymagane:True
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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 nawiązuje trwałe połączenie z komputerem zdalnym. Użyj programu PSSession, aby uruchomić serię powiązanych poleceń, które udostępniają dane. Aby uruchomić pojedyncze polecenie lub serię niepowiązanych poleceń, użyj parametru ComputerName . Aby uzyskać więcej informacji, zobacz about_PSSessions.

Typ:PSSession[]
Position:0
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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.

Typ:String[]
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-SessionOption

Określa opcje zaawansowane dla sesji. Wprowadź obiekt SessionOption, taki jak obiekt utworzony przy użyciu 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.

Uwaga

Jeśli określisz tabelę skrótu dla parametru SessionOption, program PowerShell konwertuje tabelę skrótu na obiekt System.Management.Autiomation.Remoting.PSSessionOption . Wartości kluczy określonych w tabeli skrótów są rzutowane na zgodną właściwość obiektu. Różni się to od wywoływania metody New-PSSessionOption. Na przykład wartości System.TimeSpan dla właściwości limitu czasu, takich jak IdleTimeout, przekonwertuj wartość całkowitą na znaczniki zamiast milisekund. Aby uzyskać więcej informacji na temat obiektu PSSessionOption i jego właściwości, zobacz PSSessionOption

Wartości domyślne opcji są określane przez wartość zmiennej $PSSessionOption preferencji, jeśli została 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 dla sesji ustawionych 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.

Typ:PSSessionOption
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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
  • UserName
  • KeyFilePath (lub IdentityFilePath)

Nazwa_ komputera (lub nazwa_hosta) jest jedyną wymaganą parą klucz-wartość.

Ten parametr został wprowadzony w programie PowerShell 6.0.

Typ:Hashtable[]
Position:Named
Domyślna wartość:None
Wymagane:True
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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 zmusza program PowerShell do używania parametru HostName do ustanawiania połączenia zdalnego opartego na protokole SSH.

Ten parametr został wprowadzony w programie PowerShell 6.0.

Typ:SwitchParameter
Dopuszczalne wartości:true
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-Subsystem

Określa podsystem SSH używany na potrzeby nowej usługi 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ą powershell jest podsystem.

Typ:String
Position:Named
Domyślna wartość:powershell
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-ThrottleLimit

Określa maksymalną liczbę połączeń współbieżnych, które można ustanowić w celu uruchomienia tego polecenia. Jeśli pominiesz ten parametr lub wprowadź wartość 0, zostanie użyta wartość domyślna 32.

Limit ograniczania ma zastosowanie tylko do bieżącego polecenia, a nie do sesji ani do komputera.

Typ:Int32
Position:Named
Domyślna wartość:32
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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 uwierzytelniania podstawowego 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 żaden 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ę SSH platformy dotyczącą uwierzytelniania użytkowników opartego na kluczach.

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

Ten parametr został wprowadzony w programie PowerShell 6.0.

Typ:String
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych: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.

Usługa 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.

Typ:SwitchParameter
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-VMId

Określa tablicę identyfikatorów maszyn wirtualnych.

Typ:Guid[]
Aliasy:VMGuid
Position:0
Domyślna wartość:None
Wymagane:True
Akceptowanie danych wejściowych potoku:True
Akceptowanie symboli wieloznacznych:False

-VMName

Określa tablicę nazw maszyn wirtualnych.

Typ:String[]
Position:Named
Domyślna wartość:None
Wymagane:True
Akceptowanie danych wejściowych potoku:True
Akceptowanie symboli wieloznacznych:False

Dane wejściowe

ScriptBlock

Polecenie można przekazać potokiem w bloku skryptu do Invoke-Commandpolecenia . Użyj zmiennej automatycznej $Input , aby reprezentować obiekty wejściowe w poleceniu .

Dane wyjściowe

System.Management.Automation.PSRemotingJob

Jeśli używasz parametru AsJob , to polecenie cmdlet zwraca obiekt zadania.

PSSession

Jeśli używasz parametru InDisconnectedSession , to polecenie cmdlet zwraca obiekt PSSession .

Object

Domyślnie to polecenie cmdlet zwraca dane wyjściowe wywołanego polecenia, czyli wartość parametru ScriptBlock .

Uwagi

Program PowerShell zawiera następujące aliasy dla programu Invoke-Command:

  • Wszystkie platformy:
    • icm

W systemie Windows Vista i nowszych wersjach systemu operacyjnego Windows, aby użyć parametru Invoke-Command ComputerName 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 ich wyświetlania na liście. Jednak dane wyjściowe polecenia są wyświetlane w kolejności, w jakiej są odbierane z komputerów zdalnych, co może być inne.

Błędy, które wynikają z polecenia, które Invoke-Command jest uruchamiane, są uwzględnione 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 poleceniu zdalnym. Ta strategia zapewnia, że błędy zakończenia na jednym komputerze nie zamykają polecenia na wszystkich komputerach, na których jest uruchamiany. 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 WSMAN dostawcy, gdzie <Remote-Computer-Name> jest nazwą komputera zdalnego:

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

Po rozłączeniu programu 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 sesja 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ść Busy wskazuje, że nie można nawiązać połączenia z usługą PSSession , ponieważ jest ona 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 uwzględnione począwszy od programu PowerShell 6.0. Dodano je 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. Jest to oddzielone od poprzedniej komunikacji równorzędnej systemu Windows, która jest oparta na usłudze WinRM, a wiele określonych funkcji i ograniczeń usługi WinRM nie ma zastosowania. Na przykład przydziały oparte na usłudze WinRM, opcje sesji, konfiguracja niestandardowego punktu końcowego i funkcje rozłączania/ponownego nawiązywania połączenia nie są obecnie obsługiwane. Aby uzyskać więcej informacji na temat konfigurowania komunikacji zdalnej protokołu SSH programu PowerShell, zobacz Komunikacja zdalna programu PowerShell za pośrednictwem protokołu SSH.