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
更多内容,您也能够参考