Invoke-Command

在本地和远程计算机上运行命令。

语法

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

说明

cmdlet Invoke-Command 在本地或远程计算机上运行命令,并返回命令的所有输出,包括错误。 使用单个 Invoke-Command 命令,可以在多台计算机上运行命令。

若要在远程计算机上运行单个命令,请使用 ComputerName 参数。 若要运行一系列共享数据的相关命令,请使用 New-PSSession cmdlet 创建 PSSession (远程计算机上的持久连接) ,然后使用 的 Invoke-CommandSession 参数在 PSSession 中运行命令。 若要在断开连接的会话中运行命令,请使用 InDisconnectedSession 参数。 若要在后台作业中运行命令,请使用 AsJob 参数。

还可以在本地计算机上使用 Invoke-Command 脚本块作为命令。 PowerShell 立即在当前范围的子作用域中运行脚本块。

在使用 Invoke-Command 在远程计算机上运行命令之前,请阅读 about_Remote

从 PowerShell 6.0 开始,可以使用安全外壳 (SSH) 建立与远程计算机上的连接并调用命令。 必须在本地计算机上安装 SSH,并且必须使用 PowerShell SSH 终结点配置远程计算机。 基于 SSH 的 PowerShell 远程会话的优点是它可以跨多个平台工作, (Windows、Linux、macOS) 。 对于基于 SSH 的会话,请使用 HostNameSSHConnection 参数来指定远程计算机和相关连接信息。 有关如何设置 PowerShell SSH 远程处理的详细信息,请参阅 通过 SSH 进行 PowerShell 远程处理

某些代码示例使用展开来减小行长。 有关详细信息,请参阅 about_Splatting

示例

示例 1:在服务器上运行脚本

此示例在 Test.ps1 Server01 计算机上运行脚本。

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

FilePath 参数指定位于本地计算机上的脚本。 该脚本在远程计算机上运行,并将结果返回到本地计算机。

示例 2:在远程服务器上运行命令

本示例在 Server01 远程计算机上运行 Get-Culture 命令。

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

ComputerName 参数指定远程计算机的名称。 Credential 参数用于在 Domain01\User01 的安全上下文中运行命令,Domain01\User01 是有权运行命令的用户。 ScriptBlock 参数指定要在远程计算机上运行的命令。

作为响应,PowerShell 请求 User01 帐户的密码和身份验证方法。 然后,它将在 Server01 计算机上运行该命令并返回结果。

示例 3:在持久连接中运行命令

此示例在名为 Server02 的远程计算机上使用持久连接在会话中运行相同的 Get-Culture 命令。

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

cmdlet New-PSSession 在 Server02 远程计算机上创建会话,并将其保存在 变量中 $s 。 通常,只有在远程计算机上运行一系列命令时,才创建会话。

cmdlet 在 Invoke-CommandGet-Culture Server02 上运行命令。 Session 参数指定保存在 变量中的$s会话。

作为响应,PowerShell 在 Server02 计算机上的会话中运行 命令。

示例 4:使用会话运行一系列共享数据的命令

此示例比较使用 的 ComputerNameSession 参数 Invoke-Command的效果。 它显示了如何使用一个会话来运行共享相同数据的一系列命令。

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

前两个命令使用 的 Invoke-CommandComputerName 参数在 Server02 远程计算机上运行命令。 第一个命令使用 Get-Process cmdlet 获取远程计算机上的 PowerShell 进程并将其保存在 变量中 $p 。 第二个命令将获取 PowerShell 进程的 VirtualMemorySize 属性的值。

使用 ComputerName 参数时,PowerShell 会创建一个新会话来运行命令。 命令完成后,会话将关闭。 变量 $p 是在一个连接中创建的,但它不存在于为第二个命令创建的连接中。

此问题可通过在远程计算机上创建持久会话,然后在同一会话中运行这两个命令来解决。

New-PSSession cmdlet 在计算机 Server02 上创建一个持久会话,并将该会话保存在 变量中 $s 。 下面的 Invoke-Command 行使用 Session 参数在同一会话中运行这两个命令。 由于这两个命令在同一会话中运行,因此该值 $p 将保持活动状态。

示例 5:输入存储在局部变量中的命令

此示例演示如何创建作为脚本块存储在局部变量中的命令。 将脚本块保存在局部变量中时,可以将变量指定为 ScriptBlock 参数的值。

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

变量 $command 存储 Get-WinEvent 格式化为脚本块的命令。 运行 Invoke-Command 存储在 S1 和 S2 远程计算机上的 中的 $command 命令。

