Invoke-Command

Führt Befehle auf lokalen Computern und Remotecomputern aus.

Syntax

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>]

Beschreibung

Das Invoke-Command Cmdlet führt Befehle auf einem lokalen oder Remotecomputer aus und gibt alle Ausgaben aus den Befehlen zurück, einschließlich Fehlern. Mit einem einzelnen Invoke-Command Befehl können Sie Befehle auf mehreren Computern ausführen.

Um einen einzelnen Befehl auf einem Remotecomputer auszuführen, verwenden Sie den ComputerName-Parameter. Um eine Reihe verwandter Befehle auszuführen, die Daten freigeben, verwenden Sie das New-PSSession Cmdlet, um eine PSSession (eine dauerhafte Verbindung) auf dem Remotecomputer zu erstellen, und verwenden Sie dann den Session-ParameterInvoke-Command, um den Befehl in der PSSession auszuführen. Verwenden Sie zum Ausführen eines Befehls in einer getrennten Sitzung den InDisconnectedSession-Parameter. Verwenden Sie zum Ausführen eines Befehls in einem Hintergrundauftrag den AsJob-Parameter.

Sie können auch auf einem lokalen Computer verwenden Invoke-Command , um einen Skriptblock als Befehl auszuführen. PowerShell führt den Skriptblock sofort in einem untergeordneten Bereich des aktuellen Bereichs aus.

Invoke-Command Lesen Sie about_Remote, bevor Sie Befehle auf einem Remotecomputer ausführen.

Ab PowerShell 6.0 können Sie secure Shell (SSH) verwenden, um eine Verbindung mit und aufrufen von Befehlen auf Remotecomputern herzustellen. SSH muss auf dem lokalen Computer installiert sein, und der Remotecomputer muss mit einem PowerShell SSH-Endpunkt konfiguriert werden. Der Vorteil einer SSH-basierten PowerShell-Remotesitzung besteht darin, dass es auf mehreren Plattformen funktioniert (Windows, Linux, macOS). Für SSH-basierte Sitzung verwenden Sie die Parameter HostName oder SSHConnection , um die Remotecomputer und relevante Verbindungsinformationen anzugeben. Weitere Informationen zum Einrichten von PowerShell SSH-Remoting finden Sie unter PowerShell Remoting Over SSH.

Einige Codebeispiele verwenden splatting, um die Zeilenlänge zu verringern. Weitere Informationen finden Sie unter about_Splatting.

Beispiele

Beispiel 1: Ausführen eines Skripts auf einem Server

In diesem Beispiel wird das Test.ps1 Skript auf dem Server01-Computer ausgeführt.

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

Der Parameter FilePath gibt ein Skript an, das sich auf dem lokalen Computer befindet. Das Skript wird auf dem Remotecomputer ausgeführt, und die Ergebnisse werden an den lokalen Computer zurückgegeben.

Beispiel 2: Ausführen eines Befehls auf einem Remoteserver

In diesem Beispiel wird ein Get-Culture Befehl auf dem Server01-Remotecomputer ausgeführt.

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

Der Parameter ComputerName gibt den Namen des Remotecomputers an. Der Parameter "Anmeldeinformationen " wird verwendet, um den Befehl im Sicherheitskontext von Domain01\User01 auszuführen, einem Benutzer, der über die Berechtigung zum Ausführen von Befehlen verfügt. Der Parameter ScriptBlock gibt den Befehl an, der auf dem Remotecomputer ausgeführt werden soll.

Als Antwort fordert PowerShell das Kennwort und eine Authentifizierungsmethode für das Benutzerkonto an. Anschließend wird der Befehl auf dem Computer „Server01“ ausgeführt und das Ergebnis zurückgegeben.

Beispiel 3: Ausführen eines Befehls in einer beständigen Verbindung

In diesem Beispiel wird derselbe Get-Culture Befehl in einer Sitzung mit einer beständigen Verbindung auf dem Remotecomputer mit dem Namen Server02 ausgeführt.

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

Das New-PSSession Cmdlet erstellt eine Sitzung auf dem Server02-Remotecomputer und speichert sie in der $s Variablen. Normalerweise erstellen Sie eine Sitzung nur, wenn Sie eine Reihe von Befehlen auf dem Remotecomputer ausführen.

Das Invoke-Command Cmdlet führt den Get-Culture Befehl auf Server02 aus. Der Parameter "Session " gibt die sitzung an, die in der $s Variablen gespeichert ist.

Als Antwort führt PowerShell den Befehl in der Sitzung auf dem Server02-Computer aus.

Beispiel 4: Verwenden einer Sitzung zum Ausführen einer Reihe von Befehlen, die Daten freigeben

In diesem Beispiel werden die Auswirkungen der Verwendung von ComputerName - und Session-Parametern von Invoke-Command. Es veranschaulicht, wie Sie eine Sitzung verwenden können, um eine Reihe von Befehlen auszuführen, die gemeinsam die gleichen Daten nutzen.

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

Die ersten beiden Befehle verwenden den ComputerName-ParameterInvoke-Command zum Ausführen von Befehlen auf dem Remotecomputer Server02. Der erste Befehl verwendet das Get-Process Cmdlet, um den PowerShell-Prozess auf dem Remotecomputer abzurufen und in der $p Variablen zu speichern. Der zweite Befehl ruft den Wert der VirtualMemorySize-Eigenschaft des PowerShell-Prozesses ab.

Wenn Sie den Parameter ComputerName verwenden, erstellt PowerShell eine neue Sitzung, um den Befehl auszuführen. Die Sitzung wird geschlossen, wenn der Befehl abgeschlossen ist. Die $p Variable wurde in einer Verbindung erstellt, ist aber nicht in der Verbindung vorhanden, die für den zweiten Befehl erstellt wurde.

Das Problem wird gelöst, indem eine persistente Sitzung auf dem Remotecomputer erstellt wird und dann beide Befehle in derselben Sitzung ausgeführt werden.

Das New-PSSession Cmdlet erstellt eine persistente Sitzung auf dem Computer Server02 und speichert die Sitzung in der $s Variablen. Die Invoke-Command folgenden Zeilen verwenden den Session-Parameter , um beide Befehle in derselben Sitzung auszuführen. Da beide Befehle in derselben Sitzung ausgeführt werden, bleibt der $p Wert aktiv.

Beispiel 5: Aufrufen eines Befehls mit einem Skriptblock, der in einer Variablen gespeichert ist

In diesem Beispiel wird gezeigt, wie Sie einen Befehl ausführen, der als Skriptblock in einer Variablen gespeichert ist. Wenn der Skriptblock in einer Variablen gespeichert wird, können Sie die Variable als Wert des ScriptBlock-Parameters angeben.

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

Die $command Variable speichert den Befehl, der Get-WinEvent als Skriptblock formatiert ist. Der Invoke-Command Befehl wird ausgeführt, der auf $command den Remotecomputern S1 und S2 gespeichert ist.

