遠端管理
PowerShell 最強大的地方之一,是能在不登入的情況下,對一台甚至上百台遠端電腦執行同樣的指令。這一頁介紹遠端管理(remoting)的基本觀念與兩個最常用的 cmdlet。
兩種連線方式
| 方式 | 適用 | 說明 |
|---|---|---|
| WinRM(WS-Management) | Windows 到 Windows | Windows PowerShell 與 PowerShell 7 都支援 |
| SSH | Windows、macOS、Linux 互連 | PowerShell 7 支援,是跨平台遠端管理的做法 |
啟用(Windows)
在要被管理的電腦上,以系統管理員身分開啟 PowerShell,執行:
這會啟動 WinRM 服務並設定防火牆例外。網域環境中通常已由群組原則處理。
只在信任的網路上啟用
啟用遠端管理等於開了一個管理入口。請確認網路環境與帳號權限的設定,不要在不受管理的網路上任意開啟。
互動式連線:Enter-PSSession
像 SSH 一樣進入遠端電腦的命令列:
Enter-PSSession -ComputerName server01
# 提示字元會變成 [server01]: PS C:\>,之後輸入的指令都在遠端執行
Exit-PSSession # 離開
透過 SSH 連線(PowerShell 7):
批次執行:Invoke-Command
Invoke-Command 把一段指令送到一台或多台電腦同時執行,並把結果收回來:
$servers = 'web01', 'web02', 'db01'
Invoke-Command -ComputerName $servers -ScriptBlock {
Get-Service -Name Spooler | Select-Object Name, Status
}
-ScriptBlock 的大括號內是在遠端執行的內容。結果會多一個 PSComputerName 屬性,告訴你資料來自哪台電腦,方便後續用 Sort-Object 或 Where-Object 處理。
把本機變數傳到遠端
大括號內的程式碼在遠端執行,看不到你本機的變數。用 $using: 前綴把它帶過去:
$serviceName = 'Spooler'
Invoke-Command -ComputerName $servers -ScriptBlock {
Get-Service -Name $using:serviceName
}
重複使用連線:New-PSSession
需要對同一台電腦連續下多次指令時,先建立工作階段(session)再重複使用,比每次重新連線更有效率:
$session = New-PSSession -ComputerName server01
Invoke-Command -Session $session -ScriptBlock { Get-Date }
Invoke-Command -Session $session -ScriptBlock { Get-Process | Select-Object -First 3 }
Remove-PSSession $session
遠端回傳的是「快照」物件
從遠端傳回來的物件,經過序列化再重建,只保留屬性的值,沒有方法了,也不會隨遠端狀態改變。例如遠端傳回的 Service 物件沒有 .Stop() 方法可用。要對遠端做動作,就把動作寫在 -ScriptBlock 內,讓它在遠端執行。
認證
需要不同帳號時,用 Get-Credential 提示輸入,再透過 -Credential 參數傳入:
$cred = Get-Credential
Invoke-Command -ComputerName server01 -Credential $cred -ScriptBlock { whoami }
Get-Credential 會把密碼以安全字串保存,不要把帳號密碼直接寫進腳本。
推薦影音
PowerShell 遠端管理
簡述:John Savill 的 PowerShell Master Class 遠端單元(約 76 分鐘),完整說明如何用 PowerShell 同時管理多台系統,包含跨平台的連線,對應本頁全部內容。錄於 2019 年,SSH 遠端等跨平台部分是 PowerShell 6 之後的重要功能,PowerShell 7 沿用。
相關資料
- PowerShell 遠端管理概觀(官方)
- Getting Started with PowerShell 3.0:Remoting(Snover 與 Helmick 的 Jump Start 影片)
- 想看更多影音教學:學習資源