Invoke-Command

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

语法

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

说明

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

若要在远程计算机上运行单个命令,请使用 ComputerName 参数。 若要运行共享数据的一系列相关命令,请使用 New-PSSession cmdlet 在远程计算机上创建 PSSession (持久连接),然后使用 Invoke-Command会话参数在 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:在服务器上运行脚本

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

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 参数指定远程计算机的名称。 凭据参数用于在 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 }

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

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

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

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

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

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-Command ComputerName 参数在 Server02 远程计算机上运行命令。 第一个命令使用 Get-Process cmdlet 获取远程计算机上的 PowerShell 进程,并将其保存在 $p 变量中。 第二个命令获取 PowerShell 进程的 VirtualMemorySize 属性的值。

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

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

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

示例 5:使用存储在变量中的脚本块调用命令

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

$command = {
    Get-WinEvent -LogName PowerShellCore/Operational |
      Where-Object -FilterScript { $_.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/Operational 事件日志。

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

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

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

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

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

这些命令一次运行一个。 命令完成后,所有计算机的命令输出将保存在 $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

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

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

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

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

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

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

示例 10:隐藏计算机名称

此示例显示使用 Invoke-CommandHideComputerName 参数的效果。 HideComputerName 不会更改此 cmdlet 返回的对象。 它仅更改显示。 仍可以使用格式 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 -HideComputerName -ScriptBlock {
    Get-Process PowerShell
}

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

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

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

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

有关 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 使用定义两个变量 $param1$param2ScriptBlock 参数。 Get-ChildItem 使用命名参数名称包含与变量名称。 ArgumentList 将值传递给变量。

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

$args 自动变量和 ArgumentList 参数用于将数组值传递给脚本块中的参数位置。 此示例显示 .txt 文件的服务器的目录内容。 Get-ChildItem路径参数的位置为 0,筛选器参数的位置为 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-ChildItem 参数位置。

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

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

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

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

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

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

$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 将 Windows Live ID 凭据存储在 $LiveCred 变量中。 PowerShell 提示用户输入 Windows Live ID 凭据。

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

示例 15:使用会话选项

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

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

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

注意

禁用这些检查有助于进行故障排除,但显然不安全。

Invoke-Command cmdlet 远程运行 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

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

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

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

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

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

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

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

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

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

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

$parameters 变量包含连接到网络共享的参数值。 Invoke-Command cmdlet 在 $s 中的会话中运行 Get-Item 命令。 此命令从 \\Net03\Scripts 网络共享获取脚本。 该命令使用身份验证参数,其值为 CredSSP,并使用值为 Domain01\Admin01凭据参数。

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

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

$parameters = @{
  ComputerName          = (Get-Content -Path C:\Test\Servers.txt)
  InDisconnectedSession = $true
  FilePath              = '\\Scripts\Public\ConfigInventory.ps1'
  SessionOption         = @{
      OutputBufferingMode = 'Drop'
      IdleTimeout         = [timespan]::FromHours(12)
  }
}
Invoke-Command @parameters

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

SessionOption 的值是哈希表。 OutputBufferingMode 的值设置为 DropIdleTimeout 的值设置为 12 小时。

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

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

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

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

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

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

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

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

示例 22:使用 SSH 选项连接到远程 SSH 会话

此示例演示如何使用 SSH 选项在基于 Linux 的远程计算机上运行脚本文件。 选项参数采用值的哈希表,这些值作为选项传递到与远程系统建立连接的基础 ssh 命令。

$options = @{
    Port=22
    User = 'UserB'
    Host = 'LinuxServer5'
}
$results = Invoke-Command -FilePath c:\Scripts\CollectEvents.ps1 -KeyFilePath '/Users/UserB/id_rsa' -Options $options

参数

-AllowRedirection

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

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

也可以通过更改 MaximumConnectionRedirectionCount 会话选项值,限制重定向连接的次数。 使用 New-PSSessionOption cmdlet 的 MaximumRedirection 参数或设置 $PSSessionOption 首选项变量的 MaximumConnectionRedirectionCount 属性。 默认值为 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

提供 scriptblock 的参数值。 脚本块中的参数通过提供给 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 操作系统中可用。

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

  • 默认值
  • 基本
  • 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)。 输入证书的证书指纹。

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

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

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

-ComputerName

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

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

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

若要在 ComputerName 的值中使用 IP 地址,该命令必须包含凭据参数。 必须为 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:http://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

-ConnectingTimeout

指定初始 SSH 连接完成所允许的时间(以毫秒为单位)。 如果连接未在指定时间内完成,则会返回错误。

此参数是在 PowerShell 7.2 中引入的

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

-ConnectionUri

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

此字符串的格式如下:

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

默认值如下:

http://localhost:5985/WSMAN

如果未指定连接 URI,可以使用 UseSSL端口参数指定连接 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:http://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;或输入 Get-Credential cmdlet 生成的 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 参数或将其值设置为点(.)、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 确保所有命令结果都返回到重新连接的会话,而不是在会话之间拆分。

不能将 InDisconnectedSession会话参数或 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 参数时,使用 ScriptBlock 参数的值中的 $Input 自动变量来表示输入对象。

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 在其自己的范围内运行命令。

此参数仅在当前会话中运行的命令有效,即省略 ComputerName会话参数的命令。

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

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

-Options

指定连接到基于 SSH 的远程会话时使用的 SSH 选项的哈希表。 可能的选项是基于 Unix 版本的 ssh 命令支持的任何值。

由参数显式传递的任何值都优先于在 Options 哈希表中传递的值。 例如,使用端口参数会覆盖在选项哈希表中传递的任何 Port 键值对。

此参数已在 PowerShell 7.3 中添加。

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

-Port

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

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

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

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

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

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

指定要运行的命令。 将命令括在大括号({ })中以创建脚本块。 使用 Invoke-Command 远程运行命令时,将在远程计算机上计算命令中的任何变量。

注意

脚本块的参数只能按位置从 ArgumentList 传入。 切换参数不能按位置传递。 如果需要类似于 SwitchParameter 类型的参数,请改用布尔类型。

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

-Session

指定运行此命令的会话数组。 输入一个变量,其中包含 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 创建的对象),或输入哈希表,其中的键是会话选项名称,而值是会话选项值。