Beispiel 6: Ausführen eines einzelnen Befehls auf mehreren Computern

In diesem Beispiel wird veranschaulicht, wie Invoke-Command Sie einen einzelnen Befehl auf mehreren Computern ausführen.

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

Der Parameter ComputerName gibt eine durch Kommas getrennte Liste von Computernamen an. Die Liste der Computer enthält den localhost-Wert, der den lokalen Computer darstellt. Der Parameter ConfigurationName gibt eine alternative Sitzungskonfiguration an. Der ScriptBlock-Parameter wird ausgeführt Get-WinEvent , um die PowerShellCore/Operational-Ereignisprotokolle von jedem Computer abzurufen.

Beispiel 7: Abrufen der Version des Hostprogramms auf mehreren Computern

In diesem Beispiel wird die Version des PowerShell-Hostprogramms auf 200 Remotecomputern angezeigt.

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

Da nur ein Befehl ausgeführt wird, müssen Sie keine beständigen Verbindungen mit jedem der Computer erstellen. Der Befehl verwendet stattdessen den ComputerName-Parameter, um die Computer anzugeben. Um die Computer anzugeben, verwendet es das Get-Content Cmdlet, um den Inhalt der Machine.txt-Datei abzurufen, eine Datei mit Computernamen.

Das Invoke-Command Cmdlet führt einen Get-Host Befehl auf den Remotecomputern aus. Es verwendet Punktnotation, um die Version-Eigenschaft des PowerShell-Hosts abzurufen.

Diese Befehle führen jeweils eine ausführung aus. Wenn die Befehle abgeschlossen sind, wird die Ausgabe der Befehle von allen Computern in der $version Variablen gespeichert. Die Ausgabe enthält den Namen des Computers, von dem die Daten stammen.

Beispiel 8: Ausführen eines Hintergrundauftrags auf mehreren Remotecomputern

In diesem Beispiel wird ein Befehl auf zwei Remotecomputern ausgeführt. Der Invoke-Command Befehl verwendet den AsJob-Parameter , damit der Befehl als Hintergrundauftrag ausgeführt wird. Die Befehle werden auf den Remotecomputern ausgeführt, aber der Auftrag ist auf dem lokalen Computer vorhanden. Die Ergebnisse werden an den lokalen Computer übertragen.

$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

Das New-PSSession Cmdlet erstellt Sitzungen auf den Remotecomputern Server01 und Server02. Das Invoke-Command Cmdlet führt einen Hintergrundauftrag in den einzelnen Sitzungen aus. Bei dem Befehl wird der Befehl mithilfe des AsJob-Parameters als Hintergrundauftrag ausgeführt. Dieser Befehl gibt ein Auftragsobjekt zurück, das zwei untergeordnete Auftragsobjekte enthält, jeweils eins für die Aufträge, die auf zwei Remotecomputern ausgeführt werden.

Der Get-Job Befehl speichert das Auftragsobjekt in der $j Variablen. Die $j Variable wird dann an das Format-List Cmdlet weitergeleitet, um alle Eigenschaften des Auftragsobjekts in einer Liste anzuzeigen. Der letzte Befehl ruft die Ergebnisse der Aufträge ab. Es führt das Auftragsobjekt in $j das Receive-Job Cmdlet ein und speichert die Ergebnisse in der $results Variablen.

Beispiel 9: Einschließen lokaler Variablen in einen Befehl, der auf einem Remotecomputer ausgeführt wird

Dieses Beispiel zeigt, wie Sie die Werte von lokalen Variablen in einem Befehl einschließen können, der auf einem Remotecomputer ausgeführt wird. Der Befehl verwendet den Using Bereichsmodifizierer, um eine lokale Variable in einem Remotebefehl zu identifizieren. Standardmäßig wird davon ausgegangen, dass alle Variablen in der Remotesitzung definiert sind. Der Using Bereichsmodifizierer wurde in PowerShell 3.0 eingeführt. Weitere Informationen zum Using Bereichsmodifizierer finden Sie unter about_Remote_Variables und about_Scopes.

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

Die $Log Variable speichert den Namen des Ereignisprotokolls, PowerShellCore/Operational. Das Invoke-Command Cmdlet wird auf Server01 ausgeführt Get-WinEvent , um die zehn neuesten Ereignisse aus dem Ereignisprotokoll abzurufen. Der Wert des LogName-Parameters ist die Variable, die $LogUsing vom Bereichsmodifizierer präfixiert wird, um anzugeben, dass sie in der lokalen Sitzung erstellt wurde, nicht in der Remotesitzung.

Beispiel 10: Ausblenden des Computernamens

In diesem Beispiel wird der Effekt der Verwendung des HideComputerName-Parameters von Invoke-Command. HideComputerName ändert nicht das Objekt, das dieses Cmdlet zurückgibt. Es ändert sich nur die Anzeige. Sie können die Cmdlets "Format" weiterhin verwenden, um die PsComputerName-Eigenschaft eines der betroffenen Objekte anzuzeigen.

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

Mit den ersten beiden Befehlen Invoke-Command wird ein Get-Process Befehl für den PowerShell-Prozess ausgeführt. Die Ausgabe des ersten Befehls enthält die PsComputerName-Eigenschaft, die den Namen des Computers enthält, auf dem der Befehl ausgeführt wurde. Die Ausgabe des zweiten Befehls, der HideComputerName verwendet, enthält nicht die PsComputerName-Spalte .

Beispiel 11: Verwenden des Param-Schlüsselworts in einem Skriptblock

Das Schlüsselwort und der ParamArgumentList-Parameter werden verwendet, um Variablenwerte an benannte Parameter in einem Skriptblock zu übergeben. In diesem Beispiel werden Dateinamen angezeigt, die mit dem Buchstaben a beginnen und über die .pdf Erweiterung verfügen.

Weitere Informationen zum Param Schlüsselwort finden Sie unter 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 verwendet den ScriptBlock-Parameter , der zwei Variablen definiert und $param1$param2. Get-ChildItem verwendet die benannten Parameter, den Namen und die Liste mit den Variablennamen. Die ArgumentList übergibt die Werte an die Variablen.

Beispiel 12: Verwenden der automatischen Variablen $args in einem Skriptblock

Die $args automatische Variable und der ArgumentList-Parameter werden verwendet, um Arraywerte an Parameterpositionen in einem Skriptblock zu übergeben. In diesem Beispiel wird der Verzeichnisinhalt eines Servers von .txt Dateien angezeigt. Der Parameter "Pfad" ist Position 0 und der Get-ChildItemFilterparameter ist Position 1.

Weitere Informationen zu der $args Variablen finden Sie unter 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-Commandverwendet einen ScriptBlock-Parameter und gibt die Werte und Get-ChildItem$args[1] Arraywerte $args[0] an. Die ArgumentList übergibt die Arraywerte an die $argsGet-ChildItem Parameterpositionen für Pfad und Filter.

