WinRM的主要特性html
與Telnet和Shell(SSH)不同的是,PowerShell採用一種新的通訊協議,咱們稱之爲針對管理的Web服務(Web Services for Management,WS-MAN)。
WS-MAN徹底基於HTTP或者HTTPS進行工做,這樣保證在須要的狀況下,能輕易透過防火牆進行做業(由於每種協議都使用惟一的端口進行通訊)。微軟對WS-MAN的實現主要基於一個後臺服務:Windows遠程管理組件(WinRM)。
微軟宣佈遠程處理技術除了WS-MAN以外,還能夠基於SSH協議。這對那些已經熟悉SSH而不熟悉WS-MAN與WinRM的公司來講是一個好消息。從用戶角度講,如何使用遠程處理技術並沒有區別,底層協議的區別對你來講應該是透明的。
實際上,微軟不少本身的DevOPS產品也使用了WinRM技術,例如:git
Deploy to IIS using WinRM - Azure Pipelines | Microsoft Docs https://docs.microsoft.com/zh-cn/azure/devops/pipelines/apps/cd/deploy-webdeploy-iis-winrm?view=azure-devopsgithub
序列化與反序列化web
當你運行一個遠程命令時,它會將輸出結果放入一個特定形式的包中,以後經過網絡中的HTTP(或者HTTPS)協議傳回本地計算機。XML已經被證實是針對該問題的優秀解決方案,因此PowerShell會將輸出對象序列化到XML中。下一步,XML文件會經過網絡進行傳輸。當到達本地計算機以後,該XML會反序列化爲PowerShell能夠處理的對象。序列化和反序列化僅僅是一種格式轉換的形式:從對象轉化爲XML稱爲序列化,從XML轉爲對象則爲反序列化。編程
WinRM是一個通用的服務服務器
並不是只有PowerShell能使用WinRM服務。實際上,微軟在愈來愈多的管理程序中開始使用WinRM服務——甚至包含已經使用了其餘協議的那些程序。基於這一思想,微軟保證WinRM能夠將流量導入至多種管理程序——不只僅是PowerShell。WinRM相似一個調度器:當有新的流量進來後,WinRM會決定由哪一種程序來處理這部分流量。全部WinRM流量都標記了接收應用程序的名稱,同時這些應用程序都必須在WinRM中建立各自的端點,這樣WinRM才能偵聽這些主體的流量。這也就意味着,大家不僅須要啓用WinRM服務,也須要在WinRM中將PowerShell註冊爲一個端點。網絡
一對一和一對多的遠程處理併發
PowerShell能夠經過兩種方法實現遠程處理,第一種稱爲一對一或者1:1遠程處理(第二種稱爲一對多,或者1:n遠程處理。當使用一對一遠程處理時,其實是在單臺遠程計算機上調用了一個Shell命令窗口。輸入的任何命令都會直接在該計算機上運行,而後在遠程處理窗口中返回輸出結果。該機制很是相似於遠程桌面鏈接(Remote Desktop Connection),只是Windows PowerShell採用的是命令行環境。相對於遠程桌面鏈接,這種遠程處理技術只須要使用不多的資源,因此對服務器來說,開銷會小不少。app
若是須要針對一臺遠程計算機創建一對一的遠程處理進程,請運行下面的命令。編程語言
Enter-PSSession -ComputerName Server-R2
默認狀況下,PowerShell最多一次與32臺遠程計算機通訊。若是超過32臺,那麼會將計算機信息存放到一個隊列中。若是命令在一臺遠程計算機上運行完畢,隊列中的下一臺計算機會當即開始運行。固然,若是網絡足夠良好,而且計算機足夠強勁,那麼咱們能夠經過Invoke-Command的-ThrottleLimit參數來指定更多數量的計算機。
Invoke-Command | Microsoft Docs
https://docs.microsoft.com/en-us/previous-versions/dd347578(v=technet.10)?redirectedfrom=MSDN
併發執行
使用Invoke-Command命令比Cmdlet的-ComputerName參數更有效率,更有用。計算機會被併發地訪問,也就意味着,命令運行更有效率。命令的輸出結果中包含PSComputerName屬性,也就使得咱們能輕易看到哪一個結果來自於哪臺計算機。
備註:部份內容參考了《Windows PowerShell實戰指南(第3版)》,通過做者二次整理和補充,更加方便你們理解。
主流編程語言及工具對WinRM的支持狀況
GitHub - diyan/pywinrm: Python library for Windows Remote Management (WinRM) https://github.com/diyan/pywinrm
GitHub - WinRb/WinRM: Ruby library for Windows Remote Management https://github.com/WinRb/WinRM
GitHub - masterzen/winrm: Command-line tool and library for Windows remote command execution in Go https://github.com/masterzen/winrm
winrm – Run tasks over Microsoft’s WinRM — Ansible Documentation https://docs.ansible.com/ansible/devel/plugins/connection/winrm.html
更多內容,您也能夠參考