小编对于这篇文章一直犹豫要不要发,内容太干了,太技术了,不知道是不是能贴合所有人口味。居实施过大型企业RPA项目的小伙伴们,肯定会遇到这样的问题,当机器人部署在虚拟机上,然后关闭mstsc之后,虚拟机windwows会失去GUI交互能力 ,导致键盘,鼠标之类操作通通失效。
啥? 有些玩RPA的还没经历这个步骤 ?我举个最简单的RPA例子:
让RPA机器人打开Baidu ,鼠标点一下输入栏,输入”51RPA”,点“百度一下”按钮
相信我们在正常人来做这件事情就和玩一样简单,但当你让这个把RPA部署在虚拟机,并且关闭远程桌面连接后,你发现RPA机器人只干了一件事,那就是打开了Baidu ,后面的几步都失效了。
【必备知识】
如果还想了解的更深入,请参见以下链接:
https://blogs.technet.microsoft.com/markrussinovich/2010/02/24/pushing-the-limits-of-windows-user-and-gdi-objects-part-1/ (Mark Russinovich 大拿的文章)
https://docs.microsoft.com/zh-cn/windows/desktop/winstation/window-stations-and-desktops (微软官方文章)
首先需要知道3个在Windows 操作系统中的经常用的对象:
Session、Windows Station 、 Desktop。
▲ Session 用户会话
每个登录操作系统的用户都会被分配一个唯一的登录会话,用于标识该用户
操作系统保留0号会话给一些系统服务及驱动使用,第1个登录系统的用户使用的 Session ID 为1,该用户执行的所有应用程序都在 Session 1 下执行。
Win7的任务管理器是可以设置查看会话 ID的,Win10单独多了用户TAB
Windows Station
Station 被认为是桌面和进程的安全边界
每个 Session 都会包含多个 Station,而每个 Station 又包含1个或多个 Desktop
多个 Station 中,只有名字叫 Winsta0 的 Station 才是交互式的 Station,也就是说只有它才能有 UI 并接受用户输入
每个 Session 都有一个叫 Winsta0 的用户交互Station
▲ Desktop 桌面
WinSta0 包含至少三个Desktop:登录(WinLogon)、屏保(ScreenSaver)、默认(Default)
同一时间只会有一个Desktop处于激活状态
用户准备登陆,WinLogon Desktop处于激活状态
用户登陆后 Default Desktop处于激活状态
屏保的时候,ScreenSaver处于激活状态
激活状态的Desktop才能接收用户输入,钩子才能获取其中的某个窗口消息。
▲ 原因
有了以上知识的铺垫,现在这个问题就很容易解释了。 当关闭远程桌面后,机器人所在的那台Windows会锁屏并切换到用户登陆桌面。用户登陆桌面自然无法完成那些人机交互。
【那么如何解决问题呢?】
▲解决方法
跳板机,相信有些人尝试过这个方法,让跳板机保持 mstsc长开。 这个方法可以解决问题。但就是管理复杂,远程连接也不能断,每次重启都要开好多好多远程桌面,也要多浪费一台虚拟机和不必要的网络带宽。(这个方法我就不解释了,如果需要,欢迎进群或者公众号私聊)
关闭远程桌面但不关闭Default Desktop方案
用Python写一个这样的脚本
把文件命名为CloseRDP.py 并存至 C:\Windows\System32。以管理员方式运行CMD , 然后键入CloseRDP.py。网上还有以下方案,Win10亲测不灵。
@%windir%\System32\tscon.exe 0 /dest:console
@%windir%\System32\tscon.exe 1 /dest:console
@%windir%\System32\tscon.exe 2 /dest:console
原文链接:https://www.51rpa.net/rpaedu/1027.html