Beispiel 13: Ausführen eines Skripts auf allen Computern, die in einer Textdatei aufgeführt sind

In diesem Beispiel wird das Cmdlet verwendet, um das Skript auf allen Computern auszuführen, die Invoke-CommandSample.ps1 in der Servers.txt Datei aufgeführt sind. Der Befehl verwendet den FilePath-Parameter, um die Skriptdatei anzugeben. Mit diesem Befehl können Sie das Skript auf Remotecomputern ausführen, auch wenn die Skriptdatei nicht auf die Remotecomputer zugreifen kann.

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

Wenn Sie den Befehl übermitteln, wird der Inhalt der Sample.ps1 Datei in einen Skriptblock kopiert, und der Skriptblock wird auf jedem Remotecomputer ausgeführt. Dieses Verfahren entspricht der Verwendung des ScriptBlock-Parameters, um den Inhalt des Skripts zu übermitteln.

Beispiel 14: Ausführen eines Befehls auf einem Remotecomputer mithilfe eines URI

In diesem Beispiel wird gezeigt, wie Sie einen Befehl auf einem Remotecomputer ausführen, der von einem Uniform Resource Identifier (URI) identifiziert wird. In diesem bestimmten Beispiel wird ein Set-Mailbox Befehl auf einem Remote-Exchange-Server ausgeführt.

$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

Die erste Zeile verwendet das Cmdlet zum Speichern von Get-Credential Windows Live ID-Anmeldeinformationen in der $LiveCred Variablen. PowerShell fordert den Benutzer auf, Windows Live ID-Anmeldeinformationen einzugeben.

Die $parameters Variable ist eine Hashtabelle mit den Parametern, die an das Invoke-Command Cmdlet übergeben werden sollen. Das Invoke-Command Cmdlet führt einen Set-Mailbox Befehl mithilfe der Microsoft.Exchange-Sitzungskonfiguration aus. Der ConnectionURI-Parameter gibt den URL des Exchange-Serverendpunkts an. Der Parameter "Anmeldeinformationen " gibt die anmeldeinformationen an, die in der $LiveCred Variablen gespeichert sind. Der AuthenticationMechanism-Parameter gibt die Verwendung der Standardauthentifizierung an. Der ScriptBlock-Parameter gibt einen Skriptblock mit dem Befehl an.

Beispiel 15: Verwenden einer Sitzungsoption

In diesem Beispiel wird gezeigt, wie Sie einen SessionOption-Parameter erstellen und verwenden.

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

Das New-PSSessionOption Cmdlet erstellt ein Sitzungsoptionsobjekt, das dazu führt, dass das Remoteende nicht die Zertifizierungsstelle, den Kanonischen Namen und die Sperrlisten überprüft, während die eingehende HTTPS-Verbindung ausgewertet wird. Das SessionOption-Objekt wird in der $so Variable gespeichert.

Hinweis

Das Deaktivieren dieser Prüfungen ist praktisch für die Problembehandlung, aber offensichtlich nicht sicher.

Das Invoke-Command Cmdlet führt einen Get-HotFix Befehl remote aus. Der SessionOption-Parameter erhält die $so Variable.

Beispiel 16: Verwalten der URI-Umleitung in einem Remotebefehl

In diesem Beispiel wird gezeigt, wie Sie die Parameter AllowRedirection und SessionOption verwenden, um die URI-Umleitung in einem Remotebefehl zu verwalten.

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

Das New-PSSessionOption Cmdlet erstellt ein PSSessionOption-Objekt , das in der $max Variablen gespeichert wird. Der Befehl verwendet den MaximumRedirection-Parameter zum Festlegen der MaximumConnectionRedirectionCount-Eigenschaft des PSSessionOption-Objekts auf 1.

Das Invoke-Command Cmdlet führt einen Get-Mailbox Befehl auf einem Remote-Microsoft Exchange Server aus. Der Parameter AllowRedirection bietet explizite Berechtigung zum Umleiten der Verbindung zu einem alternativen Endpunkt. Der SessionOption-Parameter verwendet das in der $max Variable gespeicherte Sitzungsobjekt.

Wenn der von ConnectionURI angegebene Remotecomputer eine Umleitungsnachricht zurückgibt, leitet PowerShell die Verbindung um, aber wenn das neue Ziel eine weitere Umleitungsnachricht zurückgibt, wird der Umleitungswert von 1 überschritten und Invoke-Command gibt einen nicht terminierenden Fehler zurück.

Beispiel 17: Zugreifen auf eine Netzwerkfreigabe in einer Remotesitzung

In diesem Beispiel wird gezeigt, wie Sie auf eine Netzwerkfreigabe aus einer Remotesitzung zugreifen. Drei Computer werden verwendet, um das Beispiel zu veranschaulichen. Server01 ist der lokale Computer, Server02 ist der Remotecomputer und Net03 enthält die Netzwerkfreigabe. Server01 stellt eine Verbindung mit Server02 bereit, und dann macht Server02 einen zweiten Hop zu Net03, um auf die Netzwerkfreigabe zuzugreifen. Weitere Informationen dazu, wie PowerShell Remoting Hops zwischen Computern unterstützt, finden Sie unter Erstellen des zweiten Hops in PowerShell Remoting.

Die erforderliche Credential Security Support Provider (CredSSP)-Delegierung ist in den Clienteinstellungen auf dem lokalen Computer aktiviert, und in den Diensteinstellungen auf dem Remotecomputer. Um die Befehle in diesem Beispiel auszuführen, müssen Sie mitglied der Gruppe "Administratoren " auf dem lokalen Computer und dem Remotecomputer sein.

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

Das Enable-WSManCredSSP Cmdlet ermöglicht die CredSSP-Delegation vom lokalen Server01-Computer an den Remotecomputer Server02. Der Rollenparameter gibt Client an, um die CredSSP-Clienteinstellung auf dem lokalen Computer zu konfigurieren.

New-PSSession erstellt ein PSSession-Objekt für Server02 und speichert das Objekt in der $s Variable.

Das Invoke-Command Cmdlet verwendet die $s Variable zum Herstellen einer Verbindung mit dem Remotecomputer, Server02. Der ScriptBlock-Parameter wird auf dem Remotecomputer ausgeführt Enable-WSManCredSSP . Der Rollenparameter gibt Server an, um die CredSSP-Servereinstellung auf dem Remotecomputer zu konfigurieren.

Die $parameters Variable enthält die Parameterwerte zum Herstellen einer Verbindung mit der Netzwerkfreigabe. Das Invoke-Command Cmdlet führt einen Get-Item Befehl in der Sitzung in $s. Dieser Befehl ruft ein Skript aus der \\Net03\Scripts Netzwerkfreigabe ab. Der Befehl verwendet den Authentifizierungsparameter mit einem Wert von CredSSP und dem Parameter "Anmeldeinformationen " mit einem Wert von Domain01\Admin01.

