运行远程命令

可以使用单个 PowerShell 命令在一台或数百台计算机上运行命令。 Windows PowerShell 支持使用各种技术(包括 WMI、RPC 和 WS-Management)进行远程计算。

PowerShell 支持 WMI、WS-Management 和 SSH 远程处理。 在 PowerShell 7 及更高版本中,RPC 仅在 Windows 上受支持。

有关 PowerShell 中的远程处理的详细信息,请参阅以下文章:

无需配置的 Windows PowerShell 远程处理

许多 Windows PowerShell cmdlet 都具有 ComputerName 参数,此参数可使你在一台或多台远程计算机上收集数据和更改设置。 这些 cmdlet 使用不同的通信协议,无需进行任何特殊配置即可在所有 Windows 操作系统上工作。

这些 cmdlet 包括:

通常情况下,支持无需特殊配置的远程处理的 cmdlet 具有 ComputerName 参数,但不具有 Session 参数。 若要在会话中查找这些 cmdlet,请键入:

Get-Command | Where-Object {
    $_.Parameters.Keys -contains "ComputerName" -and
    $_.Parameters.Keys -notcontains "Session"
}

Windows PowerShell 远程功能

使用 WS-Management 协议,Windows PowerShell 远程处理允许在一台或多台远程计算机上运行任何 Windows PowerShell 命令。 可以建立持久连接、启动交互式会话,并在远程计算机上运行脚本。

若要使用 Windows PowerShell 远程处理,必须将远程计算机配置为进行远程管理。 有关详细信息,包括说明,请参阅 “关于远程要求”。

配置 Windows PowerShell 远程处理后,可以使用许多远程处理策略。 本文只列出了其中一些内容。 有关详细信息,请参阅 “关于远程”。

启动交互式会话

若要使用单个远程计算机启动交互式会话,请使用 Enter-PSSession cmdlet。 例如,若要启动与 Server01 远程计算机的交互式会话,请键入:

Enter-PSSession Server01

命令提示符将更改以显示远程计算机的名称。 在提示符下键入的任何命令都在远程计算机上运行,结果将显示在本地计算机上。

若要结束交互式会话,请键入:

Exit-PSSession

关于 Enter-PSSessionExit-PSSession cmdlet 的详细信息,请参阅:

运行远程命令

若要在一台或多台计算机上运行命令,请使用 Invoke-Command cmdlet。 例如,若要在 Server01 和 Server02 远程计算机上运行 Get-UICulture 命令,请键入:

Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-UICulture}

输出将返回到计算机。

LCID    Name     DisplayName               PSComputerName
----    ----     -----------               --------------
1033    en-US    English (United States)   server01.corp.fabrikam.com
1033    en-US    English (United States)   server02.corp.fabrikam.com

运行脚本

若要在一个或多个远程计算机上运行脚本,请使用 cmdlet 的 Invoke-CommandFilePath 参数。 该脚本必须位于本地计算机上或可供本地计算机访问。 结果将返回到本地计算机。

例如,以下命令在 DiskCollect.ps1 远程计算机 Server01 和 Server02 上运行脚本。

Invoke-Command -ComputerName Server01, Server02 -FilePath C:\Scripts\DiskCollect.ps1

建立持久连接

使用 New-PSSession cmdlet 在远程计算机上创建持久会话。 以下示例在 Server01 和 Server02 上创建远程会话。 会话对象存储在变量中 $s

$s = New-PSSession -ComputerName Server01, Server02

建立会话后,你可以在这些会话中运行任何命令。 此外,由于会话是持久的,因此你可以从一个命令收集数据,并在另一个命令中使用它。

例如,以下命令在变量中的$s会话中运行命令Get-HotFix,并将结果保存在变量中$h。 将在 $h 中的每个会话中创建 $s 变量,但它不会存在于本地会话中。

Invoke-Command -Session $s {$h = Get-HotFix}

现在,可以将变量中的数据 $h 与同一会话中的其他命令一起使用。 结果显示在本地计算机上。 例如:

Invoke-Command -Session $s {$h | where {$_.InstalledBy -ne "NT AUTHORITY\SYSTEM"}}

高级远程处理

PowerShell 包含允许你使用的 cmdlet:

  • 从本地和远程端配置和创建远程会话
  • 创建自定义和受限会话
  • 从远程会话中导入命令,这些命令实际上是在该远程会话上隐式运行的
  • 配置远程会话的安全性

Windows 上的 PowerShell 包括 WSMan 提供者。 提供程序会创建一个虚拟 WSMan: 驱动器,让您能够在本地计算机和远程计算机上的配置设置层次结构中进行导航。

有关 WSMan 提供程序的详细信息,请参阅 WSMan 提供程序关于 WS-Management Cmdlet,或在 Windows PowerShell 控制台中键入 Get-Help WSMan

有关详细信息,请参见:

有关远程错误排查的帮助,请参阅 about_Remote_Troubleshooting

另请参阅