示例 6:在多台计算机上运行单个命令

此示例演示如何使用 Invoke-Command 在多台计算机上运行单个命令。

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

ComputerName 参数指定以逗号分隔的计算机名称列表。 计算机列表包含 localhost 值,该值表示本地计算机。 ConfigurationName 参数指定备用会话配置。 ScriptBlock 参数运行Get-WinEvent,从每台计算机获取 PowerShellCore/操作事件日志。

示例 7:获取多台计算机上的主机程序版本

此示例获取在 200 台远程计算机上运行的 PowerShell 主机程序的版本。

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

由于只运行一个命令,因此不必创建与每台计算机的持久连接。 而是由此命令使用 ComputerName 参数来指示计算机。 为了指定计算机,它使用 Get-Content cmdlet 获取 Machine.txt 文件(计算机名称文件)的内容。

cmdlet 在 Invoke-Command 远程计算机上运行 Get-Host 命令。 它使用点表示法获取 PowerShell 主机的 Version 属性。

这些命令一次运行一个。 命令完成后,所有计算机的命令输出将保存在 变量中 $version 。 输出包括数据来源计算机的名称。

示例 8:在多台远程计算机上运行后台作业

此示例在两台远程计算机上运行 命令。 命令 Invoke-Command 使用 AsJob 参数,以便命令作为后台作业运行。 命令在远程计算机上运行,但作业存在于本地计算机上。 结果将传输到本地计算机。

$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

cmdlet New-PSSession 在 Server01 和 Server02 远程计算机上创建会话。 cmdlet Invoke-Command 在每个会话中运行后台作业。 该命令使用 AsJob 参数将命令作为后台作业运行。 此命令将返回一个包含两个子作业对象的作业对象,每个子作业对象分别对应于在两台远程计算机上运行的每个作业。

命令 Get-Job 将作业对象保存在 变量中 $j 。 然后,该 $j 变量通过管道传递给 Format-List cmdlet,以在列表中显示作业对象的所有属性。 最后一个命令获取作业的结果。 它将作业对象 $j 通过管道传递给 Receive-Job cmdlet,并将结果存储在 变量中 $results

示例 9:在远程计算机上运行的命令中包含局部变量

本示例显示了如何将局部变量的值包括在运行于远程计算机上的命令中。 命令使用 Using 范围修饰符标识远程命令中的局部变量。 默认情况下,假定所有变量均已在远程会话中定义。 PowerShell Using 3.0 中引入了范围修饰符。 有关范围修饰符的详细信息 Using ,请参阅 about_Remote_Variablesabout_Scopes

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

变量 $Log 存储事件日志的名称 PowerShellCore/Operational。 cmdlet Invoke-CommandGet-WinEvent 在 Server01 上运行,以从事件日志中获取十个最新事件。 LogName 参数的值是$Log以作用域修饰符为前缀Using的变量,指示它是在本地会话而不是远程会话中创建的。

示例 10:隐藏计算机名称

此示例演示使用 的 HideComputerName 参数 Invoke-Command的效果。 HideComputerName 不会更改此 cmdlet 返回的对象。 它仅更改显示。 你仍然可以使用 Format cmdlet 显示任何受影响对象的 PsComputerName 属性。

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

前两个Get-Process命令使用 Invoke-Command 为 PowerShell 进程运行命令。 第一个命令的输出包括 PsComputerName 属性,此属性包含运行该命令的计算机的名称。 使用 HideComputerName 的第二个命令的输出不包括 PsComputerName 列。

示例 11:在脚本块中使用 Param 关键字 (keyword)

关键字 (keyword) ParamArgumentList 参数用于将变量值传递给脚本块中的命名参数。 此示例显示以字母 a 开头且扩展名为 的 .pdf 文件名。

有关关键字 (keyword) 的详细信息Param,请参阅 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 使用 ScriptBlock 参数,该参数定义两个变量: $param1$param2Get-ChildItem 将命名参数 NameInclude 与变量名称一起使用。 ArgumentList 将值传递给变量。

示例 12:在脚本块中使用$args自动变量

自动 $args 变量和 ArgumentList 参数用于将数组值传递到脚本块中的参数位置。 此示例显示服务器的文件目录内容 .txtGet-ChildItemPath 参数的位置为 0,Filter 参数为位置 1。

有关 变量的详细信息 $args ,请参阅 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 使用 ScriptBlock 参数并 Get-ChildItem 指定 $args[0]$args[1] 数组值。 ArgumentList$args数组值传递给 Get-ChildItemPathFilter 的参数位置。

