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>]
[-ScriptBlock] <ScriptBlock>
[-SessionOption <PSSessionOption>]
[-Authentication <AuthenticationMechanism>]
[-EnableNetworkAccess]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-CertificateThumbprint <String>]
[<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
[-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]
-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]
-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 die gesamte Ausgabe der Befehle zurück, einschließlich Fehler. 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-Parameter von Invoke-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 einen Skriptblock als Befehl verwenden Invoke-Command
. PowerShell führt den Skriptblock sofort in einem untergeordneten Bereich des aktuellen Bereichs aus.
Bevor Sie Invoke-Command
zum Ausführen von Befehlen auf einem Remotecomputer verwenden, lesen Sie about_Remote.
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 sie auf mehreren Plattformen (Windows, Linux, macOS) funktioniert. Für SSH-basierte Sitzungen verwenden Sie die Parameter HostName oder SSHConnection , um den Remotecomputer und relevante Verbindungsinformationen anzugeben. Weitere Informationen zum Einrichten von PowerShell SSH-Remoting finden Sie unter PowerShell-Remoting über SSH.
Einige Codebeispiele verwenden Splatting, um die Zeilenlänge zu reduzieren. 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 FilePath-Parameter 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 ComputerName-Parameter gibt den Namen des Remotecomputers an. Der Credential-Parameter 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 ScriptBlock-Parameter gibt den Befehl an, der auf dem Remotecomputer ausgeführt werden soll.
Als Antwort fordert PowerShell das Kennwort und eine Authentifizierungsmethode für das User01-Konto 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 persistenten Verbindung
In diesem Beispiel wird derselbe Get-Culture
Befehl in einer Sitzung unter Verwendung einer dauerhaften Verbindung auf dem Remotecomputer 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. In der Regel 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 Session-Parameter gibt die in der Variablen gespeicherte $s
Sitzung an.
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 der Parameter ComputerName und Session von Invoke-Command
verglichen. 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-Parameter von Invoke-Command
, um Befehle auf dem Server02-Remotecomputer auszuführen. 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 ComputerName-Parameter verwenden, erstellt PowerShell eine neue Sitzung zum Ausführen des Befehls.
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 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: Geben Sie einen Befehl ein, der in einer lokalen Variablen gespeichert ist.
In diesem Beispiel wird gezeigt, wie Sie einen Befehl erstellen, der als Skriptblock in einer lokalen Variablen gespeichert ist. Wenn der Skriptblock in einer lokalen 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. Führt Invoke-Command
den auf den Remotecomputern S1 und S2 gespeicherten $command
Befehl aus.
Beispiel 6: Ausführen eines einzelnen Befehls auf mehreren Computern
In diesem Beispiel wird veranschaulicht, wie Invoke-Command
Ein einzelner Befehl auf mehreren Computern ausgeführt wird.
$parameters = @{
ComputerName = "Server01", "Server02", "TST-0143", "localhost"
ConfigurationName = 'MySession.PowerShell'
ScriptBlock = { Get-WinEvent -LogName PowerShellCore/Operational }
}
Invoke-Command @parameters
Der ComputerName-Parameter gibt eine durch Trennzeichen getrennte Liste von Computernamen an. Die Liste der Computer enthält den wert localhost, 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 abgerufen, das auf 200 Remotecomputern ausgeführt wird.
$version = Invoke-Command -ComputerName (Get-Content Machines.txt) -ScriptBlock {(Get-Host).Version}
Da nur ein Befehl ausgeführt wird, müssen Sie keine dauerhaften Verbindungen mit jedem der Computer erstellen. Der Befehl verwendet stattdessen den ComputerName-Parameter, um die Computer anzugeben. Um die Computer anzugeben, wird das Get-Content
Cmdlet verwendet, um den Inhalt der Machine.txt-Datei abzurufen, einer 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 werden einzeln ausgeführt. Nach Abschluss der Befehle 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 , sodass 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 in jeder Sitzung einen Hintergrundauftrag 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 leitet das Auftragsobjekt an $j
das Receive-Job
Cmdlet weiter 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 Bereichsmodifizierer Using
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 $Log
durch den Using
Bereichsmodifizierer präfixiert wird, um anzugeben, dass er in der lokalen Sitzung und nicht in der Remotesitzung erstellt wurde.
Beispiel 10: Ausblenden des Computernamens
In diesem Beispiel wird die Auswirkung der Verwendung des HideComputerName-Parameters von Invoke-Command
veranschaulicht.
HideComputerName ändert nicht das Objekt, das dieses Cmdlet zurückgibt. Es ändert nur die Anzeige. Sie können weiterhin die Format-Cmdlets 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
Die ersten beiden Befehle werden verwendet Invoke-Command
, um einen Get-Process
Befehl für den PowerShell-Prozess auszuführen. 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üsselwort (keyword) in einem Skriptblock
Die Param
Schlüsselwort (keyword) und der Parameter ArgumentList 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 (keyword) 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, $param1
und $param2
. Get-ChildItem
verwendet die benannten Parameter Name und Include mit den Variablennamen. ArgumentList übergibt die Werte an die Variablen.
Beispiel 12: Verwenden der $args automatischen Variablen 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 der Dateien eines .txt
Servers angezeigt. Der Get-ChildItem
Path-Parameter ist die Position 0 und der Filter-Parameter die Position 1.
Weitere Informationen zur $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-Command
verwendet einen ScriptBlock-Parameter und Get-ChildItem
gibt die $args[0]
Arraywerte und $args[1]
an. ArgumentList übergibt die $args
Arraywerte an die Get-ChildItem
Parameterpositionen für Path und Filter.
Beispiel 13: Ausführen eines Skripts auf allen Computern, die in einer Textdatei aufgeführt sind
In diesem Beispiel wird das Invoke-Command
Cmdlet verwendet, um das Sample.ps1
Skript auf allen in der Datei aufgeführten Servers.txt
Computern auszuführen. Der Befehl verwendet den FilePath-Parameter, um die Skriptdatei anzugeben. Mit diesem Befehl können Sie das Skript auf den Remotecomputern ausführen, auch wenn die Skriptdatei für die Remotecomputer nicht zugänglich ist.
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 der 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 durch einen Uniform Resource Identifier (URI) identifiziert wird. In diesem Beispiel wird ein Set-Mailbox
Befehl auf einem Exchange-Remoteserver 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
In der ersten Zeile wird das Get-Credential
Cmdlet verwendet, um Windows Live ID-Anmeldeinformationen in der $LiveCred
Variablen zu speichern. PowerShell fordert den Benutzer zur Eingabe von Windows Live ID-Anmeldeinformationen auf.
Die $parameters
Variable ist eine Hashtabelle, die die Parameter enthält, 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 Credential gibt die in der Variablen gespeicherten $LiveCred
Anmeldeinformationen an. 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 beim Auswerten der eingehenden HTTPS-Verbindung nicht die Listen Zertifizierungsstelle, den kanonischen Namen und die Sperrung überprüft. Das SessionOption-Objekt wird in der $so
Variablen gespeichert.
Hinweis
Das Deaktivieren dieser Überprüfungen ist für die Problembehandlung geeignet, 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 AllowRedirection-Parameter bietet eine explizite Berechtigung zum Umleiten der Verbindung an einen alternativen Endpunkt. Der SessionOption-Parameter verwendet das sitzungsobjekt, das in der $max
Variablen gespeichert ist.
Wenn der von ConnectionURI angegebene Remotecomputer eine Umleitungsmeldung zurückgibt, leitet PowerShell die Verbindung um. Wenn das neue Ziel jedoch eine weitere Umleitungsmeldung zurückgibt, wird der Wert für die Umleitungsanzahl von 1 überschritten und Invoke-Command
gibt einen nicht beendenden Fehler zurück.
Beispiel 17: Zugreifen auf eine Netzwerkfreigabe in einer Remotesitzung
In diesem Beispiel wird gezeigt, wie Sie über eine Remotesitzung auf eine Netzwerkfreigabe zugreifen. Drei Computer werden verwendet, um das Beispiel zu veranschaulichen. Server01 ist der lokale Computer, Server02 der Remotecomputer und Net03 enthält die Netzwerkfreigabe. Server01 stellt eine Verbindung mit Server02 her, und server02 führt dann einen zweiten Hop zu Net03 aus, 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 CredSSP-Delegierung (Credential Security Support Provider) ist in den Clienteinstellungen auf dem lokalen Computer und in den Diensteinstellungen auf dem Remotecomputer aktiviert. Zum Ausführen der Befehle in diesem Beispiel 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 = @{
Session = $s
ScriptBlock = { Get-Item \\Net03\Scripts\LogFiles.ps1 }
Authentication = "CredSSP"
Credential = "Domain01\Admin01"
}
Invoke-Command @parameters
Das Enable-WSManCredSSP
Cmdlet ermöglicht die CredSSP-Delegierung vom lokalen Server01-Computer auf den Server02-Remotecomputer. Der Role-Parameter gibt den 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
Variablen.
Das Invoke-Command
Cmdlet verwendet die $s
Variable, um eine Verbindung mit dem Remotecomputer Server02 herzustellen. Der ScriptBlock-Parameter wird auf dem Remotecomputer ausgeführt Enable-WSManCredSSP
. Der Role-Parameter gibt den Server an, um die CredSSP-Servereinstellung auf dem Remotecomputer zu konfigurieren.
Die $parameters
Variable enthält die Parameterwerte, um eine Verbindung mit der Netzwerkfreigabe herzustellen. Das Invoke-Command
Cmdlet führt einen Get-Item
Befehl in der -Sitzung in $s
aus. Mit diesem Befehl wird ein Skript von der \\Net03\Scripts
Netzwerkfreigabe abgerufen. Der Befehl verwendet den Authentifizierungsparameter mit dem Wert CredSSP und den Credential-Parameter mit dem Wert 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 Parameters ComputerName 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 OutputBufferingMode-Wert ist auf Drop festgelegt, und der IdleTimeout-Wert ist auf 43200000 Millisekunden (12 Stunden) festgelegt.
Verwenden Sie das Cmdlet, um die Ergebnisse von Befehlen und Skripts abzurufen, die Receive-PSSession
in getrennten Sitzungen ausgeführt werden.
Beispiel 19: Ausführen eines Befehls auf einem Remotecomputer mithilfe von SSH
In diesem Beispiel wird gezeigt, wie Sie einen Befehl mit Secure Shell (SSH) auf einem Remotecomputer ausführen. Wenn SSH auf dem Remotecomputer für die Aufforderung zur Eingabe von Kennwörtern konfiguriert ist, erhalten Sie eine Kennworteingabeaufforderung. Andernfalls müssen Sie die 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 zur Eingabe eines Kennworts aufgefordert, es sei denn, die Schlüsselauthentifizierung schlägt fehl und der Remotecomputer ist so konfiguriert, dass die grundlegende Kennwortauthentifizierung zulässt.
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 Eine Skriptdatei auf mehreren Remotecomputern mithilfe von SSH und dem SSHConnection-Parametersatz ausgeführt wird. Der SSHConnection-Parameter verwendet ein Array von Hashtabellen, die Verbindungsinformationen für jeden Computer enthalten. Dieses Beispiel erfordert, dass auf den Ziel-Remotecomputern SSH für die Unterstützung der schlüsselbasierten Benutzerauthentifizierung konfiguriert ist.
$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 umzuleiten.
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 New-PSSessionOption
Cmdlets, oder legen Sie die MaximumConnectionRedirectionCount-Eigenschaft der $PSSessionOption
Einstellungsvariablen 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 nicht den ConnectionURI-Parameter im Befehl 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 lokalen Variablen im Befehl bereit. Die Variablen im Befehl werden durch diese Werte ersetzt, bevor der Befehl auf dem Remotecomputer ausgeführt wird. Geben Sie die Werte in eine durch Kommas getrennte Liste ein. Werte werden Variablen in der Reihenfolge zugeordnet, in der sie aufgelistet werden. Der Alias für ArgumentList ist Args.
Die Werte im ArgumentList-Parameter können tatsächliche Werte sein, z. B. 1024, oder sie können Verweise auf lokale Variablen sein, z. B $max
. .
Um lokale Variablen in einem Befehl zu verwenden, verwenden Sie das folgende Befehlsformat:
{param($<name1>[, $<name2>]...) <command-with-local-variables>} -ArgumentList <value>
- oder - <local-variable>
Die param-Schlüsselwort (keyword) listet die lokalen Variablen auf, die im Befehl verwendet werden. ArgumentList stellt die Werte der Variablen in der Reihenfolge bereit, in der sie aufgelistet sind. 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 viel Zeit in Anspruch 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 der Verwendung des Invoke-Command
Cmdlets zum Remote ausführen eines Cmdlets Start-Job
. 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. Die CredSSP-Authentifizierung ist nur in Windows Vista, Windows Server 2008 und höheren Versionen des Windows-Betriebssystems verfügbar.
Die zulässigen Werte für diesen Parameter sind wie folgt:
- Standard
- Basic
- 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( 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 funktionieren nicht mit Domänenkonten.
Um einen Zertifikatfingerabdruck abzurufen, verwenden Sie einen Get-Item
oder Get-ChildItem
-Befehl im PowerShell-Laufwerk Cert:.
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 dauerhafte Verbindung benötigen, verwenden Sie den Session-Parameter .
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 Credential-Parameter enthalten. Der Computer muss für den HTTPS-Transport konfiguriert sein, oder die IP-Adresse des Remotecomputers muss in der WinRM TrustedHosts-Liste des lokalen Computers enthalten sein. Anweisungen zum Hinzufügen eines Computernamens zur Liste TrustedHosts finden Sie unter Hinzufügen eines Computers zur Liste der vertrauenswürdigen Hosts.
Unter Windows Vista und höheren Versionen des Windows-Betriebssystems müssen Sie PowerShell mit der Option Als Administrator ausführen, um den lokalen Computer in den Wert von ComputerName einzubeziehen.
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 vorangestellt: https://schemas.microsoft.com/PowerShell
.
Bei Verwendung mit SSH gibt dieser Parameter das Subsystem an, das für das Ziel verwendet werden soll, wie in sshd_config
definiert. 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
Einstellungsvariablen auf dem lokalen Computer. Wenn diese Einstellungsvariable nicht festgelegt ist, ist der Standardwert 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:
https://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 80 für HTTP und 443 für HTTPS erstellt. 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 an einen anderen URI umleitet, verhindert PowerShell die Umleitung, es sei denn, Sie verwenden den Parameter AllowRedirection im Befehl.
Type: | Uri[] |
Aliases: | URI, CU |
Position: | 0 |
Default value: | https://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 Get-Credential
Cmdlet generiertes PSCredential-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 Schutz von SecureString-Daten 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 Loopbacksitzungen ein interaktives Sicherheitstoken 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 entsteht und endet. Um eine Loopbacksitzung zu erstellen, lassen Sie den ComputerName-Parameter aus, oder legen Sie seinen 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 für die Authentifizierung bei Remotecomputern bietet.
Der EnableNetworkAccess-Parameter ist nur bei Loopbacksitzungen wirksam. Wenn Sie EnableNetworkAccess verwenden, wenn Sie eine Sitzung auf einem Remotecomputer erstellen, ist der Befehl erfolgreich, aber der Parameter wird ignoriert.
Sie können den Remotezugriff in einer Loopbacksitzung zulassen, indem Sie den CredSSP-Wert des Authentication-Parameters verwenden, der die Sitzungsanmeldeinformationen an andere Computer delegiert.
Um den Computer vor böswilligem Zugriff zu schützen, können getrennte Loopbacksitzungen mit interaktiven Token, die mit EnableNetworkAccess erstellt wurden, nur von dem Computer wiederhergestellt werden, auf dem die Sitzung erstellt wurde. 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 übergeben 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 dadurch 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 und nicht über 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
erstellt auf jedem Remotecomputer eine persistente Sitzung, startet den durch den ScriptBlock - oder FilePath-Parameter angegebenen Befehl und trennt dann die Sitzung. Die Befehle werden weiterhin in den getrennten Sitzungen ausgeführt. Mit InDisconnectedSession können Sie Befehle ausführen, ohne eine Verbindung mit den Remotesitzungen aufrechtzuerhalten. 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 aufgeteilt zu werden.
Sie können InDisconnectedSession nicht mit dem Session-Parameter 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 Cmdlets oderReceive-PSSession
, um eine Verbindung mit der Connect-PSSession
getrennten Sitzung herzustellen. Verwenden Sie Receive-PSSession
das Cmdlet, um die Ergebnisse von Befehlen abzurufen, die in der Sitzung ausgeführt wurden. Um Befehle auszuführen, die eine Ausgabe in einer getrennten Sitzung generieren, legen Sie den Wert der Sitzungsoption OutputBufferingMode auf Drop fest. Wenn Sie beabsichtigen, eine Verbindung mit der getrennten Sitzung herzustellen, legen Sie das Leerlauftimeout in der Sitzung so fest, dass es ausreichend Zeit für das Herstellen einer Verbindung bietet, bevor Sie die Sitzung löschen.
Sie können den Ausgabepufferungsmodus und das Leerlauftimeout im SessionOption-Parameter oder in der Einstellungsvariablen $PSSessionOption
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.
Wenn Sie den InputObject-Parameter verwenden, verwenden Sie 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 haben Aufträge den Namen Job<n>
, wobei <n>
eine Ordnungszahl ist.
Wenn Sie den Parameter JobName 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) zum Authentifizieren eines Benutzers auf einem Remotecomputer verwendet wird.
SSH ermöglicht die Benutzerauthentifizierung über private und öffentliche Schlüssel als Alternative zur standardbasierten 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. Geben Sie zum Konfigurieren des Listeners 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 nur, wenn Dies erforderlich ist. 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 PowerShell-Remotesitzung 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.
Dieser Parameter ist erforderlich.
Standardmäßig werden alle Variablen im Befehl auf dem Remotecomputer ausgewertet. Verwenden Sie ArgumentList, um lokale Variablen in den Befehl einzuschließen.
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 dem dieses Cmdlet den Befehl ausführt. Geben Sie eine Variable ein, die PSSession-Objekte enthält, oder einen Befehl, der die PSSession-Objekte erstellt oder abruft, z. B. einen New-PSSession
- oder Get-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, z. B. einem Get-PSSession
Befehl, auf die Sitzung zu verweisen. 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. ein Objekt, das Sie mit dem New-PSSessionOption
Cmdlet erstellen, oder eine Hashtabelle, in der die Schlüssel Sitzungsoptionsnamen sind und die Werte Sitzungsoptionswerte sind.
Die Standardwerte für die Optionen werden durch den Wert der $PSSessionOption
Einstellungsvariablen 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 Einstellungsvariablen $PSSessionOption
und in der Sitzungskonfiguration festgelegt sind. Sie haben jedoch keine Priorität 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 zur Einstellungsvariablen $PSSessionOption
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 Herstellen einer SSH-Verbindung (Secure Shell) erforderlich sind. Der SSHConnection-Parameter ist nützlich, um mehrere Sitzungen zu erstellen, bei denen jede Sitzung unterschiedliche Verbindungsinformationen erfordert.
Die Hashtabelle verfügt über die folgenden Member:
- ComputerName (oder HostName)
- Port
- UserName
- KeyFilePath (oder IdentityFilePath)
ComputerName (oder HostName) ist das einzige Schlüssel-Wert-Paar, 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) hergestellt wird.
Standardmäßig verwendet PowerShell Windows WinRM, um eine Verbindung mit einem Remotecomputer herzustellen. Dieser Switch erzwingt PowerShell, den HostName-Parameter zum Herstellen 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 der Standardwert 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 wird.
Wenn SSH für die Standardkennwortauthentifizierung konfiguriert ist, werden Sie zur Eingabe des Benutzerkennworts aufgefordert.
Wenn SSH für die schlüsselbasierte Benutzerauthentifizierung konfiguriert ist, kann über den KeyFilePath-Parameter ein Schlüsseldateipfad angegeben werden, und es wird keine Kennworteingabeaufforderung angezeigt. Wenn sich die Clientbenutzerschlüsseldatei an einem bekannten SSH-Speicherort befindet, wird der KeyFilePath-Parameter für die schlüsselbasierte Authentifizierung nicht 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 Parameter UserName nicht angegeben wird, 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 SSL-Protokoll (Secure Sockets Layer) 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 anstelle von HTTP sendet.
Wenn Sie diesen Parameter verwenden, ssl jedoch nicht für den Port verfügbar ist, 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 virtueller Computer 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
Sie können einen Befehl in einem Skriptblock an übergeben 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 Parameter InDisconnectedSession angeben, Invoke-Command
wird ein PSSession-Objekt zurückgegeben. Andernfalls wird die Ausgabe des aufgerufenen Befehls zurückgegeben, bei dem es sich um den Wert des ScriptBlock-Parameters handelt.
Hinweise
Unter Windows Vista und höheren Versionen des Windows-Betriebssystems müssen Sie PowerShell mit der Option Als Administrator ausführen, um den ComputerName-Parameter von Invoke-Command
zum Ausführen eines Befehls auf dem lokalen Computer verwenden zu können.
Wenn Sie Befehle auf mehreren Computern ausführen, stellt PowerShell eine Verbindung mit den Computern in der Reihenfolge her, 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 sich möglicherweise unterscheidet.
Fehler, die aus dem ausgeführten Befehl resultieren, Invoke-Command
sind in den Befehlsergebnissen 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 der Befehl beim Beenden von Fehlern auf einem Computer nicht auf allen Computern geschlossen wird, auf denen er ausgeführt wird. 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, der der lokale Computer vertraut, kann der Computer die Anmeldeinformationen des Benutzers möglicherweise nicht authentifizieren. Um den Remotecomputer der Liste der vertrauenswürdigen Hosts in WS-Management hinzuzufügen, verwenden Sie den folgenden Befehl im WSMAN
Anbieter, wobei <Remote-Computer-Name>
der Name des Remotecomputers ist:
Set-Item -Path WSMan:\Localhost\Client\TrustedHosts -Value \<Remote-Computer-Name\>
Wenn Sie eine PSSession mithilfe des Parameters InDisconnectedSession trennen, lautet der Sitzungsstatus Getrennt, und die Verfügbarkeit ist Keine. Der Wert der State Eigenschaft bezieht sich auf die aktuelle Sitzung. Der Wert "Disconnected" bedeutet, dass die PSSession nicht mit der aktuellen Sitzung verbunden ist. Dies bedeutet jedoch nicht, dass die PSSession von allen Sitzungen getrennt ist. 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. Der Wert Busy 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 Availability-Eigenschaft von Sitzungen finden Sie unter RunspaceAvailability.
Die Parameter HostName und SSHConnection waren 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) unterstützt, und PowerShell-Remoting funktioniert über diese Plattformen, auf denen PowerShell und SSH installiert und konfiguriert sind. Dies ist unabhängig von dem vorherigen Nur-Remoting für Windows, das auf WinRM basiert, und viele der WinRM-spezifischen Features und Einschränkungen gelten nicht. Beispielsweise werden WinRM-basierte Kontingente, Sitzungsoptionen, benutzerdefinierte Endpunktkonfiguration und Features zum Trennen/Erneutes Verbinden derzeit nicht unterstützt. Weitere Informationen zum Einrichten von PowerShell SSH-Remoting finden Sie unter PowerShell-Remoting über SSH.