PowerShell Remoting 如何工作?

powershellmicrosoft technologiessoftware & coding更新于 2026/2/14 18:22:17

有几种方法可以连接到远程计算机的 cmdlet。这些计算机可以位于同一 域、不同域或使用 PowerShell 的工作组中。这里,我们将主要关注 内置参数 Invoke-Command 以及如何远程执行 PSSession 命令。

内置 -ComputerName 参数。

PowerShell 中的许多 cmdlet 支持 -ComputerName 参数,该参数描述远程计算机名称。例如,Get-Service、Get-Process 和 Get-WMIObject 等 cmdlet。

示例

如果远程服务器位于同一域中,则只需添加 -ComputerName 凭据即可。

Get-Service Spooler -ComputerName Test1-Win2k12

输出

PS C:\Users\Administrator> Get-Service Spooler -ComputerName Test1-Win2k12
Status            Name          DisplayName
------           ----           -----------
Running          Spooler        Print Spooler

或者使用 WMI 获取计算机 BIOS 信息:

Get-WmiObject win32_bios -ComputerName Test1-win2k12

输出

PS C:\Users\Administrator> Get-WmiObject win32_bios -ComputerName Test1-win2k12
SMBIOSBIOSVersion     :       6.00
Manufacturer          : Phoenix Technologies LTD
Name                  : PhoenixBIOS 4.0 Release 6.0
SerialNumber          : VMware-56 4d 0d 7f 8a 7e f6 fa-f2 55 1d b6 a3 52 80 9f
Version               : INTEL - 6040000

但是,如果您的远程服务器位于其他域中,则可能会收到以下身份验证错误消息。

PS C:\> Get-Service -ComputerName Test1-Win2k12
Get-Service : Cannot open Service Control Manager on computer 'Test1-
Win2k12'. This operation might require other privileges.
At line:1 char:1
   + Get-Service -ComputerName Test1-Win2k12
   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   + CategoryInfo       : NotSpecified: (:) [Get-
Service], InvalidOperationException
   + FullyQualifiedErrorId    : System.InvalidOperationException,Microsoft.PowerShe
ll.Commands.GetServiceCommand

为了解决域和独立服务器身份验证问题,许多 cmdlet 支持 -Credential 参数,该参数是目标服务器的凭据。例如,Copy-Item cmdlet 就包含 -Credential 参数,在这种情况下,您可以直接传递远程服务器凭据,该命令即可正常工作。

Copy-Item 'C:\Temp\Encoding Time.csv' -Destination \Test1-Win2k12\C$\Temp -
Credential $creds

但是,许多命令(例如 Get-Service、Get-Process 等)不支持 -Credential 参数,在这种情况下,您需要使用下面介绍的另外两种方法。

使用 Invoke-Command 方法。

Invoke-Command 是在远程计算机上处​​理命令最便捷的方法之一。您需要提供计算机名称和脚本块才能远程运行命令。

示例

Invoke-Command -ComputerName Test1-Win2k12 -ScriptBlock{Get-Service Spooler}
PS C:\Users\Administrator> Invoke-Command -ComputerName Test1-Win2k12 -
ScriptBlock{Get-Service Spooler}
Status       Name         DisplayName       PSComputerName
------       ----         -----------       --------------
Running      Spooler      Print Spooler     Test1-Win2k12

在上面的例子中,我们假设 Test1-Win2k12 位于同一域中,因此无需其他凭据即可连接到远程服务器。如果服务器位于不同的域或工作组中,则应使用 Invoke-Command 支持的 -Credential 参数。例如:

$creds = Get-Credential
Invoke-Command -ComputerName Test2-Win2k12 -ScriptBlock{Get-Service Spooler} -
Credential $creds

输出

Status       Name       DisplayName       PSComputerName
------       ----       -----------       --------------
Running      Spooler    Print Spooler     Test2-Win2k12

使用 PSSession 方法。

使用 PSSession 方法,您可以进入 PSSession 并运行命令,也可以将会话存储到会话变量中,并在运行命令时传递此会话变量,以便命令可以远程运行。

Enter-PSSession cmdlet。

使用 Enter-PSSession cmdlet 时,您可以直接连接到已加入域的计算机,也可以使用 cmdlet 中的 -Credential 参数为不同的域或工作组计算机提供凭据。

适用于已加入域的计算机。

Enter-PSSession Test1-Win2k12

运行命令后输入计算机名称,您会注意到路径前面的计算机名称,这表明您已进入远程 shell,然后可以运行命令。

输出

PS C:\Users\Administrator> Enter-PSSession Test1-Win2k12
[Test1-Win2k12]: PS C:\Users\Administrator.LABDOMAIN\Documents>
[Test1-Win2k12]: PS C:\Users\Administrator.LABDOMAIN\Documents> Get-Service
Spooler
Status       Name         DisplayName
------       ----         -----------
Running      Spooler      Print Spooler

如果您的计算机位于不同的工作组中,请在 cmdlet 中传递凭据。例如:

Enter-PSSession Test2-Win2k12 -Credential (Get-Credential)

输出

[Test2-Win2k12]: PS C:\Users\Administrator\Documents> Hostname
Test2-Win2k12

您可以使用 Exit-PSSession 命令结束现有会话。

使用会话变量。

您还可以使用会话变量远程连接到服务器。为此,您需要使用 New-PSSession cmdlet,后跟远程计算机名称,并将该会话存储在新变量中,之后此变量即可由支持的 cmdlet(如 Invoke-Command 或 Enter-PSSession)使用。

例如:

$sess = New-PSSession Test1-Win2k12

检查 $sess 变量的值时:

您可以使用此变量检索 Test1-Win2k12 计算机上 cmdlet 的输出。

Invoke-Command -Session $sess -ScriptBlock{Get-Service Spooler}
PS C:\Users\Administrator> Invoke-Command -Session $sess -ScriptBlock{Get-
Service Spooler}
Status       Name        DisplayName       PSComputerName
------       ----        -----------       --------------
Running      Spooler     Print Spooler     Test1-Win2k12

相关文章