示例 13:在文本文件中列出的所有计算机上运行脚本

此示例使用 Invoke-Command cmdlet 在 文件中列出的Servers.txt所有计算机上运行Sample.ps1脚本。 该命令使用 FilePath 参数来指定脚本文件。 此命令允许在远程计算机上运行脚本,即使远程计算机无法访问脚本文件也是如此。

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

提交命令时,文件的内容 Sample.ps1 将复制到脚本块中,脚本块将在每个远程计算机上运行。 此步骤等效于使用 ScriptBlock 参数来提交脚本的内容。

示例 14:使用 URI 在远程计算机上运行命令

此示例演示如何在远程计算机上运行由统一资源标识符 (URI) 标识的命令。 此特定示例在 Set-Mailbox 远程 Exchange 服务器上运行命令。

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

第一行使用 Get-Credential cmdlet 在 变量中 $LiveCred 存储 Windows Live ID 凭据。 PowerShell 提示用户输入 Windows Live ID 凭据。

变量 $parameters 是包含要传递给 cmdlet 的参数的 Invoke-Command 哈希表。 cmdlet Invoke-Command 使用 Microsoft.Exchange 会话配置运行Set-Mailbox命令。 ConnectionURI 参数指定 Exchange 服务器终结点的 URL。 Credential 参数指定存储在 变量中的$LiveCred凭据。 AuthenticationMechanism 参数指定基本身份验证的使用。 ScriptBlock 参数指定包含该命令的脚本块。

示例 15:使用会话选项

此示例演示如何创建和使用 SessionOption 参数。

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

cmdlet New-PSSessionOption 创建一个会话选项对象,该对象会导致远程端在评估传入 HTTPS 连接时不验证证书颁发机构、规范名称和吊销Lists。 SessionOption 对象保存在 变量中$so

注意

禁用这些检查可以方便地进行故障排除,但显然不安全。

cmdlet Invoke-Command 远程运行 Get-HotFix 命令。 SessionOption 参数给定变量$so

示例 16:在远程命令中管理 URI 重定向

此示例演示如何使用 AllowRedirectionSessionOption 参数来管理远程命令中的 URI 重定向。

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

cmdlet New-PSSessionOption 创建保存在 变量中的 $maxPSSessionOption 对象。 该命令使用 MaximumRedirection 参数将 PSSessionOption 对象的 MaximumConnectionRedirectionCount 属性设置为 1。

cmdlet 在Invoke-Command远程Microsoft Exchange Server上运行Get-Mailbox命令。 AllowRedirection 参数提供将连接重定向到备用终结点的显式权限。 SessionOption 参数使用存储在 变量中的$max会话对象。

因此,如果 ConnectionURI 指定的远程计算机返回重定向消息,PowerShell 将重定向连接,但如果新目标返回另一条重定向消息,则会超出重定向计数值 1,并 Invoke-Command 返回非终止错误。

示例 17:访问远程会话中的网络共享

此示例演示如何从远程会话访问网络共享。 三台计算机用于演示该示例。 Server01 是本地计算机,Server02 是远程计算机,Net03 包含网络共享。 Server01 连接到 Server02,然后 Server02 执行第二个跃点到 Net03 以访问网络共享。 有关 PowerShell 远程处理如何支持计算机之间的跃点的详细信息,请参阅 在 PowerShell 远程处理中创建第二个跃点

在本地计算机上的客户端设置和远程计算机上的服务设置中启用所需的凭据安全支持提供程序 (CredSSP) 委派。 若要运行此示例中的命令,你必须是本地计算机和远程计算机上的 Administrators 组的成员。

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

cmdlet Enable-WSManCredSSP 启用从 Server01 本地计算机到 Server02 远程计算机的 CredSSP 委派。 Role 参数指定客户端在本地计算机上配置 CredSSP 客户端设置。

New-PSSession 为 Server02 创建 PSSession 对象,并将该对象存储在 变量中 $s

cmdlet Invoke-Command 使用 $s 变量连接到远程计算机 Server02。 ScriptBlock 参数在远程计算机上运行Enable-WSManCredSSPRole 参数指定要在远程计算机上配置 CredSSP 服务器设置的服务器。

变量 $parameters 包含用于连接到网络共享的参数值。 cmdlet Invoke-Command 在 中的会话中$s运行Get-Item命令。 此命令从网络共享获取 \\Net03\Scripts 脚本。 该命令使用值为 CredSSPAuthentication 参数和值为 Domain01\Admin01Credential 参数。

