小编对于这篇文章一直犹豫要不要发,内容太干了,太技术了,不知道是不是能贴合所有人口味。居实施过大型企业 RPA 项目的小伙伴们,肯定会遇到这样的问题,当机器人部署在虚拟机上,然后关闭 mstsc 之后,虚拟机 windwows 会失去 GUI 交互能力,导致键盘,鼠标之类操作通通失效。
啥?有些玩 RPA 的还没经历这个步骤?我举个最简单的 RPA 例子:
让 RPA 机器人打开 Baidu , 鼠标点一下输入栏,输入”51RPA”,点“百度一下”按钮
相信我们在正常人来做这件事情就和玩一样简单,但当你让这个把 RPA 部署在虚拟机,并且关闭远程桌面连接后,你发现 RPA 机器人只干了一件事,那就是打开了 Baidu,后面的几步都失效了。
【必备知识】
如果还想了解的更深入,请参见以下链接:
https://blogs.technet.microso…(Mark Russinovich 大拿的文章)
https://docs.microsoft.com/zh…(微软官方文章)
首先需要知道 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:WindowsSystem32。以管理员方式运行 CMD , 然后键入 CloseRDP.py。网上还有以下方案,Win10 亲测不灵。
@%windir%System32tscon.exe 0 /dest:console
@%windir%System32tscon.exe 1 /dest:console
@%windir%System32t
scon.exe 2 /dest:console