Beispiel 18: Starten von Skripts auf vielen Remotecomputern

In diesem Beispiel wird ein Skript auf mehr als hundert Computern ausgeführt. Zur Minimierung der Auswirkungen auf dem lokalen Computer wird eine Verbindung mit jedem Computer hergestellt, das Skript gestartet und die Verbindung dann von jedem Computer getrennt. Das Skript wird weiterhin in den getrennten Sitzungen ausgeführt.

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

Der Befehl verwendet Invoke-Command , um das Skript auszuführen. Der Wert des ComputerName-Parameters ist ein Get-Content Befehl, der die Namen der Remotecomputer aus einer Textdatei abruft. Der InDisconnectedSession-Parameter trennt Sitzungen, sobald der Befehl ausgeführt wird. Der Wert des FilePath-Parameters ist das Skript, das Invoke-Command auf jedem Computer ausgeführt wird.

Der Wert von SessionOption ist eine Hashtabelle. Der Wert "OutputBufferingMode " wird auf "Drop " festgelegt, und der IdleTimeout-Wert wird auf 43200000 Millisekunden (12 Stunden) festgelegt.

Um die Ergebnisse von Befehlen und Skripts abzurufen, die in getrennten Sitzungen ausgeführt werden, verwenden Sie das Receive-PSSession Cmdlet.

Beispiel 19: Ausführen eines Befehls auf einem Remotecomputer mithilfe von SSH

In diesem Beispiel wird gezeigt, wie Sie einen Befehl auf einem Remotecomputer mithilfe von Secure Shell (SSH) ausführen. Wenn SSH auf dem Remotecomputer so konfiguriert ist, dass Sie zu Kennwörtern aufgefordert werden, erhalten Sie eine Kennwortaufforderung. Andernfalls müssen Sie SSH-schlüsselbasierte Benutzerauthentifizierung verwenden.

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

Beispiel 20: Ausführen eines Befehls auf einem Remotecomputer mithilfe von SSH und Angeben eines Benutzerauthentifizierungsschlüssels

In diesem Beispiel wird gezeigt, wie Sie einen Befehl auf einem Remotecomputer mithilfe von SSH ausführen und eine Schlüsseldatei für die Benutzerauthentifizierung angeben. Sie werden nicht aufgefordert, ein Kennwort zu erhalten, es sei denn, die Schlüsselauthentifizierung schlägt fehl, und der Remotecomputer ist so konfiguriert, dass die grundlegende Kennwortauthentifizierung zulässig ist.

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

Beispiel 21: Ausführen einer Skriptdatei auf mehreren Remotecomputern mithilfe von SSH als Auftrag

In diesem Beispiel wird gezeigt, wie Sie eine Skriptdatei auf mehreren Remotecomputern mit SSH und dem SSHConnection-Parametersatz ausführen. Der SSHConnection-Parameter verwendet ein Array von Hashtabellen, die Verbindungsinformationen für jeden Computer enthalten. In diesem Beispiel ist erforderlich, dass die Ziel-Remotecomputer SSH konfiguriert haben, um die schlüsselbasierte Benutzerauthentifizierung zu unterstützen.

$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

Parameter

-AllowRedirection

Ermöglicht die Umleitung dieser Verbindung an einen alternativen URI (Uniform Resource Identifier).

Bei Verwendung des ConnectionURI-Parameters kann das Remoteziel eine Anweisung zum Umleiten an einen anderen URI zurückgeben. Standardmäßig leitet PowerShell keine Verbindungen um, aber Sie können diesen Parameter verwenden, um die Verbindung umleiten zu können.

Sie können auch einschränken, wie oft die Verbindung umgeleitet wird, indem Sie den MaximumConnectionRedirectionCount-Optionswert der Sitzung ändern. Verwenden Sie den Parameter "MaximumRedirection" des Cmdlets oder legen Sie die MaximumConnectionRedirectionCount-Eigenschaft der $PSSessionOptionNew-PSSessionOption Einstellungsvariable fest. Der Standardwert ist 5.

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

-ApplicationName

Gibt das Anwendungsnamenssegment des Verbindungs-URI an. Verwenden Sie diesen Parameter, um den Anwendungsnamen anzugeben, wenn Sie den ConnectionURI-Parameter im Befehl nicht verwenden.

Der Standardwert ist der Wert der $PSSessionApplicationName Einstellungsvariable auf dem lokalen Computer. Wenn diese Einstellungsvariable nicht definiert ist, ist der Standardwert WSMAN. Dieser Wert ist für die meisten Verwendungsarten geeignet. Weitere Informationen finden Sie unter about_Preference_Variables.

Der WinRM-Dienst wählt mit dem Anwendungsnamen einen Listener für die Verbindungsanforderung aus. Der Wert dieses Parameters sollte mit dem Wert der URLPrefix-Eigenschaft eines Listeners auf dem Remotecomputer übereinstimmen.

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

Stellt die Werte von Parametern für den Skriptblock bereit. Die Parameter im Skriptblock werden von der Position des Arraywerts übergeben, der an ArgumentList bereitgestellt wird. Dies wird als Array-Splatting bezeichnet. Weitere Informationen zum Verhalten von ArgumentList finden Sie unter about_Splatting.

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

-AsJob

Gibt an, dass dieses Cmdlet den Befehl als Hintergrundauftrag auf einem Remotecomputer ausführt. Verwenden Sie diesen Parameter, um Befehle auszuführen, die eine umfangreiche Zeit zum Beenden nehmen.

Wenn Sie den AsJob-Parameter verwenden, gibt der Befehl ein Objekt zurück, das den Auftrag darstellt, und zeigt dann die Eingabeaufforderung an. Sie können die Sitzung weiterhin verwenden, während der Auftrag abgeschlossen wird. Verwenden Sie zum Verwalten des Auftrags die *-Job Cmdlets. Um die Auftragsergebnisse abzurufen, verwenden Sie das Cmdlet Receive-Job.

Der AsJob-Parameter ähnelt dem Invoke-Command Cmdlet, um ein Start-Job Cmdlet remote auszuführen. Mit AsJob wird der Auftrag jedoch auf dem lokalen Computer erstellt, obwohl der Auftrag auf einem Remotecomputer ausgeführt wird. Die Ergebnisse des Remoteauftrags werden automatisch an den lokalen Computer zurückgegeben.

Weitere Informationen zu PowerShell-Hintergrundaufträgen finden Sie unter about_Jobs und about_Remote_Jobs.

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

-Authentication

Gibt den Mechanismus an, der zum Authentifizieren der Anmeldeinformationen des Benutzers verwendet wird. CredSSP-Authentifizierung ist nur in Windows Vista, Windows Server 2008 und späteren Versionen des Windows-Betriebssystems verfügbar.

Die zulässigen Werte für diesen Parameter sind wie folgt:

  • Standard
  • Standard
  • Credssp
  • Digest
  • Kerberos
  • Aushandeln
  • NegotiateWithImplicitCredential