示例 18:在许多远程计算机上启动脚本

此示例在一百多台计算机上运行脚本。 若要最大程度地降低对本地计算机的影响,它会连接到每台计算机、启动脚本,然后从每台计算机断开连接。 脚本将继续在断开连接的会话中运行。

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

命令使用 Invoke-Command 运行脚本。 ComputerName 参数的值是一个Get-Content命令,用于从文本文件中获取远程计算机的名称。 InDisconnectedSession 参数将在启动该命令后立即断开与会话的连接。 FilePath 参数的值是每台计算机上运行的脚本Invoke-Command

SessionOption 的值是哈希表。 OutputBufferingMode 值设置为 Drop,IdleTimeout 值设置为 43200000 毫秒 (12 小时) 。

若要获取在断开连接的会话中运行的命令和脚本的结果,请使用 Receive-PSSession cmdlet。

示例 19:使用 SSH 在远程计算机上运行命令

此示例演示如何使用安全外壳 (SSH) 在远程计算机上运行命令。 如果在远程计算机上将 SSH 配置为提示输入密码,则会收到密码提示。 否则,必须使用基于 SSH 密钥的用户身份验证。

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

示例 20:使用 SSH 在远程计算机上运行命令并指定用户身份验证密钥

此示例演示如何使用 SSH 在远程计算机上运行命令,并指定用于用户身份验证的密钥文件。 除非密钥身份验证失败,并且远程计算机配置为允许基本密码身份验证,否则系统不会提示你输入密码。

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

示例 21:使用 SSH 作为作业在多台远程计算机上运行脚本文件

此示例演示如何使用 SSH 和 SSHConnection 参数集在多台远程计算机上运行脚本文件。 SSHConnection 参数采用包含每台计算机连接信息的哈希表数组。 此示例要求目标远程计算机已将 SSH 配置为支持基于密钥的用户身份验证。

$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

参数

-AllowRedirection

允许将此连接重定向到备用统一资源标识符 (URI)。

使用 ConnectionURI 参数时,远程目标将返回一个指令,以重定向到不同的 URI。 默认情况下,PowerShell 不会重定向连接,但你可以使用此参数允许它重定向连接。

你也可以通过更改 MaximumConnectionRedirectionCount 会话选项值,限制重定向连接的次数。 使用 cmdlet 的 New-PSSessionOptionMaximumRedirection 参数或设置首选项变量的 $PSSessionOptionMaximumConnectionRedirectionCount 属性。 默认值为 5。

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

-ApplicationName

指定连接 URI 的应用程序名称段。 如果不在命令中使用 ConnectionURI 参数,请使用此参数指定应用程序名称。

默认值是本地计算机上的首选项变量的值 $PSSessionApplicationName 。 如果未定义此首选项变量,则默认值为 WSMAN。 该值适用于大多数使用情况。 有关详细信息,请参阅 about_Preference_Variables

WinRM 服务使用应用程序名称来选择为连接请求提供服务的侦听器。 此参数的值应与远程计算机上的侦听器的 URLPrefix 属性值匹配。

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

提供命令中的局部变量的值。 在远程计算机上运行命令之前,该命令中的变量将替换为这些值。 以逗号分隔的列表形式输入值。 值按照变量的列出顺序与变量相关联。 ArgumentList 的别名是 Args。

ArgumentList 参数中的值可以是实际值(如 1024),也可以是局部变量的引用,例如 $max

若要在命令中使用局部变量,请使用以下命令格式:

{param($<name1>[, $<name2>]...) <command-with-local-variables>} -ArgumentList <value> - 或 - <local-variable>

参数关键字 (keyword) 列出了命令中使用的局部变量。 ArgumentList 按变量的列出顺序提供这些变量的值。 有关 ArgumentList 行为的详细信息,请参阅 about_Splatting

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

-AsJob

指示此 cmdlet 在远程计算机上将命令作为后台作业运行。 使用此参数可以运行需要很长时间才能完成的命令。

使用 AsJob 参数时,命令将返回一个表示作业的对象,然后显示命令提示符。 当作业完成时,你可以继续在此会话中工作。 若要管理作业,请使用 *-Job cmdlet。 若要获取作业结果,请使用 Receive-Job cmdlet。

AsJob 参数类似于使用 Invoke-Command cmdlet 远程运行 Start-Job cmdlet。 但是,使用 AsJob,作业在本地计算机上创建,即使作业在远程计算机上运行。 远程作业的结果将自动返回到本地计算机。

