当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] Invoke-Command (Microsoft.PowerShell.Core)

作者:精品下载站 日期:2024-12-14 02:15:30 浏览:15 分类:玩电脑

Invoke-Command (Microsoft.PowerShell.Core)


Invoke-Command

模块 :Microsoft.PowerShell.Core

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

句法

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 的strong>Session 参数,用于在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 的会话,您可以使用 HostNameSSHConnection 参数来指定远程计算机和相关连接信息。有关如何设置 PowerShell SSH 远程处理的详细信息,请参阅通过 SSH 的 PowerShell 远程处理。

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

示例

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

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

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

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

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

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

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

ComputerName 参数指定远程计算机的名称。 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 在 Server02 上运行 Get-Culture 命令。 Session 参数指定保存在 $s 变量中的会话。

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

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

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

Invoke-Command -ComputerName Server02 -ScriptBlock { $p = Get-Process PowerShell }
Invoke-Command -ComputerName Server02 -ScriptBlock { $p.VirtualMemorySize }
$s = New-PSSession -ComputerName Server02
Invoke-Command -Session $s -ScriptBlock { $p = Get-Process PowerShell }
Invoke-Command -Session $s -ScriptBlock { $p.VirtualMemorySize }

17930240

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

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

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

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

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

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

$command = {
    Get-WinEvent -LogName PowerShellCore/Operational |
      Where-Object -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 属性。

这些命令一次运行一个。命令完成后,所有计算机的命令输出将保存在 $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 在 Server01 上运行 Get-WinEvent 以从事件日志中获取 10 个最新事件。 LogName 参数的值是 $Log 变量,该变量以 Using 范围修饰符为前缀,指示它是在本地会话中创建的,不在远程会话中。

示例 10:隐藏计算机名称

此示例显示使用 Invoke-CommandHideComputerName 参数的效果。 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

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

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

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

有关 Param 关键字的详细信息,请参阅 about_Language_Keywords。

$parameters = @{
    ComputerName = 'Server01'
    ScriptBlock  = {
        Param ($param1, $param2)
        Get-ChildItem -Name $param1 -Include $param2
    }
    ArgumentList = 'a*', '*.pdf'
}
Invoke-Command @parameters

aa.pdf
ab.pdf
ac.pdf
az.pdf

Invoke-Command 使用定义两个变量 $param1$param2ScriptBlock 参数。 Get-ChildItem 使用命名参数、NameInclude 以及变量名称。 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 数组值传递到 PathFilter 的 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。 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

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

笔记

禁用这些检查对于故障排除来说很方便,但显然不安全。

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

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

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

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

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

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

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

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

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

所需的凭据安全支持提供程序 (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 委派。 Role 参数指定 Client 在本地计算机上配置 CredSSP 客户端设置。

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

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

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

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

此示例在一百多台计算机上运行一个脚本。为了最大限度地减少对本地计算机的影响,它会连接到每台计算机,启动脚本,然后断开与每台计算机的连接。该脚本在断开连接的会话中继续运行。

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

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

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

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

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

此示例演示如何使用 Secure Shell (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 会话选项值来限制连接重定向的次数。使用 New-PSSessionOption cmdlet 的 MaximumRedirection 参数或设置 $PSSessionOption 首选项变量的 MaximumConnectionRedirectionCount 属性。默认值为 5。

类型 :

SwitchParameter

位置:

命名

默认值:

False

必需的:

False

接受管道输入:

False

接受通配符:

False

-ApplicationName

指定连接 URI 的应用程序名称段。当您未在命令中使用 ConnectionURI 参数时,请使用此参数指定应用程序名称。

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

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

类型 :

String

位置:

命名

默认值:

$PSSessionApplicationName(如果在本地计算机上设置),否则为 WSMAN

必需的:

False

接受管道输入:

True

接受通配符:

False

-ArgumentList

提供脚本块的参数值。脚本块中的参数按位置从提供给ArgumentList 的数组值传递。这称为数组分散。有关 ArgumentList 行为的更多信息,请参阅 about_Splatting。

类型 :

Object[]

别名:

Args

位置:

命名

默认值:

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

位置:

命名

默认值:

False

必需的:

False

接受管道输入:

False

接受通配符:

False

-Authentication

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

该参数可接受的值如下:

  • 默认
  • 基本的
  • 信用证
  • 消化
  • 克伯罗斯
  • 谈判
  • 使用隐式凭证进行协商

默认值为默认。

有关此参数值的更多信息,请参阅 AuthenticationMechanism 枚举。

警告

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

类型 :

AuthenticationMechanism

接受的值:

基本、默认、Credssp、摘要、Kerberos、协商、NegotiateWithImplicitCredential

位置:

命名

默认值:

默认

必需的:

False

接受管道输入:

False

接受通配符:

False

-CertificateThumbprint

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

证书用于基于客户端证书的身份验证。它们只能映射到本地用户帐户,并且不能与域帐户一起使用。

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

类型 :

String

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-ComputerName

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

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

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

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

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

类型 :

String[]

别名:

Cn

位置:

0

默认值:

本地电脑

必需的:

False

接受管道输入:

False

接受通配符:

False

-ConfigurationName

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

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

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

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

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

类型 :

String

位置:

命名

默认值:

$PSSessionConfigurationName(如果在本地计算机上设置),否则为 Microsoft.PowerShell

必需的:

False

接受管道输入:

True

接受通配符:

False

-ConnectingTimeout

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

该参数是在PowerShell 7.2中引入的

类型 :

整数32

位置:

命名

默认值:

无限

必需的:

False

接受管道输入:

False

接受通配符:

False

-ConnectionUri

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

该字符串的格式如下:

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

默认值如下:

http://localhost:5985/WSMAN

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

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

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

类型 :

乌里[]

别名:

URI, CU

位置:

0

默认值:

http://localhost:5985/WSMAN

必需的:

False

接受管道输入:

False

接受通配符:

False

-ContainerId

指定容器 ID 的数组。

类型 :

String[]

位置:

命名

默认值:

None

必需的:

True

接受管道输入:

True

接受通配符:

False

-Credential

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

输入用户名,例如 User01Domain01\User01,或输入由 Get-Credential cmdlet。如果您键入用户名,系统会提示您输入密码。

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

笔记

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

类型 :

PS凭证

位置:

命名

默认值:

当前用户

必需的:

False

接受管道输入:

True

接受通配符:

False

-EnableNetworkAccess

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

环回会话是在同一台计算机上发起和结束的 PSSession。要创建环回会话,请省略 ComputerName 参数或将其值设置为点 (.)、localhost 或本地计算机的名称。

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

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

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

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

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

类型 :

SwitchParameter

位置:

命名

默认值:

False

必需的:

False

接受管道输入:

False

接受通配符:

False

-FilePath

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

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

类型 :

String

别名:

PSPath

位置:

1

默认值:

None

必需的:

True

接受管道输入:

False

接受通配符:

False

-HideComputerName

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

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

类型 :

SwitchParameter

别名:

HCN

位置:

命名

默认值:

False

必需的:

False

接受管道输入:

False

接受通配符:

False

-HostName

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

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

类型 :

String[]

位置:

命名

默认值:

None

必需的:

True

接受管道输入:

False

接受通配符:

False

-InDisconnectedSession

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

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

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

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

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

有关“断开连接的会话”功能的更多信息,请参阅 about_Remote_Disconnected_Sessions。

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

类型 :

SwitchParameter

别名:

Disconnected

位置:

命名

默认值:

False

必需的:

False

接受管道输入:

False

接受通配符:

False

-InputObject

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

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

类型 :

PS对象

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

True

接受通配符:

False

-JobName

为后台作业指定一个友好名称。默认情况下,作业名为 JobAsJob。

有关 PowerShell 后台作业的更多信息,请参阅 about_Jobs。

类型 :

String

位置:

命名

默认值:

工作

必需的:

False

接受管道输入:

False

接受通配符:

False

-KeyFilePath

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

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

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

类型 :

String

别名:

IdentityFilePath

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-NoNewScope

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

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

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

类型 :

SwitchParameter

位置:

命名

默认值:

False

必需的:

False

接受管道输入:

False

接受通配符:

False

-Options

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

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

此参数是在 PowerShell 7.3 中添加的。

类型 :

哈希表

位置:

命名

默认值:

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

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

类型 :

整数32

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-RemoteDebug

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

类型 :

SwitchParameter

位置:

命名

默认值:

False

必需的:

False

接受管道输入:

False

接受通配符:

False

-RunAsAdministrator

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

类型 :

SwitchParameter

位置:

命名

默认值:

False

必需的:

False

接受管道输入:

False

接受通配符:

False

-ScriptBlock

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

笔记

脚本块的参数只能按位置从 ArgumentList 传入。开关参数不能按位置传递。如果您需要一个行为类似于 SwitchParameter 类型的参数,请改用 Boolean 类型。

类型 :

ScriptBlock

别名:

Command

位置:

0

默认值:

None

必需的:

True

接受管道输入:

False

接受通配符:

False

-Session

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

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

类型 :

PS会话[]

位置:

0

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-SessionName

为断开连接的会话指定一个友好名称。您可以在后续命令中使用该名称来引用会话,例如 Get-PSSession 命令。该参数仅与InDisconnectedSession参数一起使用才有效。

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

类型 :

String[]

位置:

命名

默认值:

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。

类型 :

PS会话选项

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-SSHConnection

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

哈希表具有以下成员:

  • 计算机名(或主机名
  • 端口
  • 用户名
  • KeyFilePath(或IdentityFilePath

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

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

类型 :

哈希表[]

位置:

命名

默认值:

None

必需的:

True

接受管道输入:

False

接受通配符:

False

-SSHTransport

表示使用 Secure Shell (SSH) 建立远程连接。

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

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

类型 :

SwitchParameter

接受的值:

真的

位置:

命名

默认值:

False

必需的:

False

接受管道输入:

False

接受通配符:

False

-Subsystem

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

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

如果不使用此参数,则默认为 powershell 子系统。

类型 :

String

位置:

命名

默认值:

电源外壳

必需的:

False

接受管道输入:

False

接受通配符:

False

-ThrottleLimit

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

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

类型 :

整数32

位置:

命名

默认值:

32

必需的:

False

接受管道输入:

False

接受通配符:

False

-UserName

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

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

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

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

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

类型 :

String

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-UseSSL

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

WS-Management 对通过网络传输的所有 PowerShell 内容进行加密。 UseSSL 参数是通过 HTTPS(而不是 HTTP)发送数据的附加保护。

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

类型 :

SwitchParameter

位置:

命名

默认值:

False

必需的:

False

接受管道输入:

False

接受通配符:

False

-VMId

指定虚拟机 ID 的数组。

类型 :

指导[]

别名:

VMGuid

位置:

0

默认值:

None

必需的:

True

接受管道输入:

True

接受通配符:

False

-VMName

指定虚拟机名称的数组。

类型 :

String[]

位置:

命名

默认值:

None

必需的:

True

接受管道输入:

True

接受通配符:

False

输入

脚本块

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

输出

System.Management.Automation.PSRemotingJob

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

PS会话

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

对象

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

笔记

PowerShell 包含以下 Invoke-Command 别名:

  • 所有平台:

      icm

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

    当您在多台计算机上运行命令时,PowerShell 将按照计算机在列表中显示的顺序连接到计算机。但是,命令输出按照从远程计算机接收的顺序显示,这可能有所不同。

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

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

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

    当您使用 InDisconnectedSession 参数断开 PSSession 的连接时,会话状态为已断开,可用性为State 属性的值与当前会话相关。 Disconnected 值表示 PSSession 未连接到当前会话。但是,这并不意味着 PSSession 已与所有会话断开连接。它可能连接到不同的会话。要确定是否可以连接或重新连接到会话,请使用可用性属性。

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

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

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

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

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

    Cmdlet parameter ssh parameter equivalent ssh -o option -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)。

    您需要 登录账户 后才能发表评论

    取消回复欢迎 发表评论:

    关灯