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