PowerShell主要采用Web Services for Mangement(WS-MAN)進行遠程處理,WS-MAN完全基於Http(默認5985)或者Https(默認5986)進行工作,這樣保證在需要的情況下,能夠輕易透過防火牆進行作業(因為每種協議都使用唯一的端口進行通信)。微軟對WS-MAN的實現是Windows Remote mangement(WinRM)。WinRM是一個基於SOAP的后台服務。
PowerShell連接常規遠程主機
1. 在遠程機器上以Administrator角色打開PowerShell執行以下命令,啟動允許遠程連接
Enable-PsRemoting
2. 在客戶機器 (本地) 執行以下命令,將遠程機器IP地址加入可信主機列表
Set-Item wsman:\localhost\Client\TrustedHosts -value <Remote Host IP Address>
3. 在客戶機器 (本地) 輸入以下命令, 在彈出對話框輸入密碼,以交互的方式連接遠程主機
Enter-PSSession -ComputerName <Remote Host IP Address> -Credential <UserName>
4. PowerShell遠程命令的基本使用見官方文檔: Running Remote Commands
- Start an Interactive Session (Enter-PSSession and Exit-PSSession)
- Run a Remote Command / Script (Invoke-Command)
- Establish a Persistent Connection (New-PSSession)
使用PowerShell以Http方式連接Azure虛擬機
1. 同以上常規連接遠程主機設置
1. 若虛擬機安全受網絡完全組(Network Security Group)管控,設置允許5985入棧
2. 若虛擬機綁定了負載均衡器(load balancer),為5985端口設置入站NAT規則(Inbound NAT Rules), 或者為了隱藏實際端口,為5985端口運行狀況探測(probes)和負載均衡規則(load Balancing Rules)
使用PowerShell以Https方式連接Azure虛擬機
1. 同以上常規連接遠程主機設置
2. 打開Azure遠程虛擬機(Windows)防火牆設置,設置允許5986入棧
3. 若虛擬機安全受網絡完全組(Network Security Group)管控,設置允許5986入棧
4. 若虛擬機綁定了負載均衡器(load balancer),為5986端口設置入站NAT規則(Inbound NAT Rules),或者為了隱藏實際端口,為5986端口運行狀況探測(probes)和負載均衡規則(load Balancing Rules)
5. 需使用以下命令連接遠程主機, 詳細參數設置見: Enter-PSSession
# 設置會話,忽略遠程機器的SSL證書驗證
$SessionOption = New-PsSessionOption SkipCACheck -SkipCNCheck Enter-PSSession -ConnectionUri https://<Remote Host IP Address>:5986 -Credential <User Name> -SessionOption $SessionOption
# 另一種參數形式
Enter-PSSession -ComputerName <Remote Host IP Address> -Port 5986 -UseSSL -Credential <User Name> -SessionOption $SessionOption
從PowerShell 6開始,除了WS-MAN之外,遠程處理技術還可以基於SSH協議。在最新的Windows 10和Windows Server 2019中,可以使用OpenSSH連接遠程機器,詳細文檔參見:PowerShell remoting over SSH and OpenSSH in Windows, 另外,OpenSSH客戶端在最新的Windows 10和Windows Server 2019中已默認安裝,在 設置\應用\可選功能 列表下可以找到(見下圖), 可以通過上方的添加功能按鈕安裝OpenSSH服務器。
更多參考:
1. Enable PowerShell remoting on Azure RM virtual machines
2. Copy files to Azure VM using PowerShell Remoting
3. Secrets of PowerShell Remoting
3. 遠程管理WinRM,Enter-PSSession (Enable-PSRemoting = Set-WSManQuickConfig = winrm quickconfig)