Der Standardwert ist Default.

Weitere Informationen zu den Werten dieses Parameters finden Sie unter AuthenticationMechanism Enumeration.

Achtung

Die CredSSP (Credential Security Support Provider)-Authentifizierung, bei der die Anmeldeinformationen des Benutzers zur Authentifizierung an einen Remotecomputer übergeben werden, ist für Befehle konzipiert, die die Authentifizierung auf mehr als einer Ressource erfordern, z. B. beim Zugriff auf eine Remotenetzwerkfreigabe. Dieser Mechanismus erhöht das Sicherheitsrisiko des Remotevorgangs. Wenn die Sicherheit des Remotecomputers gefährdet ist, können die an ihn übergebenen Anmeldeinformationen zum Steuern der Netzwerksitzung verwendet werden. Weitere Informationen finden Sie unter Credential Security Support Provider.

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

Gibt das digitale Zertifikat für öffentliche Schlüssel (X.509) eines Benutzerkontos mit der Berechtigung zum Herstellen einer Verbindung mit der getrennten Sitzung an. Geben Sie den Zertifikatfingerabdruck des Zertifikats ein.

Zertifikate werden bei der clientzertifikatbasierten Authentifizierung verwendet. Sie können nur lokalen Benutzerkonten zugeordnet werden, und sie funktionieren nicht mit Domänenkonten.

Um einen Zertifikat-Fingerabdruck abzurufen, verwenden Sie einen Get-Item oder Get-ChildItem einen Befehl im PowerShell Cert: Laufwerk.

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

-ComputerName

Gibt die Computer an, auf denen der Befehl ausgeführt wird. Die Standardeinstellung ist der lokale Computer.

Wenn Sie den ComputerName-Parameter verwenden, erstellt PowerShell eine temporäre Verbindung, die nur zum Ausführen des angegebenen Befehls verwendet wird und dann geschlossen wird. Wenn Sie eine beständige Verbindung benötigen, verwenden Sie den Sitzungsparameter .

Geben Sie den NetBIOS-Namen, die IP-Adresse oder den vollqualifizierten Domänennamen eines Computers oder mehrerer Computer in einer durch Trennzeichen getrennten Liste ein. Geben Sie zum Angeben des lokalen Computers den Computernamen, localhost oder einen Punkt (.) ein.

Um eine IP-Adresse im Wert von ComputerName zu verwenden, muss der Befehl den Parameter "Anmeldeinformationen " enthalten. Der Computer muss für den HTTPS-Transport oder die IP-Adresse des Remotecomputers in die WinRM TrustedHosts-Liste des lokalen Computers einbezogen werden. Anweisungen zum Hinzufügen eines Computernamens zur Liste "TrustedHosts " finden Sie unter "Hinzufügen eines Computers zur vertrauenswürdigen Hostliste".

Unter Windows Vista und späteren Versionen des Windows-Betriebssystems müssen Sie PowerShell mit der Option "Als Administrator ausführen" ausführen, um den lokalen Computer im Wert von ComputerName einzuschließen.

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

-ConfigurationName

Gibt die Sitzungskonfiguration an, die für die neue PSSession verwendet wird.

Geben Sie einen Konfigurationsnamen oder den vollqualifizierten Ressourcen-URI für eine Sitzungskonfiguration ein. Wenn Sie nur den Konfigurationsnamen angeben, wird der folgende Schema-URI vorgestellt: http://schemas.microsoft.com/PowerShell

Bei Verwendung mit SSH gibt dieser Parameter das Subsystem an, das im Ziel wie definiert verwendet werden soll sshd_config. Der Standardwert für SSH ist das powershell Subsystem.

Die Sitzungskonfiguration für eine Sitzung befindet sich auf dem Remotecomputer. Wenn die angegebene Sitzungskonfiguration auf dem Remotecomputer nicht vorhanden ist, schlägt der Befehl fehl.

Der Standardwert ist der Wert der $PSSessionConfigurationName Einstellungsvariable auf dem lokalen Computer. Wenn diese Einstellungsvariable nicht festgelegt ist, ist die Standardeinstellung Microsoft.PowerShell. Weitere Informationen finden Sie unter 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

Gibt einen URI (Uniform Resource Identifier) an, der den Verbindungsendpunkt für die Sitzung definiert. Der URI muss vollqualifiziert sein.

Das Format dieser Zeichenfolge lautet wie folgt:

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

Der Standardwert lautet:

http://localhost:5985/WSMAN

Wenn Sie keinen Verbindungs-URI angeben, können Sie die Parameter UseSSL und Port verwenden, um die Verbindungs-URI-Werte anzugeben.

Gültige Werte für das Transport-Segment des URI sind „HTTP“ und „HTTPS“. Wenn Sie einen Verbindungs-URI mit einem Transportsegment angeben, aber keinen Port angeben, wird die Sitzung mit den Standardsports erstellt: 80 für HTTP und 443 für HTTPS. Um die Standardports für PowerShell-Remoting zu verwenden, geben Sie Port 5985 für HTTP oder 5986 für HTTPS an.

Wenn der Zielcomputer die Verbindung zu einem anderen URI umleitet, verhindert PowerShell die Umleitung, es sei denn, Sie verwenden den AllowRedirection-Parameter im Befehl.

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

-ContainerId

Gibt ein Array von Container-IDs an.

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

-Credential

Gibt ein Benutzerkonto an, das über die Berechtigung zum Ausführen dieser Aktion verfügt. Der Standardwert ist der aktuelle Benutzer.

Geben Sie einen Benutzernamen ein, z. B. "User01" oder "Domain01\User01", oder geben Sie ein vom Cmdlet generiertes Get-CredentialPSCredential-Objekt ein. Wenn Sie einen Benutzernamen eingeben, werden Sie aufgefordert, das Kennwort einzugeben.

Anmeldeinformationen werden in einem PSCredential-Objekt gespeichert, und das Kennwort wird als SecureString gespeichert.

Hinweis

Weitere Informationen zum Datenschutz von SecureString finden Sie unter Wie sicher ist SecureString?.

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

-EnableNetworkAccess

Gibt an, dass dieses Cmdlet ein interaktives Sicherheitstoken zu Loopbacksitzungen hinzufügt. Mit dem interaktiven Token können Sie die Befehle in der Loopbacksitzung ausführen, um Daten von anderen Computern abzurufen. Beispielsweise können Sie einen Befehl in der Sitzung ausführen, mit dem XML-Dateien von einem Remotecomputer auf den lokalen Computer kopiert werden.

Eine Loopbacksitzung ist eine PSSession , die auf demselben Computer stammt und endet. Um eine Loopbacksitzung zu erstellen, lassen Sie den ComputerName-Parameter aus, oder legen Sie den Wert auf Punkt (.), localhost oder den Namen des lokalen Computers fest.

