Invoke-Command
在本地和远程计算机上运行命令。
语法
Invoke-Command
[-ScriptBlock] <scriptblock>
[-NoNewScope]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-Session] <PSSession[]>]
[-ScriptBlock] <scriptblock>
[-ThrottleLimit <int>]
[-AsJob]
[-HideComputerName]
[-JobName <string>]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-Session] <PSSession[]>]
[-FilePath] <string>
[-ThrottleLimit <int>]
[-AsJob]
[-HideComputerName]
[-JobName <string>]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-ComputerName] <string[]>]
[-ScriptBlock] <scriptblock>
[-Credential <pscredential>]
[-Port <int>]
[-UseSSL]
[-ConfigurationName <string>]
[-ApplicationName <string>]
[-ThrottleLimit <int>]
[-AsJob]
[-InDisconnectedSession]
[-SessionName <string[]>]
[-HideComputerName]
[-JobName <string>]
[-SessionOption <PSSessionOption>]
[-Authentication <AuthenticationMechanism>]
[-EnableNetworkAccess]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[-CertificateThumbprint <string>]
[<CommonParameters>]
Invoke-Command
[[-ComputerName] <string[]>]
[-FilePath] <string>
[-Credential <pscredential>]
[-Port <int>]
[-UseSSL]
[-ConfigurationName <string>]
[-ApplicationName <string>]
[-ThrottleLimit <int>]
[-AsJob]
[-InDisconnectedSession]
[-SessionName <string[]>]
[-HideComputerName]
[-JobName <string>]
[-SessionOption <PSSessionOption>]
[-Authentication <AuthenticationMechanism>]
[-EnableNetworkAccess]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-ConnectionUri] <uri[]>]
[-ScriptBlock] <scriptblock>
[-Credential <pscredential>]
[-ConfigurationName <string>]
[-ThrottleLimit <int>]
[-AsJob]
[-InDisconnectedSession]
[-HideComputerName]
[-JobName <string>]
[-AllowRedirection]
[-SessionOption <PSSessionOption>]
[-Authentication <AuthenticationMechanism>]
[-EnableNetworkAccess]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[-CertificateThumbprint <string>]
[<CommonParameters>]
Invoke-Command
[[-ConnectionUri] <uri[]>]
[-FilePath] <string>
[-Credential <pscredential>]
[-ConfigurationName <string>]
[-ThrottleLimit <int>]
[-AsJob]
[-InDisconnectedSession]
[-HideComputerName]
[-JobName <string>]
[-AllowRedirection]
[-SessionOption <PSSessionOption>]
[-Authentication <AuthenticationMechanism>]
[-EnableNetworkAccess]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-VMId] <guid[]>
[-ScriptBlock] <scriptblock>
-Credential <pscredential>
[-ConfigurationName <string>]
[-ThrottleLimit <int>]
[-AsJob]
[-HideComputerName]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-ScriptBlock] <scriptblock>
-Credential <pscredential>
-VMName <string[]>
[-ConfigurationName <string>]
[-ThrottleLimit <int>]
[-AsJob]
[-HideComputerName]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-VMId] <guid[]>
[-FilePath] <string>
-Credential <pscredential>
[-ConfigurationName <string>]
[-ThrottleLimit <int>]
[-AsJob]
[-HideComputerName]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-FilePath] <string>
-Credential <pscredential>
-VMName <string[]>
[-ConfigurationName <string>]
[-ThrottleLimit <int>]
[-AsJob]
[-HideComputerName]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-ScriptBlock] <scriptblock>
-HostName <string[]>
[-Port <int>]
[-AsJob]
[-HideComputerName]
[-JobName <string>]
[-UserName <string>]
[-KeyFilePath <string>]
[-Subsystem <string>]
[-ConnectingTimeout <int>]
[-SSHTransport]
[-Options <hashtable>]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-ScriptBlock] <scriptblock>
-ContainerId <string[]>
[-ConfigurationName <string>]
[-ThrottleLimit <int>]
[-AsJob]
[-HideComputerName]
[-JobName <string>]
[-RunAsAdministrator]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-FilePath] <string>
-ContainerId <string[]>
[-ConfigurationName <string>]
[-ThrottleLimit <int>]
[-AsJob]
[-HideComputerName]
[-JobName <string>]
[-RunAsAdministrator]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-ScriptBlock] <scriptblock>
-SSHConnection <hashtable[]>
[-AsJob]
[-HideComputerName]
[-JobName <string>]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
-FilePath <string>
-HostName <string[]>
[-AsJob]
[-HideComputerName]
[-UserName <string>]
[-KeyFilePath <string>]
[-Subsystem <string>]
[-ConnectingTimeout <int>]
[-SSHTransport]
[-Options <hashtable>]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
-FilePath <string>
-SSHConnection <hashtable[]>
[-AsJob]
[-HideComputerName]
[-RemoteDebug]
[-InputObject <psobject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
说明
cmdlet Invoke-Command
在本地或远程计算机上运行命令,并返回命令的所有输出,包括错误。 使用单个 Invoke-Command
命令,可以在多台计算机上运行命令。
若要在远程计算机上运行单个命令,请使用 ComputerName 参数。 若要运行一系列共享数据的相关命令,请使用 New-PSSession
cmdlet 创建 PSSession (远程计算机上的持久连接) ,然后使用 的 Invoke-Command
Session 参数在 PSSession 中运行命令。 若要在断开连接的会话中运行命令,请使用 InDisconnectedSession 参数。 若要在后台作业中运行命令,请使用 AsJob 参数。
还可以在本地计算机上将 Invoke-Command
运行脚本块用作命令。 PowerShell 立即在当前范围的子范围内运行脚本块。
在使用 Invoke-Command
在远程计算机上运行命令之前,请阅读 about_Remote。
从 PowerShell 6.0 开始,可以使用安全外壳 (SSH) 建立与远程计算机上的连接并调用命令。 必须在本地计算机上安装 SSH,并且必须使用 PowerShell SSH 终结点配置远程计算机。 基于 SSH 的 PowerShell 远程会话的优势在于,它可以跨多个平台工作, (Windows、Linux、macOS) 。 对于基于 SSH 的会话,请使用 HostName 或 SSHConnection 参数来指定远程计算机和相关连接信息。 有关如何设置 PowerShell SSH 远程处理的详细信息,请参阅 通过 SSH 进行 PowerShell 远程处理。
一些代码示例使用 splatting 来减小行长。 有关详细信息,请参阅 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 的安全上下文中运行命令。 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-Command
Get-Culture
在 Server02 上运行命令。 Session 参数指定变量中保存的$s
会话。
作为响应,PowerShell 在 Server02 计算机上的会话中运行 命令。
示例 4:使用会话运行一系列共享数据的命令
此示例比较使用 的 ComputerName 和 会话 参数 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-Command
ComputerName 参数在 Server02 远程计算机上运行命令。 第一个命令使用 Get-Process
cmdlet 获取远程计算机上的 PowerShell 进程并将其保存在 变量中 $p
。 第二个命令将获取 PowerShell 进程的 VirtualMemorySize 属性的值。
使用 ComputerName 参数时,PowerShell 会创建一个新会话来运行命令。
命令完成后,会话将关闭。 变量 $p
是在一个连接中创建的,但它不存在于为第二个命令创建的连接中。
此问题可通过在远程计算机上创建持久会话,然后在同一会话中运行这两个命令来解决。
cmdlet New-PSSession
在计算机 Server02 上创建持久会话,并将会话保存在 变量中 $s
。 后面的 Invoke-Command
行使用 Session 参数在同一会话中运行这两个命令。 由于两个命令在同一会话中运行,值 $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/操作事件日志。
示例 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_Variables 和 about_Scopes。
$Log = 'PowerShellCore/Operational'
Invoke-Command -ComputerName Server01 -ScriptBlock {
Get-WinEvent -LogName $Using:Log -MaxEvents 10
}
变量 $Log
存储事件日志的名称 PowerShellCore/Operational。 cmdlet Invoke-Command
Get-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 -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
前两个Get-Process
命令使用 Invoke-Command
为 PowerShell 进程运行命令。 第一个命令的输出包括 PsComputerName 属性,此属性包含运行该命令的计算机的名称。 使用 HideComputerName 的第二个命令的输出不包括 PsComputerName 列。
示例 11:在脚本块中使用 Param 关键字 (keyword)
关键字 (keyword) Param
和 ArgumentList 参数用于将变量值传递给脚本块中的命名参数。 此示例显示以字母 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
即 $param2
。 Get-ChildItem
使用命名参数 Name 和 Include 以及变量名称。 ArgumentList 将值传递给变量。
示例 12:在脚本块中使用$args自动变量
自动 $args
变量和 ArgumentList 参数用于将数组值传递到脚本块中的参数位置。 此示例显示服务器的文件目录内容 .txt
。 Get-ChildItem
Path 参数的位置为 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-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 的参数。 cmdlet Invoke-Command
使用 Microsoft.Exchange 会话配置运行Set-Mailbox
命令。 ConnectionURI 参数指定 Exchange 服务器终结点的 URL。 Credential 参数指定变量中存储的$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
cmdlet New-PSSessionOption
会创建一个会话选项对象,该对象导致远程端在评估传入 HTTPS 连接时不验证证书颁发机构、规范名称和吊销Lists。 SessionOption 对象保存在 变量中$so
。
注意
禁用这些检查便于进行故障排除,但显然不安全。
cmdlet Invoke-Command
远程运行 Get-HotFix
命令。 为 SessionOption 参数提供 $so
变量。
示例 16:在远程命令中管理 URI 重定向
此示例演示如何使用 AllowRedirection 和 SessionOption 参数来管理远程命令中的 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
创建保存在 变量中的 $max
PSSessionOption 对象。 该命令使用 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) 委派。 若要运行此示例中的命令,您必须是本地计算机和远程计算机上的 管理员 组的成员。
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
cmdlet Enable-WSManCredSSP
允许将 CredSSP 从 Server01 本地计算机委派到 Server02 远程计算机。 Role 参数指定客户端以在本地计算机上配置 CredSSP 客户端设置。
New-PSSession
为 Server02 创建 PSSession 对象,并将对象存储在 变量中 $s
。
cmdlet Invoke-Command
使用 $s
变量连接到远程计算机 Server02。 ScriptBlock 参数在远程计算机上运行Enable-WSManCredSSP
。 Role 参数指定服务器以在远程计算机上配置 CredSSP 服务器设置。
变量 $parameters
包含用于连接到网络共享的参数值。 cmdlet Invoke-Command
在 中的会话中$s
运行Get-Item
命令。 此命令从网络共享获取 \\Net03\Scripts
脚本。 命令使用值为 CredSSP 的 Authentication 参数和值为 Domain01\Admin01 的 Credential 参数。
示例 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 值设置为 Drop
,IdleTimeout 值设置为 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 的远程计算机上运行脚本文件。 Options 参数采用值哈希表,这些值作为选项传递给与远程系统建立连接的基础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 会话选项值,限制重定向连接的次数。 使用 cmdlet 的 New-PSSessionOption
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_Jobs 和 about_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: 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 和 Port 参数指定连接 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
指定有权执行此操作的用户帐户。 默认为当前用户。
键入用户名,例如 User01 或 Domain01\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
在每台远程计算机上创建一个持久会话,启动 ScriptBlock 或 FilePath 参数指定的命令,然后断开与会话的连接。 命令继续在断开连接的会话中运行。 InDisconnectedSession 使你无需保持与远程会话的连接即可运行命令。 而且,由于会话在返回任何结果之前已断开连接, 因此 InDisconnectedSession 确保所有命令结果都返回到重新连接的会话,而不是在会话之间拆分。
不能将 InDisconnectedSession 与 Session 参数或 AsJob 参数一起使用。
使用 InDisconnectedSession 的命令返回表示断开连接的会话的 PSSession 对象。 它们不会返回命令输出。 若要连接到断开连接的会话,请使用 Connect-PSSession
或 Receive-PSSession
cmdlet。 若要获取会话中运行的命令的结果,请使用 Receive-PSSession
cmdlet。 若要运行在断开连接的会话中生成输出的命令,请将 OutputBufferingMode 会话选项的值设置为 Drop。 如果打算连接到断开连接的会话,请在会话中设置空闲超时,以便在删除会话之前提供足够的连接时间。
可以在 SessionOption 参数或首选项变量中 $PSSessionOption
设置输出缓冲模式和空闲超时。 有关会话选项的详细信息,请参阅 New-PSSessionOption
和 about_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 参数时,使用 $Input
ScriptBlock 参数值中的自动变量来表示输入对象。
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 和 Session 参数的命令)中有效。
此参数是在 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 参数会替代在 Options 哈希表中传递的任何Port
键值对。
此参数已添加到 PowerShell 7.3 中。
Type: | Hashtable |
Position: | Named |
Default value: | None |
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
指定要运行的命令。 将命令括在大括号 ({ }
) 以创建脚本块。 使用 Invoke-Command
远程运行命令时,命令中的任何变量都会在远程计算机上进行评估。
注意
scriptblock 的参数只能按位置从 ArgumentList 传入。 开关参数不能按位置传递。 如果需要一个行为类似于 SwitchParameter 类型的参数,请改用 布尔 类型。
Type: | ScriptBlock |
Aliases: | Command |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Session
指定此 cmdlet 在其中运行命令的会话数组。 输入包含 PSSession 对象的变量或用于创建或获取 PSSession 对象的命令,例如 New-PSSession
或 Get-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
的行为不同。 例如,超时属性(如 IdleTimeout)的 System.TimeSpan 值将整数值转换为刻度而不是毫秒。
有关 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 |
输入
可以将脚本块中的命令管道传递给 Invoke-Command
。 $Input
使用自动变量表示命令中的输入对象。
输出
System.Management.Automation.PSRemotingJob
如果使用 AsJob 参数,则此 cmdlet 将返回一个作业对象。
如果使用 InDisconnectedSession 参数,则此 cmdlet 将返回 PSSession 对象。
默认情况下,此 cmdlet 返回调用的命令的输出,即 ScriptBlock 参数的值。
备注
PowerShell 包含以下别名 Invoke-Command
:
- 所有平台:
icm
在 Windows Vista 及更高版本的 Windows 操作系统上,若要使用 的 Invoke-Command
ComputerName 参数在本地计算机上运行命令,必须使用“以管理员身份运行”选项运行 PowerShell。
在多台计算机上运行命令时,PowerShell 会按照它们在列表中出现的顺序连接到计算机。 但是,命令输出按从远程计算机接收的顺序显示,这可能有所不同。
命令结果中包括运行命令 Invoke-Command
导致的错误。
在本地命令中可能是终止错误的错误在远程命令中将视作非终止错误。 此策略可确保一台计算机上的终止错误不会在运行命令的所有计算机上关闭该命令。 即使在一台计算机上运行远程命令,也使用这种做法。
如果远程计算机不在本地计算机信任的域中,则计算机可能无法对用户的凭据进行身份验证。 若要将远程计算机添加到 WS-Management 中的受信任主机列表,请在提供程序中使用 WSMAN
以下命令,其中 <Remote-Computer-Name>
是远程计算机的名称:
Set-Item -Path WSMan:\Localhost\Client\TrustedHosts -Value \<Remote-Computer-Name\>
使用 InDisconnectedSession 参数断开 PSSession 的连接时,会话状态为 Disconnected,可用性为 None。 State 属性的值是相对于当前会话的。 值 Disconnected 表示 PSSession 未连接到当前会话。 但是,这并不意味着 PSSession 与所有会话断开连接。 它可能连接到另一个会话。 若要确定是否可以连接或重新连接到该会话,请使用 Availability 属性。
Availability 的 None 值指示可连接到 PSSession。 值为 Busy 表示无法连接到 PSSession ,因为它已连接到另一个会话。 有关会话的 State 属性的值的详细信息,请参阅 RunspaceState。 有关 会话的可用性属性 的值的详细信息,请参阅 RunspaceAvailability。
从 PowerShell 6.0 开始,包括 HostName 和 SSHConnection 参数。 添加它们以基于安全外壳 (SSH) 提供 PowerShell 远程处理。 多个平台支持 PowerShell 和 SSH, (Windows、Linux、macOS) ,PowerShell 远程处理通过安装和配置 PowerShell 和 SSH 的这些平台工作。 这与之前基于 WinRM 的仅限 Windows 远程处理不同,许多 WinRM 特定的功能和限制不适用。 例如,目前不支持基于 WinRM 的配额、会话选项、自定义终结点配置和断开连接/重新连接功能。 有关如何设置 PowerShell SSH 远程处理的详细信息,请参阅 通过 SSH 进行 PowerShell 远程处理。
可执行文件 ssh
按以下顺序从以下源获取配置数据:
- 命令行选项
- 用户的配置文件 (~/.ssh/config)
- 系统范围的配置文件 (/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) 。