有关 PowerShell 后台作业的详细信息,请参阅 about_Jobsabout_Remote_Jobs

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

-Authentication

指定用于对用户凭据进行身份验证的机制。 CredSSP 身份验证仅在 Windows Vista、Windows Server 2008 和更高版本的 Windows 操作系统中可用。

此参数的可接受值如下所示:

  • Default
  • 基本
  • Credssp
  • 摘要
  • Kerberos
  • Negotiate
  • NegotiateWithImplicitCredential

默认值为 Default。

有关此参数的值的详细信息,请参阅 AuthenticationMechanism 枚举

注意

在凭据安全支持提供程序 (CredSSP) 身份验证中,用户凭据传递到远程计算机中以进行验证,这种验证用于要求对多个资源(例如访问远程网络共享)进行验证的命令。 此机制增加了远程操作的安全风险。 如果远程计算机的安全受到威胁,则传递给该计算机的凭据可用于控制网络会话。 有关详细信息,请参阅 凭据安全支持提供程序

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

指定有权连接到断开连接的会话的用户帐户的数字公钥证书 (X509)。 输入证书的证书指纹。

在基于客户端证书的身份验证中使用证书。 它们只能映射到本地用户帐户,而不适用于域帐户。

若要获取证书指纹,请在 Get-Item PowerShell Cert: 驱动器中使用 或 Get-ChildItem 命令。

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

-ComputerName

指定运行该命令的计算机。 默认为本地计算机。

使用 ComputerName 参数时,PowerShell 会创建一个临时连接,该连接仅用于运行指定的命令,然后关闭。 如果需要持久连接,请使用 Session 参数。

在一个逗号分隔列表中键入一台或多台计算机的 NETBIOS 名称、IP 地址或完全限定的域名。 若要指定本地计算机,请键入计算机名称、localhost 或点 (.) 。

若要使用 ComputerName 值中的 IP 地址,命令必须包含 Credential 参数。 必须为 HTTPS 传输配置计算机,或者远程计算机的 IP 地址必须包含在本地计算机的 WinRM TrustedHosts 列表中。 有关将计算机名称添加到 TrustedHosts 列表的说明,请参阅 如何将计算机添加到受信任的主机列表

在 Windows Vista 和更高版本的 Windows 操作系统上,若要在 ComputerName 值中包含本地计算机,必须使用 “以管理员身份运行” 选项运行 PowerShell。

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

-ConfigurationName

指定用于新 PSSession 的会话配置。

输入会话配置的配置名称或完全限定的资源 URI。 如果仅指定配置名称,则会在前面添加以下架构 URI: https://schemas.microsoft.com/PowerShell

与 SSH 一起使用时,此参数指定要在目标上使用的子系统,如 中 sshd_config定义的那样。 SSH 的默认值为 powershell 子系统。

会话的会话配置位于远程计算机上。 如果远程计算机上不存在指定的会话配置,则命令将失败。

默认值是 $PSSessionConfigurationName 本地计算机上首选项变量的值。 如果未设置此首选项变量,则默认值为 Microsoft.PowerShell。 有关详细信息,请参阅 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

指定定义会话的连接终结点的统一资源标识符 (URI)。 URI 必须完全限定。

此字符串的格式如下:

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

默认值如下:

https://localhost:5985/WSMAN

如果未指定连接 URI,则可以使用 UseSSLPort 参数指定连接 URI 值。

URI 的 Transport 段的有效值为 HTTP 和 HTTPS。 如果使用传输段指定连接 URI,但未指定端口,则会使用标准端口创建会话:80 用于 HTTP,443 用于 HTTPS。 若要使用默认端口进行 PowerShell 远程处理,请为 HTTP 指定端口 5985,为 HTTPS 指定端口 5986。

如果目标计算机将连接重定向到其他 URI,PowerShell 将阻止重定向,除非你在命令中使用 AllowRedirection 参数。

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

-ContainerId

指定容器 ID 的数组。

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

-Credential

指定有权执行此操作的用户帐户。 默认为当前用户。

键入用户名,例如 User01Domain01\User01,或输入 cmdlet Get-Credential 生成的 PSCredential 对象。 如果键入用户名,系统会提示输入密码。

凭据存储在 PSCredential 对象中,密码存储为 SecureString

注意

有关 SecureString 数据保护的详细信息,请参阅 SecureString 的安全性如何?

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

-EnableNetworkAccess

