PowerShell 遠端處理是如何工作的?
有多種方法可以連線到遠端計算機 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