Invoke-Command
在本地和远程计算机上运行命令。
语法
Invoke-Command
[-ScriptBlock] <ScriptBlock>
[-NoNewScope]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-Session] <PSSession[]>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-FilePath] <String>
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-Session] <PSSession[]>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-ScriptBlock] <ScriptBlock>
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-ComputerName] <String[]>]
[-Credential <PSCredential>]
[-Port <Int32>]
[-UseSSL]
[-ConfigurationName <String>]
[-ApplicationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-InDisconnectedSession]
[-SessionName <String[]>]
[-HideComputerName]
[-JobName <String>]
[-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>]
[-SSHTransport]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-Subsystem <String>]
[<CommonParameters>]
Invoke-Command
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-ScriptBlock] <ScriptBlock>
[-RunAsAdministrator]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
-ContainerId <String[]>
[<CommonParameters>]
Invoke-Command
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-FilePath] <String>
[-RunAsAdministrator]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
-ContainerId <String[]>
[<CommonParameters>]
Invoke-Command
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-ScriptBlock] <ScriptBlock>
-SSHConnection <Hashtable[]>
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-AsJob]
[-HideComputerName]
-FilePath <String>
-HostName <String[]>
[-UserName <String>]
[-KeyFilePath <String>]
[-SSHTransport]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-AsJob]
[-HideComputerName]
-FilePath <String>
-SSHConnection <Hashtable[]>
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
说明
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 开始,可以使用 Secure Shell (SSH) 建立与远程计算机上的命令建立连接和调用命令。 SSH 必须安装在本地计算机上,并且必须使用 PowerShell SSH 终结点配置远程计算机。 基于 SSH 的 PowerShell 远程会话的优点是,它可以跨多个平台 (Windows、Linux、macOS) 工作。 对于基于 SSH 的会话,请使用 HostName 或 SSHConnection 参数指定远程计算机和相关连接信息。 有关如何设置 PowerShell SSH 远程处理的详细信息,请参阅 PowerShell 远程处理 Over SSH。
一些代码示例使用喷洒来减少行长。 有关详细信息,请参阅 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}
该 New-PSSession
cmdlet 在 Server02 远程计算机上创建会话,并将其保存在变量中 $s
。 通常,仅在远程计算机上运行一系列命令时,才创建会话。
该 Invoke-Command
cmdlet 在 Get-Culture
Server02 上运行命令。 Session 参数指定保存在变量中的$s
会话。
作为响应,PowerShell 在 Server02 计算机上的会话中运行命令。
示例 4:使用会话运行共享数据的一系列命令
此示例比较了使用 ComputerName 和 Session 参数 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
前两个命令使用 ComputerName 参数 Invoke-Command
在 Server02 远程计算机上运行命令。 第一个命令使用 Get-Process
cmdlet 获取远程计算机上的 PowerShell 进程,并将其保存在变量中 $p
。 第二个命令将获取 PowerShell 进程的 VirtualMemorySize 属性的值。
使用 ComputerName 参数时,PowerShell 会创建一个新会话来运行该命令。
命令完成后,会话将关闭。 该 $p
变量是在一个连接中创建的,但在为第二个命令创建的连接中不存在该变量。
此问题是通过在远程计算机上创建持久会话来解决的,然后在同一会话中运行这两个命令。
该 New-PSSession
cmdlet 在计算机 Server02 上创建持久会话,并将会话保存在变量中 $s
。 Invoke-Command
后面的行使用 Session 参数在同一会话中运行这两个命令。 由于这两个命令在同一会话中运行,因此 $p
该值保持活动状态。
示例 5:使用存储在变量中的脚本块调用命令
此示例演示如何运行作为脚本块存储在变量中的命令。 在变量中保存脚本块时,可以将变量指定为 ScriptBlock 参数的值。
$command = { Get-WinEvent -LogName PowerShellCore/Operational |
Where-Object {$_.Message -like "*certificate*"} }
Invoke-Command -ComputerName S1, S2 -ScriptBlock $command
该 $command
变量存储 Get-WinEvent
格式化为脚本块的命令。 运行 Invoke-Command
存储在 $command
S1 和 S2 远程计算机上的命令。
示例 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 属性。
这些命令一次运行一个。 命令完成后,所有计算机的命令输出将保存在变量中 $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
范围修饰符标识远程命令中的局部变量。 默认情况下,假定所有变量均已在远程会话中定义。 作用域 Using
修饰符是在 PowerShell 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。 该 Invoke-Command
cmdlet 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 -ScriptBlock {Get-Process PowerShell} -HideComputerName
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
575 15 45100 40988 200 4.68 1392 PowerShell
777 14 35100 30988 150 3.68 67 PowerShell
前两个命令用于 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
使用定义两个变量的 ScriptBlock 参数, $param1
以及 $param2
. 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
Path 和 Filter 的参数位置。
示例 13:在文本文件中列出的所有计算机上运行脚本
此示例使用 Invoke-Command
cmdlet 在文件中列出的Servers.txt
所有计算机上运行Sample.ps1
脚本。 该命令使用 FilePath 参数来指定脚本文件。 此命令允许在远程计算机上运行脚本,即使远程计算机无法访问脚本文件也是如此。
Invoke-Command -ComputerName (Get-Content Servers.txt) -FilePath C:\Scripts\Sample.ps1 -ArgumentList Process, Service
提交命令时,文件的内容 Sample.ps1
将复制到脚本块中,脚本块在每台远程计算机上运行。 此步骤等效于使用 ScriptBlock 参数来提交脚本的内容。
示例 14:使用 URI 在远程计算机上运行命令
此示例演示如何在统一资源标识符 (URI) 标识的远程计算机上运行命令。 此特定示例在远程 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
第一行使用 cmdlet 在 Get-Credential
变量中 $LiveCred
存储 Windows Live ID 凭据。 PowerShell 提示用户输入 Windows Live ID 凭据。
该 $parameters
变量是一个哈希表,其中包含要传递给 Invoke-Command
cmdlet 的参数。 该 Invoke-Command
cmdlet 使用 Microsoft.Exchange 会话配置运行Set-Mailbox
命令。 ConnectionURI 参数指定 Exchange 服务器终结点的 URL。 Credential 参数指定存储在变量中的$LiveCred
凭据。 AuthenticationMechanism 参数指定基本身份验证的使用。 ScriptBlock 参数指定包含该命令的脚本块。
示例 15:使用会话选项
此示例演示如何创建和使用 SessionOption 参数。
$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
Invoke-Command -ComputerName server01 -UseSSL -ScriptBlock { Get-HotFix } -SessionOption $so -Credential server01\user01
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 Server上运行Get-Mailbox
命令。 AllowRedirection 参数提供将连接重定向到备用终结点的显式权限。 SessionOption 参数使用存储在变量中的$max
会话对象。
因此,如果 ConnectionURI 指定的远程计算机返回重定向消息,PowerShell 会重定向连接,但如果新目标返回另一个重定向消息,则超过重定向计数值 1,并 Invoke-Command
返回非终止错误。
示例 17:访问远程会话中的网络共享
此示例演示如何从远程会话访问网络共享。 三台计算机用于演示示例。 Server01 是本地计算机,Server02 是远程计算机,Net03 包含网络共享。 Server01 连接到 Server02,然后 Server02 向 Net03 执行第二个跃点以访问网络共享。 有关 PowerShell 远程处理如何支持计算机之间的跃点的详细信息,请参阅 PowerShell 远程处理中的第二个跃点。
所需的凭据安全支持提供程序 (CredSSP) 委派在本地计算机上的客户端设置和远程计算机上的服务设置中启用。 若要运行此示例中的命令,你必须是本地计算机和远程计算机上的 Administrators 组的成员。
Enable-WSManCredSSP -Role Client -DelegateComputer Server02
$s = New-PSSession Server02
Invoke-Command -Session $s -ScriptBlock {Enable-WSManCredSSP -Role Server -Force}
$parameters = @{
ComputerName = 'Server02'
ScriptBlock = { Get-Item \\Net03\Scripts\LogFiles.ps1 }
Authentication = "CredSSP"
Credential = "Domain01\Admin01"
}
Invoke-Command @parameters
该 Enable-WSManCredSSP
cmdlet 支持从 Server01 本地计算机到 Server02 远程计算机的 CredSSP 委派。 Role 参数指定要在本地计算机上配置 CredSSP 客户端设置的客户端。
New-PSSession
为 Server02 创建 PSSession 对象,并将对象存储在变量中 $s
。
该 Invoke-Command
cmdlet 使用 $s
变量连接到远程计算机 Server02。 ScriptBlock 参数在远程计算机上运行Enable-WSManCredSSP
。 Role 参数指定要在远程计算机上配置 CredSSP 服务器设置的服务器。
该 $parameters
变量包含用于连接到网络共享的参数值。 该 Invoke-Command
cmdlet 在会话$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=43200000}
}
Invoke-Command @parameters
该命令用于 Invoke-Command
运行脚本。 ComputerName 参数的值是一个Get-Content
命令,用于从文本文件中获取远程计算机的名称。 InDisconnectedSession 参数将在启动该命令后立即断开与会话的连接。 FilePath 参数的值是在每台计算机上运行的脚本Invoke-Command
。
SessionOption 的值是哈希表。 OutputBufferingMode 值设置为 Drop,IdleTimeout 值设置为 43200000 毫秒, (12 小时) 。
若要获取在断开连接的会话中运行的命令和脚本的结果,请使用 Receive-PSSession
cmdlet。
示例 19:使用 SSH 在远程计算机上运行命令
此示例演示如何使用 Secure Shell (SSH) 在远程计算机上运行命令。 如果在远程计算机上配置 SSH 以提示输入密码,则会收到密码提示。 否则,必须使用基于 SSH 密钥的用户身份验证。
Invoke-Command -HostName UserA@LinuxServer01 -ScriptBlock { Get-MailBox * }
示例 20:使用 SSH 在远程计算机上运行命令并指定用户身份验证密钥
此示例演示如何使用 SSH 在远程计算机上运行命令,以及如何指定用于用户身份验证的密钥文件。 除非密钥身份验证失败,并且远程计算机配置为允许基本密码身份验证,否则不会提示输入密码。
Invoke-Command -HostName UserA@LinuxServer01 -ScriptBlock { Get-MailBox * } -KeyFilePath /UserA/UserAKey_rsa
示例 21:使用 SSH 作为作业在多个远程计算机上运行脚本文件
此示例演示如何使用 SSH 和 SSHConnection 参数集在多个远程计算机上运行脚本文件。 SSHConnection 参数采用包含每台计算机的连接信息的哈希表数组。 此示例要求目标远程计算机已将 SSH 配置为支持基于密钥的用户身份验证。
$sshConnections =
@{ HostName="WinServer1"; UserName="Domain\UserA"; KeyFilePath="C:\Users\UserA\id_rsa" },
@{ HostName="UserB@LinuxServer5"; KeyFilePath="/Users/UserB/id_rsa" }
$results = Invoke-Command -FilePath c:\Scripts\CollectEvents.ps1 -SSHConnection $sshConnections
参数
-AllowRedirection
允许将此连接重定向到备用统一资源标识符 (URI)。
使用 ConnectionURI 参数时,远程目标将返回一个指令,以重定向到不同的 URI。 默认情况下,PowerShell 不会重定向连接,但可以使用此参数来重定向连接。
你也可以通过更改 MaximumConnectionRedirectionCount 会话选项值,限制重定向连接的次数。 使用 cmdlet 的 MaximumRedirection 参数或设置首选项变量的 New-PSSessionOption
$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
提供脚本块的参数值。 脚本块中的参数由提供给 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 操作系统中可用。
此参数的可接受值如下所示:
- 默认
- 基本
- 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-Item
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 |
-ConnectionUri
指定定义会话的连接终结点的统一资源标识符 (URI)。 URI 必须完全限定。
此字符串的格式如下:
<Transport>://<ComputerName>:<Port>/<ApplicationName>
默认值如下:
http://localhost:5985/WSMAN
如果未指定连接 URI,可以使用 UseSSL 和 端口 参数来指定连接 URI 值。
URI 的 Transport 段的有效值为 HTTP 和 HTTPS。 如果使用传输段指定连接 URI,但不指定端口,则会使用标准端口创建会话:80 for HTTP,对于 HTTPS 为 443。 若要使用 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 参数或将其值设置为点 () .
、localhost 或本地计算机的名称。
默认情况下,环回会话是使用网络令牌创建的,该令牌可能没有足够的权限向远程计算机进行身份验证。
EnableNetworkAccess 参数仅在环回会话中有效。 如果在远程计算机上创建会话时使用 EnableNetworkAccess ,则命令会成功,但参数将被忽略。
可以使用身份验证参数的 CredSSP 值在环回会话中允许远程访问,该值将会话凭据委托给其他计算机。
为了防止计算机受到恶意访问,只有使用 EnableNetworkAccess 创建的交互式令牌(即使用 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
指定 Secure Shell (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 |
-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
远程运行命令时,命令中的任何变量都会在远程计算机上进行评估。
注意
脚本块的参数只能按位置从 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-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 创建的会话对象,或键是会话选项名称的哈希表,值是会话选项值。
选项的默认值由首选项变量的值 $PSSessionOption
确定(如果已设置)。 否则,通过在会话配置中设置的选项创建默认值。
会话选项值优先于首选项变量和会话配置中 $PSSessionOption
设置的会话的默认值。 但是,它们不优先于会话配置中设置的最大值、配额或限制。
有关包含默认值的会话选项的说明,请参阅 New-PSSessionOption
。 有关首选项变量的信息 $PSSessionOption
,请参阅 about_Preference_Variables。
有关会话配置的详细信息,请参阅 about_Session_Configurations。
Type: | PSSessionOption |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-SSHConnection
此参数采用哈希表数组,其中每个哈希表包含建立安全外壳 (SSH) 连接所需的一个或多个连接参数。 SSHConnection 参数可用于创建多个会话,其中每个会话需要不同的连接信息。
哈希表具有以下成员:
- ComputerName (或 HostName)
- 端口
- UserName
- KeyFilePath (或 IdentityFilePath)
ComputerName (或 HostName) 是唯一需要的键值对。
此参数是在 PowerShell 6.0 中引入的。
Type: | Hashtable[] |
Position: | Named |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-SSHTransport
指示使用安全外壳 (SSH) 建立远程连接。
默认情况下,PowerShell 使用 Windows WinRM 连接到远程计算机。 此开关强制 PowerShell 使用 HostName 参数建立基于 SSH 的远程连接。
此参数是在 PowerShell 6.0 中引入的。
Type: | SwitchParameter |
Accepted values: | true |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Subsystem
指定用于新 PSSession 的 SSH 子系统。
这将指定要在目标上使用的子系统,如sshd_config中定义。 子系统使用预定义的参数启动特定版本的 PowerShell。 如果远程计算机上不存在指定的子系统,该命令将失败。
如果未使用此参数,则默认值为“powershell”子系统。
Type: | String |
Position: | Named |
Default value: | powershell |
Required: | False |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-ThrottleLimit
指定为运行此命令可建立的并发连接的最大数目。 如果省略此参数或输入 0 值,则使用默认值 32。
节流限制仅适用于当前命令,而不适用于会话或计算机。
Type: | Int32 |
Position: | Named |
Default value: | 32 |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-UserName
指定用于在远程计算机上运行命令的帐户的用户名。 用户身份验证方法取决于远程计算机上如何配置 Secure Shell (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, System.Management.Automation.Runspaces.PSSession, or the output of the invoked command
如果使用 AsJob 参数,此 cmdlet 将返回作业对象。 如果指定 InDisconnectedSession 参数, Invoke-Command
则返回 PSSession 对象。 否则,它将返回调用的命令的输出,该命令是 ScriptBlock 参数的值。
备注
在 Windows Vista 和更高版本的 Windows 操作系统上,若要使用 ComputerName 参数在本地 Invoke-Command
计算机上运行命令,必须使用 “以管理员身份运行” 选项运行 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 属性的值是相对于当前会话的。 “ 断开连接 ”值表示 PSSession 未连接到当前会话。 但是,这并不意味着 PSSession 与所有会话断开连接。 它可能连接到另一个会话。 若要确定是否可以连接或重新连接到该会话,请使用 Availability 属性。
Availability 的 None 值指示可连接到 PSSession。 “忙碌”值表示无法连接到 PSSession,因为它已连接到另一个会话。 有关会话 状态 属性的值的详细信息,请参阅 RunspaceState。 有关会话 可用性 属性的值的详细信息,请参阅 RunspaceAvailability。
从 PowerShell 6.0 开始,包括 HostName 和 SSHConnection 参数。 添加了它们以基于安全外壳 (SSH) 提供 PowerShell 远程处理。 在 (Windows、Linux、macOS) 和 PowerShell 远程处理等多个平台上支持 PowerShell 和 SSH,这些平台支持 PowerShell 和 SSH。 这与以前的 Windows 仅基于 WinRM 的远程处理不同,许多 WinRM 特定功能和限制不适用。 例如,目前不支持基于 WinRM 的配额、会话选项、自定义终结点配置和断开连接/重新连接功能。 有关如何设置 PowerShell SSH 远程处理的详细信息,请参阅 PowerShell 远程处理 Over SSH。