指示此 cmdlet 将交互式安全令牌添加到环回会话。 通过交互式令牌,你可以在环回会话中运行用于获取其他计算机中的数据的命令。 例如,你可以在该会话中运行用于将 XML 文件从远程计算机复制到本地计算机的命令。

环回会话是在同一计算机上开始并终止的 PSSession。 若要创建环回会话,请省略 ComputerName 参数或将其值设置为 dot (.) 、localhost 或本地计算机的名称。

默认情况下,环回会话是使用网络令牌创建的,该令牌可能无法提供足够的权限来向远程计算机进行身份验证。

EnableNetworkAccess 参数仅在环回会话中有效。 如果在远程计算机上创建会话时使用 EnableNetworkAccess ,则命令会成功,但参数将被忽略。

可以使用 Authentication 参数的 CredSSP 值在环回会话中允许远程访问,该参数将会话凭据委托给其他计算机。

为了防止计算机受到恶意访问,只能从创建会话的计算机重新连接具有交互式令牌的断开连接的环回会话(即使用 EnableNetworkAccess 创建的会话)。 断开连接的使用 CredSSP 身份验证的会话可通过其他计算机重新连接。 有关详细信息,请参阅 Disconnect-PSSession

此参数是在 PowerShell 3.0 中引入的。

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

-FilePath

指定此 cmdlet 在一台或多台远程计算机上运行的本地脚本。 输入脚本的路径和文件名,或通过管道将脚本路径传递给 Invoke-Command。 脚本必须存在于本地计算机或本地计算机可以访问的目录中。 使用 ArgumentList 指定脚本中的参数值。

使用此参数时,PowerShell 会将指定脚本文件的内容转换为脚本块,将脚本块传输到远程计算机,并在远程计算机上运行它。

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

-HideComputerName

指示此 cmdlet 从输出显示中省略每个对象的计算机名称。 默认情况下,生成该对象的计算机名称会出现在显示内容中。

此参数仅影响输出显示。 它不会更改 对象。

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

-HostName

为安全外壳 (基于 SSH) 的连接指定计算机名称数组。 这类似于 ComputerName 参数,只不过与远程计算机的连接是使用 SSH 而不是 Windows WinRM 建立的。

此参数是在 PowerShell 6.0 中引入的。

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

-InDisconnectedSession

指示此 cmdlet 在断开连接的会话中运行命令或脚本。

使用 InDisconnectedSession 参数时, Invoke-Command 在每台远程计算机上创建一个持久会话,启动 ScriptBlockFilePath 参数指定的命令,然后断开与会话的连接。 命令继续在断开连接的会话中运行。 InDisconnectedSession 使你无需保持与远程会话的连接即可运行命令。 而且,由于会话在返回任何结果之前已断开连接, 因此 InDisconnectedSession 确保所有命令结果都返回到重新连接的会话,而不是在会话之间拆分。

不能将 InDisconnectedSessionSession 参数或 AsJob 参数一起使用。

使用 InDisconnectedSession 的命令返回表示断开连接的会话的 PSSession 对象。 它们不会返回命令输出。 若要连接到断开连接的会话,请使用 Connect-PSSessionReceive-PSSession cmdlet。 若要获取会话中运行的命令的结果,请使用 Receive-PSSession cmdlet。 若要运行在断开连接的会话中生成输出的命令,请将 OutputBufferingMode 会话选项的值设置为 Drop。 如果打算连接到断开连接的会话,请在会话中设置空闲超时,以便在删除会话之前提供足够的连接时间。

可以在 SessionOption 参数或首选项变量中 $PSSessionOption 设置输出缓冲模式和空闲超时。 有关会话选项的详细信息,请参阅 New-PSSessionOptionabout_Preference_Variables

有关断开连接会话的功能的详细信息,请参阅 about_Remote_Disconnected_Sessions

此参数是在 PowerShell 3.0 中引入的。

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

-InputObject

指定命令的输入。 输入一个包含对象的变量,或键入可获取对象的命令或表达式。

使用 InputObject 参数时,使用 $InputScriptBlock 参数值中的自动变量来表示输入对象。

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

-JobName

为后台作业指定友好名称。 默认情况下,作业命名 Job<n>为 ,其中 <n> 是序号。

如果在命令中使用 JobName 参数,该命令将作为作业运行,并 Invoke-Command 返回作业对象,即使命令中不包含 AsJob 也是如此。

有关 PowerShell 后台作业的详细信息,请参阅 about_Jobs

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

-KeyFilePath

