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 的会话,请使用 HostName 或 SSHConnection 参数来指定远程计算机和相关连接信息。 有关如何设置 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-Command
的 ComputerName 和 会话参数的效果。 它显示了如何使用一个会话来运行共享相同数据的一系列命令。
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_Variables 和 about_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-Command
的 HideComputerName 参数的效果。
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
和 $param2
的 ScriptBlock 参数。 Get-ChildItem
使用命名参数名称和包含与变量名称。 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 的参数。 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 重定向
此示例演示如何使用 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
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 的值设置为 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 的远程计算机上运行脚本文件。 选项参数采用值的哈希表,这些值作为选项传递到与远程系统建立连接的基础 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。
类型: | SwitchParameter |
Position: | Named |
默认值: | False |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-ApplicationName
指定连接 URI 的应用程序名称段。 当命令中未使用 ConnectionURI 参数时,请使用此参数指定应用程序名称。
默认值为本地计算机上的 $PSSessionApplicationName
首选项变量的值。 如果未定义此首选项变量,则默认值为“WSMAN”。 该值适用于大多数使用情况。 有关详细信息,请参阅 about_Preference_Variables。
WinRM 服务使用应用程序名称来选择为连接请求提供服务的侦听器。 此参数的值应与远程计算机上的侦听器的 URLPrefix 属性值相匹配。
类型: | String |
Position: | Named |
默认值: | $PSSessionApplicationName if set on the local computer, otherwise WSMAN |
必需: | False |
接受管道输入: | True |
接受通配符: | False |
-ArgumentList
提供 scriptblock 的参数值。 脚本块中的参数通过提供给 ArgumentList 的数组值的位置传递。 这称为数组散点。 有关 ArgumentList 的行为的详细信息,请参阅 about_Splatting。
类型: | Object[] |
别名: | Args |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-AsJob
指示此 cmdlet 将命令作为后台作业运行。 使用此参数可运行需要较长时间才能完成的命令。
使用 AsJob 参数时,该命令将返回表示后台作业的对象,然后显示命令提示符。 当作业完成时,你可以继续在此会话中工作。 若要管理作业,请使用 *-Job
cmdlet。 若要获取作业结果,请使用 Receive-Job
cmdlet。
AsJob 参数类似于使用 Invoke-Command
cmdlet 远程运行 Start-Job
cmdlet。 但是,使用 AsJob,该作业在本地计算机上创建,即使作业在远程计算机上运行。 远程作业的结果会自动返回到本地计算机。
有关 PowerShell 后台作业的详细信息,请参阅 about_Jobs 和 about_Remote_Jobs。
类型: | SwitchParameter |
Position: | Named |
默认值: | False |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Authentication
指定用于对用户的凭据进行身份验证的机制。 CredSSP 身份验证仅在 Windows Vista、Windows Server 2008 和更高版本的 Windows 操作系统中可用。
此参数的可接受值如下所示:
- 默认值
- 基本
- Credssp
- 摘要
- Kerberos
- Negotiate
- NegotiateWithImplicitCredential
默认值为 Default。
有关此参数的值的详细信息,请参阅 AuthenticationMechanism 枚举。
注意
在凭据安全支持提供程序 (CredSSP) 身份验证中,用户凭据传递到远程计算机中进行验证,这种验证用于要求对多个资源进行验证的命令(例如访问远程网络共享时使用的命令)。 此机制增加了远程操作的安全风险。 如果远程计算机的安全受到威胁,则传递给该计算机的凭据可用于控制网络会话。 有关详细信息,请参阅凭据安全支持提供程序。
类型: | AuthenticationMechanism |
接受的值: | Basic, Default, Credssp, Digest, Kerberos, Negotiate, NegotiateWithImplicitCredential |
Position: | Named |
默认值: | Default |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-CertificateThumbprint
指定有权连接到断开连接的会话的用户帐户的数字公钥证书 (X509)。 输入证书的证书指纹。
在基于客户端证书的身份验证中使用证书。 证书只能映射到本地用户帐户,而不适用于域帐户。
若要获取证书指纹,请使用 PowerShell 证书:驱动器中的 Get-Item
或 Get-ChildItem
命令。
类型: | String |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-ComputerName
指定运行该命令的计算机。 默认为本地计算机。
使用 ComputerName 参数时,PowerShell 会创建一个临时连接,该连接仅用于运行指定的命令,然后关闭。 如果需要持久性连接,请使用会话参数。
在一个逗号分隔列表中键入一台或多台计算机的 NETBIOS 名称、IP 地址或完全限定的域名。 若要指定本地计算机,请键入计算机名称、localhost 或点(.
)。
若要在 ComputerName 的值中使用 IP 地址,该命令必须包含凭据参数。 必须为 HTTPS 传输配置计算机,或者远程计算机的 IP 地址必须包含在本地计算机的 WinRM TrustedHosts 列表中。 有关将计算机名称添加到 TrustedHosts 列表的说明,请参阅如何将计算机添加到受信任的主机列表。
在 Windows Vista 和更高版本的 Windows 操作系统上,若要将本地计算机包含在 ComputerName 的值中,必须使用以管理员身份运行选项运行 PowerShell。
类型: | String[] |
别名: | Cn |
Position: | 0 |
默认值: | Local computer |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-ConfigurationName
指定用于新 PSSession 的会话配置。
输入会话配置的配置名称或完全限定的资源 URI。 如果只指定配置名称,则将在其前面预置以下架构 URI:http://schemas.microsoft.com/PowerShell
。
与 SSH 一起使用时,此参数指定要在目标上使用的子系统,如 sshd_config
中定义。 SSH 的默认值为 powershell
子系统。
会话的会话配置位于远程计算机上。 如果远程计算机上不存在指定的会话配置,则该命令会失败。
默认值为本地计算机上的 $PSSessionConfigurationName
首选项变量的值。 如果未设置此首选项变量,则默认值 Microsoft.PowerShell。 有关详细信息,请参阅 about_Preference_Variables。
类型: | String |
Position: | Named |
默认值: | $PSSessionConfigurationName if set on the local computer, otherwise Microsoft.PowerShell |
必需: | False |
接受管道输入: | True |
接受通配符: | False |
-ConnectingTimeout
指定初始 SSH 连接完成所允许的时间(以毫秒为单位)。 如果连接未在指定时间内完成,则会返回错误。
此参数是在 PowerShell 7.2 中引入的
类型: | Int32 |
Position: | Named |
默认值: | Unlimited |
必需: | False |
接受管道输入: | False |
接受通配符: | 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 参数。
类型: | Uri[] |
别名: | URI, CU |
Position: | 0 |
默认值: | http://localhost:5985/WSMAN |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-ContainerId
指定容器的 ID 数组。
类型: | String[] |
Position: | Named |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | False |
-Credential
指定有权执行此操作的用户帐户。 默认为当前用户。
键入用户名,如 User01 或 Domain01\User01;或输入 Get-Credential
cmdlet 生成的 PSCredential 对象。 如果键入用户名,系统会提示输入密码。
凭据存储在 PSCredential 对象中,密码存储为 SecureString。
注意
有关 SecureString 数据保护的详细信息,请参阅 SecureString 的安全性如何?。
类型: | PSCredential |
Position: | Named |
默认值: | Current user |
必需: | False |
接受管道输入: | True |
接受通配符: | False |
-EnableNetworkAccess
指示此 cmdlet 将交互式安全令牌添加到环回会话。 通过交互式令牌,你可以在环回会话中运行用于获取其他计算机中的数据的命令。 例如,你可以在该会话中运行用于将 XML 文件从远程计算机复制到本地计算机的命令。
环回会话是在同一计算机上开始并终止的 PSSession。 若要创建环回会话,请省略 ComputerName 参数或将其值设置为点(.
)、localhost 或本地计算机的名称。
默认情况下,使用网络令牌创建环回会话,该令牌提供的权限可能不足以对远程计算机进行身份验证。
EnableNetworkAccess 参数仅在环回会话中有效。 如果在远程计算机上创建会话时使用 EnableNetworkAccess,该命令将成功,但会忽略此参数。
通过用于将会话凭据委派给其他计算机的 Authentication 参数的 CredSSP 值,可以在环回会话中进行远程访问。
若要保护计算机免受恶意访问,断开连接的具有交互式令牌(使用 EnableNetworkAccess 创建的令牌)的环回会话只能通过创建该会话的计算机重新连接。 断开连接的使用 CredSSP 身份验证的会话可通过其他计算机重新连接。 有关详细信息,请参阅 Disconnect-PSSession
。
此参数是在 PowerShell 3.0 中引入的。
类型: | SwitchParameter |
Position: | Named |
默认值: | False |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-FilePath
指定此 cmdlet 在一个或多个远程计算机上运行的本地脚本。 输入脚本的路径和文件名,或通过管道将脚本路径传递给 Invoke-Command
。 脚本必须位于本地计算机上或者本地计算机能够访问的目录中。 使用 ArgumentList 指定脚本中的参数值。
使用此参数时,PowerShell 会将指定脚本文件的内容转换为脚本块,将脚本块传输到远程计算机,然后在远程计算机上运行它。
类型: | String |
别名: | PSPath |
Position: | 1 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-HideComputerName
指示此 cmdlet 从输出显示中省略每个对象的计算机名称。 默认情况下,生成该对象的计算机名称会出现在显示内容中。
此参数仅影响输出显示。 它不会更改对象。
类型: | SwitchParameter |
别名: | HCN |
Position: | Named |
默认值: | False |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-HostName
为基于安全外壳 (SSH) 的连接指定计算机名称数组。 这与 ComputerName 参数类似,只不过与远程计算机的连接是使用 SSH 而不是 Windows WinRM 建立的。
此参数是在 PowerShell 6.0 中引入的。
类型: | String[] |
Position: | Named |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-InDisconnectedSession
指示此 cmdlet 在断开连接的会话中运行命令或脚本。
使用 InDisconnectedSession 参数时,Invoke-Command
在每个远程计算机上创建永久性会话,启动由 ScriptBlock 或 FilePath 参数指定的命令,然后断开与会话的连接。 命令将继续在断开连接的会话中运行。 InDisconnectedSession 使你能够运行命令,而无需维护与远程会话的连接。 而且,由于会话在返回任何结果之前断开连接,InDisconnectedSession 确保所有命令结果都返回到重新连接的会话,而不是在会话之间拆分。
不能将 InDisconnectedSession 与会话参数或 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 中引入的。
类型: | SwitchParameter |
别名: | Disconnected |
Position: | Named |
默认值: | False |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-InputObject
指定命令的输入。 输入一个包含对象的变量,或键入可获取对象的命令或表达式。
使用 InputObject 参数时,使用 ScriptBlock 参数的值中的 $Input
自动变量来表示输入对象。
类型: | PSObject |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | True |
接受通配符: | False |
-JobName
为后台作业指定友好名称。 默认情况下,作业命名为 Job<n>
,其中 <n>
为序号。
如果在命令中使用 JobName 参数,该命令将作为作业运行,并且 Invoke-Command
返回作业对象,即使命令中不包含 AsJob 也是如此。
有关 PowerShell 后台作业的详细信息,请参阅 about_Jobs。
类型: | String |
Position: | Named |
默认值: | Job<n> |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-KeyFilePath
指定安全外壳 (SSH) 用于对远程计算机上的用户进行身份验证的密钥文件路径。
SSH 允许通过私钥和公钥执行用户身份验证,作为基本密码身份验证的替代方案。 如果远程计算机配置为密钥身份验证,则此参数可用于提供标识用户的密钥。
此参数是在 PowerShell 6.0 中引入的。
类型: | String |
别名: | IdentityFilePath |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-NoNewScope
指示此 cmdlet 在当前范围内运行指定的命令。 默认情况下,Invoke-Command
在其自己的范围内运行命令。
此参数仅在当前会话中运行的命令有效,即省略 ComputerName 和会话参数的命令。
此参数是在 PowerShell 3.0 中引入的。
类型: | SwitchParameter |
Position: | Named |
默认值: | False |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Options
指定连接到基于 SSH 的远程会话时使用的 SSH 选项的哈希表。 可能的选项是基于 Unix 版本的 ssh 命令支持的任何值。
由参数显式传递的任何值都优先于在 Options 哈希表中传递的值。 例如,使用端口参数会覆盖在选项哈希表中传递的任何 Port
键值对。
此参数已在 PowerShell 7.3 中添加。
类型: | Hashtable |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | 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\>
除非必要,否则不要使用端口参数。 在命令中设置的端口适用于运行该命令的所有计算机或会话。 备用端口设置可能会阻止在所有计算机上运行该命令。
类型: | Int32 |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-RemoteDebug
用于在远程 PowerShell 会话中的调试模式下运行调用的命令。
类型: | SwitchParameter |
Position: | Named |
默认值: | False |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-RunAsAdministrator
指示此 cmdlet 以管理员身份调用命令。
类型: | SwitchParameter |
Position: | Named |
默认值: | False |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-ScriptBlock
指定要运行的命令。 将命令括在大括号({ }
)中以创建脚本块。 使用 Invoke-Command
远程运行命令时,将在远程计算机上计算命令中的任何变量。
注意
脚本块的参数只能按位置从 ArgumentList 传入。 切换参数不能按位置传递。 如果需要类似于 SwitchParameter 类型的参数,请改用布尔类型。
类型: | ScriptBlock |
别名: | Command |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-Session
指定运行此命令的会话数组。 输入一个变量,其中包含 PSSession 对象或创建或获取 PSSession 的命令,例如 New-PSSession
或 Get-PSSession
命令。
创建 PSSession 时,PowerShell 将建立与远程计算机的持久连接。 使用 PSSession 运行共享数据的一系列相关命令。 若要运行单个命令或一系列不相关的命令,请使用 ComputerName 参数。 有关详细信息,请参阅 about_PSSessions。
类型: | PSSession[] |
Position: | 0 |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-SessionName
为断开连接的会话指定一个友好名称。 可以使用名称来引用后续命令中的会话,例如 Get-PSSession
命令。 此参数仅在与 InDisconnectedSession 参数一起使用时才有效。
此参数是在 PowerShell 3.0 中引入的。
类型: | String[] |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | 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。
类型: | PSSessionOption |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-SSHConnection
此参数采用哈希表数组,其中每个哈希表包含建立安全外壳 (SSH) 连接所需的一个或多个连接参数。 SSHConnection 参数可用于创建多个会话,其中每个会话需要不同的连接信息。
哈希表具有以下成员:
- ComputerName (或 HostName)
- 端口
- UserName
- KeyFilePath (或 IdentityFilePath)
ComputerName (或 HostName)是唯一需要的键值对。
此参数是在 PowerShell 6.0 中引入的。
类型: | Hashtable[] |
Position: | Named |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-SSHTransport
指示使用安全外壳 (SSH) 建立远程连接。
默认情况下,PowerShell 使用 Windows WinRM 连接到远程计算机。 此开关强制 PowerShell 使用 HostName 参数建立基于 SSH 的远程连接。
此参数是在 PowerShell 6.0 中引入的。
类型: | SwitchParameter |
接受的值: | true |
Position: | Named |
默认值: | False |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Subsystem
指定用于新 PSSession 的 SSH 子系统。
这会指定要在 sshd_config 中定义的目标上使用的子系统。 该子系统使用预定义的参数启动特定版本的 PowerShell。 如果远程计算机上不存在指定的子系统,则该命令会失败。
如果未使用此参数,则默认值为 powershell
子系统。
类型: | String |
Position: | Named |
默认值: | powershell |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-ThrottleLimit
指定为运行此命令可建立的并发连接的最大数目。 如果省略此参数或输入 0 值,则使用默认值 32。
节流限制仅适用于当前命令,而不适用于会话或计算机。
类型: | Int32 |
Position: | Named |
默认值: | 32 |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-UserName
指定用于在远程计算机上运行命令的帐户的用户名。 用户身份验证方法取决于远程计算机上安全外壳 (SSH) 的配置方式。
如果 SSH 配置为基本密码身份验证,则系统会提示输入用户密码。
如果将 SSH 配置为基于密钥的用户身份验证,则可以通过 KeyFilePath 参数提供密钥文件路径,并且不会出现密码提示。 如果客户端用户密钥文件位于 SSH 已知位置,则基于密钥的身份验证不需要 KeyFilePath 参数,并且用户身份验证会自动基于用户名进行。 有关详细信息,请参阅平台的 SSH 文档,了解基于密钥的用户身份验证。
这不是必需的参数。 如果未指定 UserName 参数,则将使用当前登录用户名进行连接。
此参数是在 PowerShell 6.0 中引入的。
类型: | String |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-UseSSL
指示此 cmdlet 使用安全套接字层 (SSL) 协议来建立与远程计算机的连接。 默认情况下,不使用 SSL。
WS-Management 对通过网络传输的所有 PowerShell 内容进行加密。 UseSSL 参数是一种额外的保护措施,它通过 HTTPS 而不是 HTTP 来发送数据。
如果使用此参数,但 SSL 在用于命令的端口上不可用,该命令将失败。
类型: | SwitchParameter |
Position: | Named |
默认值: | False |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-VMId
指定虚拟机的 ID 数组。
类型: | Guid[] |
别名: | VMGuid |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | False |
-VMName
指定一个虚拟机的名称数组。
类型: | String[] |
Position: | Named |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | 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 时,会话状态为断开连接,可用性为无。 状态属性的值相对于当前会话。 断开连接的值表示 PSSession 未连接到当前会话。 但是,这并不意味着 PSSession 已与所有会话断开连接。 它可能连接到另一个会话。 若要确定是否可以连接或重新连接到该会话,请使用 Disconnected 属性。
Availability 的 None 值指示可连接会话。 忙碌值表示无法连接到 PSSession,因为它已连接到另一个会话。 有关会话状态属性的值的详细信息,请参阅 RunspaceState。 有关会话状态属性的值的详细信息,请参阅 RunspaceState。
从 PowerShell 6.0 开始,包括 HostName 和 SSHConnection 参数。 添加它们是为了提供基于安全外壳 (SSH) 的 PowerShell 远程处理。 在多个平台(Windows、Linux、macOS)和 PowerShell 远程处理中支持 PowerShell 和 SSH,这些平台支持 PowerShell 和 SSH。 这与以前的 Windows 仅基于 WinRM 的远程处理不同,许多特定于 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)。