PowerShell 远程处理是如何工作的?


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

内置 -ComputerName 参数。

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

示例

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

Get-Service Spooler -ComputerName Test1-Win2k12

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

输出

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

更新于: 2020年7月25日

314 次查看

启动您的 职业生涯

通过完成课程获得认证

开始
广告