注意

如果为 SessionOption 指定哈希表,PowerShell 会将哈希表转换为 System.Management.Autiomation.Remoting.PSSessionOption 对象。 哈希表中指定的键的值将转换为对象的匹配属性。 这与调用 New-PSSessionOption 的行为不同。 例如,System.TimeSpan 超时属性的值,如 IdleTimeout,将整数值转换为刻度而不是毫秒。 有关 PSSessionOption 对象及其属性的详细信息,请参阅 PSSessionOption

这些选项的默认值由 $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:False
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

如果使用 AsJob 参数,此 cmdlet 将返回作业对象。

PSSession

如果使用 InDisconnectedSession 参数,此 cmdlet 将返回 PSSession 对象。

Object

默认情况下,此 cmdlet 返回调用的命令的输出,这是 ScriptBlock 参数的值。

备注

PowerShell 包含以下 Invoke-Command 别名:

  • 所有平台:
    • icm

在 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 时,会话状态为断开连接,可用性为状态属性的值相对于当前会话。 断开连接的值表示 PSSession 未连接到当前会话。 但是,这并不意味着 PSSession 已与所有会话断开连接。 它可能连接到另一个会话。 若要确定是否可以连接或重新连接到该会话,请使用 Disconnected 属性。

AvailabilityNone 值指示可连接会话。 忙碌值表示无法连接到 PSSession,因为它已连接到另一个会话。 有关会话状态属性的值的详细信息,请参阅 RunspaceState。 有关会话状态属性的值的详细信息,请参阅 RunspaceState

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

ssh 可执行文件按以下顺序从以下源获取配置数据:

  1. 命令行选项
  2. 用户的配置文件 (~/.ssh/config)
  3. 系统范围的配置文件 (/etc/ssh/ssh_config)

以下 cmdlet 参数映射到 ssh 参数和选项:

Cmdlet 参数 ssh 参数 等效 ssh -o 选项
-KeyFilePath -i <KeyFilePath> -o IdentityFile=<KeyFilePath>
-UserName -l <UserName> -o User=<UserName>
-Port -p <Port> -o Port=<Port>
-ComputerName -Subsystem -s <ComputerName> <Subsystem> -o Host=<ComputerName>

由参数显式传递的任何值都优先于在 Options 哈希表中传递的值。 有关 ssh_config 文件的详细信息,请参阅 ssh_config(5)