Standardmäßig werden Loopbacksitzungen mithilfe eines Netzwerktokens erstellt, das möglicherweise keine ausreichende Berechtigung zum Authentifizieren bei Remotecomputern bereitstellt.

Der EnableNetworkAccess-Parameter ist nur bei Loopbacksitzungen wirksam. Wenn Sie EnableNetworkAccess verwenden, wenn Sie eine Sitzung auf einem Remotecomputer erstellen, ist der Befehl erfolgreich, der Parameter wird jedoch ignoriert.

Sie können den Remotezugriff in einer Loopbacksitzung mithilfe des CredSSP-Werts des Authentifizierungsparameters zulassen, der die Sitzungsanmeldeinformationen an andere Computer delegiert.

Um den Computer vor bösartigem Zugriff zu schützen, können getrennte Loopbacksitzungen mit interaktiven Token, die mithilfe von EnableNetworkAccess erstellt wurden, nur vom Computer, auf dem die Sitzung erstellt wurde, erneut verbunden werden. Die Verbindung von getrennten Sitzungen, die die CredSSP-Authentifizierung verwenden, kann von anderen Computern wiederhergestellt werden. Weitere Informationen finden Sie unter Disconnect-PSSession.

Dieser Parameter wurde in PowerShell 3.0 eingeführt.

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

-FilePath

Gibt ein lokales Skript an, das dieses Cmdlet auf einem oder mehreren Remotecomputern ausführt. Geben Sie den Pfad und dateinamen des Skripts ein, oder geben Sie einen Skriptpfad an Invoke-Command. Das Skript muss auf dem lokalen Computer oder in einem Verzeichnis vorhanden sein, auf das der lokale Computer zugreifen kann. Verwenden Sie ArgumentList , um die Werte von Parametern im Skript anzugeben.

Wenn Sie diesen Parameter verwenden, konvertiert PowerShell den Inhalt der angegebenen Skriptdatei in einen Skriptblock, überträgt den Skriptblock an den Remotecomputer und führt ihn auf dem Remotecomputer aus.

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

-HideComputerName

Gibt an, dass dieses Cmdlet den Computernamen jedes Objekts aus der Ausgabeanzeige auslässt. Standardmäßig wird der Name des Computers, der das Objekt generiert, in der Anzeige angezeigt.

Dieser Parameter betrifft nur die Ausgabeanzeige. Das Objekt wird nicht geändert.

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

-HostName

Gibt ein Array von Computernamen für eine ssh-basierte Verbindung (Secure Shell) an. Dies ähnelt dem ComputerName-Parameter , mit der Ausnahme, dass die Verbindung mit dem Remotecomputer über SSH anstelle von Windows WinRM hergestellt wird.

Dieser Parameter wurde in PowerShell 6.0 eingeführt.

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

-InDisconnectedSession

Gibt an, dass dieses Cmdlet einen Befehl oder ein Skript in einer getrennten Sitzung ausführt.

Wenn Sie den Parameter InDisconnectedSession verwenden, Invoke-Command wird eine persistente Sitzung auf jedem Remotecomputer erstellt, der durch den Parameter ScriptBlock oder FilePath angegeben wird, und dann die Verbindung mit der Sitzung getrennt. Die Befehle werden weiterhin in den getrennten Sitzungen ausgeführt. InDisconnectedSession ermöglicht es Ihnen, Befehle auszuführen, ohne eine Verbindung mit den Remotesitzungen beizubehalten. Und da die Sitzung getrennt wird, bevor ergebnisse zurückgegeben werden, stellt InDisconnectedSession sicher, dass alle Befehlsergebnisse an die wieder verbundene Sitzung zurückgegeben werden, anstatt zwischen Sitzungen geteilt zu werden.

Sie können InDisconnectedSession nicht mit dem Parameter Session oder dem AsJob-Parameter verwenden.

Befehle, die InDisconnectedSession verwenden, geben ein PSSession-Objekt zurück, das die getrennte Sitzung darstellt. Sie geben die Befehlsausgabe nicht zurück. Verwenden Sie die Connect-PSSession Cmdlets, Receive-PSSession um eine Verbindung mit der getrennten Sitzung herzustellen. Verwenden Sie das Receive-PSSession Cmdlet, um die Ergebnisse von Befehlen abzurufen, die in der Sitzung ausgeführt wurden. Wenn Sie Befehle ausführen möchten, die die Ausgabe in einer getrennten Sitzung generieren, legen Sie den Wert der Option "OutputBufferingMode" auf "Drop" fest. Wenn Sie eine Verbindung mit der getrennten Sitzung herstellen möchten, legen Sie das Leerlaufzeitlimit in der Sitzung fest, damit sie ausreichend Zeit für die Verbindung bietet, bevor Sie die Sitzung löschen.

Sie können den Ausgabepuffermodus und das Leerlauf-Timeout im SessionOption-Parameter oder in der $PSSessionOption Einstellungsvariable festlegen. Weitere Informationen zu Sitzungsoptionen finden Sie unter New-PSSessionOption und about_Preference_Variables.

Weitere Informationen zum Feature „Getrennte Sitzungen“ finden Sie unter about_Remote_Disconnected_Sessions.

Dieser Parameter wurde in PowerShell 3.0 eingeführt.

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

-InputObject

Gibt die Eingabe für den Befehl an. Geben Sie eine Variable ein, die die Objekte enthält, oder geben Sie einen Befehl oder einen Ausdruck ein, durch den die Objekte abgerufen werden.

Verwenden Sie bei Verwendung des InputObject-Parameters die $Input automatische Variable im Wert des ScriptBlock-Parameters , um die Eingabeobjekte darzustellen.

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

-JobName

Gibt einen Anzeigenamen für den Hintergrundauftrag an. Standardmäßig werden Aufträge benannt Job<n>, wobei <n> es sich um eine Ordnungszahl handelt.

Wenn Sie den JobName-Parameter in einem Befehl verwenden, wird der Befehl als Auftrag ausgeführt und Invoke-Command gibt ein Auftragsobjekt zurück, auch wenn Sie AsJob nicht in den Befehl einschließen.

Weitere Informationen zu PowerShell-Hintergrundaufträgen finden Sie unter about_Jobs.

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

-KeyFilePath

Gibt einen Schlüsseldateipfad an, der von Secure Shell (SSH) verwendet wird, um einen Benutzer auf einem Remotecomputer zu authentifizieren.

SSH ermöglicht die Benutzerauthentifizierung über private und öffentliche Schlüssel als Alternative zur grundlegenden Kennwortauthentifizierung. Wenn der Remotecomputer für die Schlüsselauthentifizierung konfiguriert ist, kann dieser Parameter verwendet werden, um den Schlüssel bereitzustellen, der den Benutzer identifiziert.

Dieser Parameter wurde in PowerShell 6.0 eingeführt.

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

-NoNewScope

