Windows远程管理(WinRM)服务是WindowsServer2003R2以上版本中一种新式的方便远程管理的服务。通过WinRM服务,便于在日常工作中远程管理服务器,或通过脚本同时管理多台服务器,来提高工作效率。
我们在运维Windows服务器时,通常是用RDP协议来访问服务器,由于RDP是一种图形化协议,导致运维人员无法像SSH一样通过命令行终端的方式来对Windows服务器进行运维操作。RDP协议的这一缺点,使得Windows无法通过远程来执行一些自动化批量命令,例如传输文件、远程执行脚本等。
WinRM服务基于HTTP(HTTPS)协议,使用5985端口(HTTPS使用5986端口)。按照微软官方的介绍:Windows2008R2以上版本的操作系统,默认开启WinRM服务,因此,在使用时只需将防火墙相应的5985(或5986)端口开放即可;
(1)如何确认WinRM服务是否开放?
以管理员身份在CMD中执行以下命令:
winrmewinrm/config/listener
若返回错误信息,表示WinRM未启动;
若返回以下信息,表示已启动:
(2)如何开启WinRM服务?
若WinRM未启用,以管理员权限运行PowerShell,然后输入以下命令:
enable-psremoting
看到上述界面,表示WinRM启动成功。
行云管家在以往版本中,为解决Windows远程命令执行问题,采用了Agent方案,但由于Agent接受程度不高,同时Agent的批量化安装同样依赖远程命令执行,这就导致了“鸡生蛋蛋生鸡”的哲学问题。
目前,在V6.4版本中,行云管家已经尝试将WinRM作为Windows账号自动改密的执行方案。未来,行云管家将全面开始采用WinRM服务作为Windows远程管理的解决方案。
在业界,WinRM已经被广泛接受,微软官方也在逐渐向Linux看齐,甚至在未来发布的WindowsServer,将支持只有ServerCore而没有GUI的Windows。而这种系统的管理方式,就是WinRM。
在现在GUI形式的Windows上,若使用域控账号或Administrator执行远程管理,由于Windows将域账户认为是可信账户,因此无需任何配置,即可完美执行远程命令。
但要想使用本地非Administrator账号通过WinRM进行远程管理,会受到UAC(UserAccountControl)的影响,当使用非Administrator账号执行任何操作时,均会弹出UAC确认窗口,需要用户手动点击“是”按钮进行确认,如下图:
那么问题来了:在执行远程命令时,运维人员并没有进到操作系统界面,无法看到此提示,更不用说确认了,必然导致远程命令执行失败。
针对此问题,微软提供了一种远程操作关闭UAC提示的策略配置,只需要在注册表中配置LocalAccountTokenFilterPolicy=1,即可在远程执行命令时,不进行UAC提示,但此策略不影响Windows本地操作,因此具有一定安全性。
具体配置操作为以管理员身份打开CMD,并执行以下命令:
reg.exeADDHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System/vLocalAccountTokenFilterPolicy/tREG_DWORD/d1/f
进行上述配置后,使用本地非管理员账号,也可完美远程执行命令。