小编对于这篇文章一直犹豫要不要发,内容太干了,太技术了,不知道是不是能贴合所有人口味。居实施过大型企业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