Gibt an, dass dieses Cmdlet den angegebenen Befehl im aktuellen Bereich ausführt. Führt standardmäßig Invoke-Command Befehle in ihrem eigenen Bereich aus.

Dieser Parameter ist nur in Befehlen gültig, die in der aktuellen Sitzung ausgeführt werden, d. h. in Befehlen, bei denen beide Parameter, ComputerName und Session, weglassen wurden.

Dieser Parameter wurde in PowerShell 3.0 eingeführt.

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

-Port

Gibt den Netzwerkport auf dem Remotecomputer an, der für diesen Befehl verwendet wird. Zum Herstellen einer Verbindung mit einem Remotecomputer muss der Remotecomputer den für die Verbindung verwendeten Port abhören. Die Standardports sind 5985 (WinRM-Port für HTTP) und 5986 (WinRM-Port für HTTPS).

Konfigurieren Sie vor der Verwendung eines alternativen Ports den WinRM-Listener auf dem Remotecomputer, um diesen Port abzuhören. Um den Listener zu konfigurieren, geben Sie die folgenden beiden Befehle an der PowerShell-Eingabeaufforderung ein:

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

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

Verwenden Sie den Port-Parameter nicht, es sei denn, Sie müssen. Der im Befehl festgelegte Port gilt für alle Computer oder Sitzungen, für die der Befehl ausgeführt wird. Eine alternative Porteinstellung kann verhindern, dass der Befehl auf allen Computern ausgeführt wird.

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

-RemoteDebug

Wird verwendet, um den aufgerufenen Befehl im Debugmodus in der Remote-PowerShell-Sitzung auszuführen.

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

-RunAsAdministrator

Gibt an, dass dieses Cmdlet einen Befehl als Administrator aufruft.

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

-ScriptBlock

Gibt die auszuführenden Befehle an. Schließen Sie die Befehle in geschweifte Klammern ({ }) ein, um einen Skriptblock zu erstellen. Invoke-Command Wenn Sie einen Befehl remote ausführen, werden alle Variablen im Befehl auf dem Remotecomputer ausgewertet.

Hinweis

Parameter für den Scriptblock können nur von ArgumentList nach Position übergeben werden. Schalterparameter können nicht an position übergeben werden. Wenn Sie einen Parameter benötigen, der sich wie ein SwitchParameter-Typ verhält, verwenden Sie stattdessen einen booleschen Typ.

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

-Session

Gibt ein Array von Sitzungen an, in denen dieses Cmdlet den Befehl ausführt. Geben Sie eine Variable ein, die PSSession-Objekte oder einen Befehl enthält, der die PSSession-Objekte erstellt oder abruft, z. B. ein oder Get-PSSession einen New-PSSession Befehl.

Wenn Sie eine PSSession erstellen, stellt PowerShell eine dauerhafte Verbindung mit dem Remotecomputer her. Verwenden Sie eine PSSession , um eine Reihe verwandter Befehle auszuführen, die Daten freigeben. Verwenden Sie den ComputerName-Parameter , um einen einzelnen Befehl oder eine Reihe nicht verwandter Befehle auszuführen. Weitere Informationen finden Sie unter about_PSSessions.

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

-SessionName

Gibt einen Anzeigenamen für eine getrennte Sitzung an. Sie können den Namen verwenden, um in nachfolgenden Befehlen auf die Sitzung zu verweisen, z. B. einen Get-PSSession Befehl. Dieser Parameter ist nur mit dem InDisconnectedSession-Parameter gültig.

Dieser Parameter wurde in PowerShell 3.0 eingeführt.

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

-SessionOption

Gibt erweiterte Optionen für die Sitzung an. Geben Sie ein SessionOption-Objekt ein, z. B. eine, die Sie mithilfe des Cmdlets erstellen, oder eine Hashtabelle, in der New-PSSessionOption die Schlüssel Namen von Sitzungsoptionsnamen sind und die Werte sitzungsoptionswerte sind.

Die Standardwerte für die Optionen werden durch den Wert der $PSSessionOption Einstellungsvariable bestimmt, wenn sie festgelegt ist. Andernfalls werden die Standardwerte durch Optionen festgelegt, die in der Sitzungskonfiguration festgelegt sind.

Die Sitzungsoptionswerte haben Vorrang vor Standardwerten für Sitzungen, die in der Einstellungsvariable und in der $PSSessionOption Sitzungskonfiguration festgelegt sind. Sie haben jedoch keinen Vorrang vor maximalen Werten, Kontingenten oder Grenzwerten, die in der Sitzungskonfiguration festgelegt sind.

Eine Beschreibung der Sitzungsoptionen, die die Standardwerte enthalten, finden Sie unter New-PSSessionOption. Informationen zu der $PSSessionOption Einstellungsvariable finden Sie unter about_Preference_Variables. Weitere Informationen zu Sitzungskonfigurationen finden Sie unter about_Session_Configurations.

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

-SSHConnection

Dieser Parameter verwendet ein Array von Hashtabellen, in denen jede Hashtabelle einen oder mehrere Verbindungsparameter enthält, die zum Einrichten einer Secure Shell -Verbindung (SSH) erforderlich sind. Der SSHConnection-Parameter ist nützlich für das Erstellen mehrerer Sitzungen, in denen jede Sitzung unterschiedliche Verbindungsinformationen erfordert.

Die Hashtable weist die folgenden Elemente auf:

  • ComputerName (oder HostName)
  • Port
  • UserName
  • KeyFilePath (oder IdentityFilePath)

ComputerName (oder HostName) ist das einzige Schlüsselwertpaar, das erforderlich ist.

Dieser Parameter wurde in PowerShell 6.0 eingeführt.

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

-SSHTransport

Gibt an, dass die Remoteverbindung mithilfe von Secure Shell (SSH) eingerichtet wird.

Standardmäßig verwendet PowerShell Windows WinRM, um eine Verbindung mit einem Remotecomputer herzustellen. Dieser Switch erzwingt PowerShell, den HostName-Parameter zum Einrichten einer SSH-basierten Remoteverbindung zu verwenden.

Dieser Parameter wurde in PowerShell 6.0 eingeführt.

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

-Subsystem

Gibt das SSH-Subsystem an, das für die neue PSSession verwendet wird.

Dies gibt das Subsystem an, das für das Ziel verwendet werden soll, wie in sshd_config definiert. Das Subsystem startet eine bestimmte Version von PowerShell mit vordefinierten Parametern. Wenn das angegebene Subsystem auf dem Remotecomputer nicht vorhanden ist, schlägt der Befehl fehl.

Wenn dieser Parameter nicht verwendet wird, ist die Standardeinstellung das Powershell-Subsystem.

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

-ThrottleLimit

Gibt die maximale Anzahl von gleichzeitigen Verbindungen an, die zum Ausführen dieses Befehls hergestellt werden können. Wenn Sie diesen Parameter weglassen oder den Wert %%amp;quot;0%%amp;quot; eingeben, wird der Standardwert %%amp;quot;32%%amp;quot; verwendet.