指定安全外壳 (SSH) 用于对远程计算机上的用户进行身份验证的密钥文件路径。

SSH 允许通过私钥和公钥执行用户身份验证,作为基本密码身份验证的替代方法。 如果为远程计算机配置了密钥身份验证,则此参数可用于提供标识用户的密钥。

此参数是在 PowerShell 6.0 中引入的。

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

-NoNewScope

指示此 cmdlet 在当前范围内运行指定的命令。 默认情况下, Invoke-Command 在它们自己的范围内运行命令。

此参数仅在当前会话中运行的命令(即同时省略 ComputerNameSession 参数的命令)中有效。

此参数是在 PowerShell 3.0 中引入的。

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

-Port

指定远程计算机上用于此命令的网络端口。 若要连接到一台远程计算机,则必须在该连接所用的端口上侦听远程计算机。 对于 HTTP) ,默认端口为 5985 (WinRM 端口,对于 HTTPS) ,默认端口为 5986 (WinRM 端口。

使用备用端口之前,请在远程计算机上配置 WinRM 侦听器,以便侦听该端口。 若要配置侦听器,请在 PowerShell 提示符处键入以下两个命令:

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

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

除非必须,否则不要使用 Port 参数。 在命令中设置的端口适用于运行该命令的所有计算机或会话。 备用端口设置可能会阻止在所有计算机上运行该命令。

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

-RemoteDebug

用于在远程 PowerShell 会话中的调试模式下运行调用的命令。

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

-RunAsAdministrator

指示此 cmdlet 以管理员身份调用命令。

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

-ScriptBlock

指定要运行的命令。 将命令括在大括号中 { } 以创建脚本块。 此参数是必需的。

默认情况下,将在远程计算机上评估命令中的所有变量。 若要在命令中包含局部变量,请使用 ArgumentList

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

-Session

指定此 cmdlet 在其中运行命令的会话数组。 输入包含 PSSession 对象的变量或用于创建或获取 PSSession 对象的命令,如 New-PSSessionGet-PSSession 命令。

创建 PSSession 时,PowerShell 会与远程计算机建立持久连接。 使用 PSSession 运行一系列共享数据的相关命令。 若要运行单个命令或一系列不相关的命令,请使用 ComputerName 参数。 有关详细信息,请参阅 about_PSSessions

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

-SessionName

为断开连接的会话指定一个友好名称。 可以使用 名称在后续命令(如命令) Get-PSSession 中引用会话。 此参数只有在与 InDisconnectedSession 参数一起使用时才有效。

此参数是在 PowerShell 3.0 中引入的。

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

-SessionOption

为该会话指定高级选项。 输入 SessionOption 对象,例如使用 New-PSSessionOption cmdlet 创建的一个对象,或一个哈希表,其中键是会话选项名称,值是会话选项值。

选项的默认值由首选项变量的值 $PSSessionOption (如果已设置)确定。 否则,通过在会话配置中设置的选项创建默认值。

会话选项值优先于首选项变量和会话配置中 $PSSessionOption 设置的会话的默认值。 但是,它们不优先于会话配置中设置的最大值、配额或限制。

有关包含默认值的会话选项的说明,请参阅 New-PSSessionOption。 有关首选项变量的信息 $PSSessionOption ,请参阅 about_Preference_Variables。 有关会话配置的详细信息,请参阅 about_Session_Configurations

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

-SSHConnection

此参数采用哈希表数组,其中每个哈希表包含建立安全外壳 (SSH) 连接所需的一个或多个连接参数。 SSHConnection 参数可用于创建多个会话,其中每个会话需要不同的连接信息。

哈希表具有以下成员:

  • ComputerName (或 HostName)
  • 端口
  • UserName
  • KeyFilePath (或 IdentityFilePath)

ComputerName (或 HostName) 是唯一需要的键值对。

此参数是在 PowerShell 6.0 中引入的。

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

-SSHTransport

指示使用安全外壳 (SSH) 建立远程连接。

默认情况下,PowerShell 使用 Windows WinRM 连接到远程计算机。 此开关强制 PowerShell 使用 HostName 参数建立基于 SSH 的远程连接。

此参数是在 PowerShell 6.0 中引入的。

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

-Subsystem

指定用于新 PSSession 的 SSH 子系统。

这指定在目标上使用的子系统,如sshd_config中定义。 子系统使用预定义参数启动特定版本的 PowerShell。 如果远程计算机上不存在指定的子系统,则命令将失败。

如果未使用此参数,则默认值为“powershell”子系统。

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

-ThrottleLimit

指定为运行此命令可建立的并发连接的最大数目。 如果省略此参数或输入 0 值,则使用默认值 32。

节流限制仅适用于当前命令,而不适用于会话或计算机。

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

-UserName

指定用于在远程计算机上运行命令的帐户的用户名。 用户身份验证方法取决于安全外壳 (SSH) 在远程计算机上配置的方式。

如果为基本密码身份验证配置了 SSH,则系统会提示你输入用户密码。

如果为基于密钥的用户身份验证配置了 SSH,则可以通过 KeyFilePath 参数提供密钥文件路径,并且不会发生密码提示。 如果客户端用户密钥文件位于 SSH 已知位置,则基于密钥的身份验证不需要 KeyFilePath 参数,并且用户身份验证会根据用户名自动进行。 有关详细信息,请参阅平台有关基于密钥的用户身份验证的 SSH 文档。

这不是必需的参数。 如果未指定 UserName 参数,则当前登录的用户名用于连接。

此参数是在 PowerShell 6.0 中引入的。

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

-UseSSL

指示此 cmdlet 使用安全套接字层 (SSL) 协议来建立与远程计算机的连接。 默认情况下,不使用 SSL。

WS-Management 加密通过网络传输的所有 PowerShell 内容。 UseSSL 参数是一种额外的保护,用于通过 HTTPS(而不是 HTTP)发送数据。

如果使用此参数,但 SSL 在用于命令的端口上不可用,则命令将失败。

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

-VMId

指定虚拟机 ID 的数组。

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

-VMName

指定一个虚拟机的名称数组。

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

输入

ScriptBlock

可以通过管道将脚本块中的命令传递给 Invoke-Command。 使用 $Input 自动变量表示命令中的输入对象。

输出

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

如果使用 AsJob 参数,则此 cmdlet 将返回作业对象。 如果指定 InDisconnectedSession 参数, Invoke-Command 则返回 PSSession 对象。 否则,它将返回调用的命令的输出,即 ScriptBlock 参数的值。

备注

在 Windows Vista 和更高版本的 Windows 操作系统上,若要使用 的 Invoke-CommandComputerName 参数在本地计算机上运行命令,必须使用“以管理员身份运行”选项运行 PowerShell。

在多台计算机上运行命令时,PowerShell 会按照它们在列表中出现的顺序连接到计算机。 但是,命令输出的显示顺序与从远程计算机接收的顺序可能不同。

命令结果中包含运行命令 Invoke-Command 导致的错误。 在本地命令中可能是终止错误的错误在远程命令中将视作非终止错误。 此策略可确保一台计算机上的终止错误不会关闭运行该命令的所有计算机上的命令。 即使在一台计算机上运行远程命令,也使用这种做法。

如果远程计算机不在本地计算机信任的域中,则计算机可能无法对用户的凭据进行身份验证。 若要将远程计算机添加到 WS-Management 中的受信任主机列表,请在 提供程序中使用 WSMAN 以下命令,其中 <Remote-Computer-Name> 是远程计算机的名称:

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

使用 InDisconnectedSession 参数断开 PSSession 的连接时,会话状态为“已断开连接”,可用性为“无”。 State 属性的值是相对于当前会话的。 如果值为 Disconnected ,则表示 PSSession 未连接到当前会话。 但是,这并不意味着 PSSession 与所有会话断开连接。 它可能连接到另一个会话。 若要确定是否可以连接或重新连接到该会话,请使用 Availability 属性。

AvailabilityNone 值指示可连接到 PSSession。 如果值为 Busy ,则表示无法连接到 PSSession ,因为它已连接到另一个会话。 有关会话的 State 属性值的详细信息,请参阅 RunspaceState。 有关 会话可用性属性 的值的详细信息,请参阅 RunspaceAvailability

从 PowerShell 6.0 开始,包括 HostNameSSHConnection 参数。 添加它们以提供基于安全外壳 (SSH) 的 PowerShell 远程处理。 多个平台支持 PowerShell 和 SSH, (Windows、Linux、macOS) ,PowerShell 远程处理通过安装和配置 PowerShell 和 SSH 的这些平台工作。 这与之前的仅基于 WinRM 的 Windows 远程处理是分开的,许多 WinRM 特定功能和限制不适用。 例如,目前不支持基于 WinRM 的配额、会话选项、自定义终结点配置和断开连接/重新连接功能。 有关如何设置 PowerShell SSH 远程处理的详细信息,请参阅 通过 SSH 进行 PowerShell 远程处理