Die Drosselungsgrenze gilt nur für den aktuellen Befehl und nicht für die Sitzung oder den Computer.

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

-UserName

Gibt den Benutzernamen für das Konto an, das zum Ausführen eines Befehls auf dem Remotecomputer verwendet wird. Die Benutzerauthentifizierungsmethode hängt davon ab, wie Secure Shell (SSH) auf dem Remotecomputer konfiguriert ist.

Wenn SSH für die grundlegende Kennwortauthentifizierung konfiguriert ist, werden Sie zum Benutzerkennwort aufgefordert.

Wenn SSH für die schlüsselbasierte Benutzerauthentifizierung konfiguriert ist, kann über den KeyFilePath-Parameter ein Schlüsseldateipfad bereitgestellt werden, und es tritt keine Kennwortaufforderung auf. Wenn sich die Clientbenutzerschlüsseldatei an einem bekannten SSH-Speicherort befindet, wird der KeyFilePath-Parameter nicht für die schlüsselbasierte Authentifizierung benötigt, und die Benutzerauthentifizierung erfolgt automatisch basierend auf dem Benutzernamen. Weitere Informationen finden Sie in der SSH-Dokumentation Ihrer Plattform zur schlüsselbasierten Benutzerauthentifizierung.

Dies ist kein erforderlicher Parameter. Wenn der UserName-Parameter nicht angegeben ist, wird der aktuelle angemeldete Benutzername für die Verbindung verwendet.

Dieser Parameter wurde in PowerShell 6.0 eingeführt.

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

-UseSSL

Gibt an, dass dieses Cmdlet das Secure Sockets Layer (SSL)-Protokoll verwendet, um eine Verbindung mit dem Remotecomputer herzustellen. Standardmäßig wird SSL nicht verwendet.

WS-Management verschlüsselt alle PowerShell-Inhalte, die über das Netzwerk übertragen werden. Der UseSSL-Parameter ist ein zusätzlicher Schutz, der die Daten über ein HTTPS sendet, anstatt HTTP.

Wenn Sie diesen Parameter verwenden, aber SSL ist nicht auf dem Port verfügbar, der für den Befehl verwendet wird, schlägt der Befehl fehl.

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

-VMId

Gibt ein Array von IDs von virtuellen Computern an.

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

-VMName

Gibt ein Array von Namen von virtuellen Computern an.

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

Eingaben

ScriptBlock

Sie können einen Befehl in einem Skriptblock an pipen.Invoke-Command Verwenden Sie die $Input automatische Variable, um die Eingabeobjekte im Befehl darzustellen.

Ausgaben

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

Dieses Cmdlet gibt ein Auftragsobjekt zurück, wenn Sie den AsJob-Parameter verwenden. Wenn Sie den InDisconnectedSession-Parameter angeben, Invoke-Command wird ein PSSession-Objekt zurückgegeben. Andernfalls gibt er die Ausgabe des aufgerufenen Befehls zurück, was der Wert des ScriptBlock-Parameters ist.

Hinweise

Unter Windows Vista und späteren Versionen des Windows-Betriebssystems müssen Sie PowerShell mithilfe des ComputerName-ParametersInvoke-Command verwenden, um einen Befehl auf dem lokalen Computer auszuführen, indem Sie PowerShell mithilfe der Option " Als Administrator ausführen" ausführen.

Wenn Sie Befehle auf mehreren Computern ausführen, verbindet PowerShell mit den Computern in der Reihenfolge, in der sie in der Liste angezeigt werden. Die Befehlsausgabe wird jedoch in der Reihenfolge angezeigt, in der sie von den Remotecomputern empfangen wird, was möglicherweise anders sein kann.

Fehler, die aus dem Ausgeführten Befehl resultieren, sind in den Befehlsergebnissen Invoke-Command enthalten. Fehler, die in einem lokalen Befehl Fehler mit Abbruch sein würden, werden in einem Remotebefehl als Fehler ohne Abbruch behandelt. Diese Strategie stellt sicher, dass das Beenden von Fehlern auf einem Computer den Befehl auf allen Computern, auf denen sie ausgeführt wird, nicht schließen. Diese Vorgehensweise wird selbst dann verwendet, wenn ein Remotebefehl auf einem einzelnen Computer ausgeführt wird.

Wenn sich der Remotecomputer nicht in einer Domäne befindet, auf der der lokale Computer vertraut ist, kann der Computer möglicherweise nicht die Anmeldeinformationen des Benutzers authentifizieren. Um dem Remotecomputer die Liste vertrauenswürdiger Hosts in WS-Management hinzuzufügen, verwenden Sie den folgenden Befehl im WSMAN Anbieter, wobei <Remote-Computer-Name> der Name des Remotecomputers lautet:

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

Wenn Sie eine PSSession mit dem InDisconnectedSession-Parameter trennen , wird der Sitzungsstatus getrennt und die Verfügbarkeit ist Keine. Der Wert der State Eigenschaft bezieht sich auf die aktuelle Sitzung. Ein Wert von "Getrennt " bedeutet, dass die PSSession nicht mit der aktuellen Sitzung verbunden ist. Es bedeutet jedoch nicht, dass die PSSession von allen Sitzungen getrennt wird. Sie kann mit einer anderen Sitzung verbunden sein. Um festzustellen, ob Sie eine Sitzungsverbindung herstellen bzw. wiederherstellen können, verwenden Sie die Availability-Eigenschaft.

Ein Availability-Wert von None gibt an, dass eine Verbindung mit der Sitzung hergestellt werden kann. Ein Wert von Gebucht gibt an, dass Sie keine Verbindung mit der PSSession herstellen können, da sie mit einer anderen Sitzung verbunden ist. Weitere Informationen zu den Werten der State-Eigenschaft von Sitzungen finden Sie unter RunspaceState. Weitere Informationen zu den Werten der Verfügbarkeitseigenschaft von Sitzungen finden Sie unter RunspaceAvailability.

Die Parameter "HostName " und " SSHConnection " wurden ab PowerShell 6.0 enthalten. Sie wurden hinzugefügt, um PowerShell-Remoting basierend auf Secure Shell (SSH) bereitzustellen. PowerShell und SSH werden auf mehreren Plattformen (Windows, Linux, macOS) und PowerShell-Remoting über diese Plattformen unterstützt, auf denen PowerShell und SSH installiert und konfiguriert sind. Dies unterscheidet sich von der vorherigen Windows-Nur-Remoting, die auf WinRM basiert und viele der winRM-spezifischen Features und Einschränkungen gelten nicht. Beispielsweise werden winRM-basierte Kontingente, Sitzungsoptionen, benutzerdefinierte Endpunktkonfiguration und Verbindungsfeatures derzeit nicht unterstützt. Weitere Informationen zum Einrichten von PowerShell SSH-Remoting finden Sie unter PowerShell Remoting Over SSH.