远程桌面最小化后停止工作的解决方案

在 本地计算机上,关闭所有打开的远程桌面会话。
启动注册表编辑器(regedit.exe)。
导航到以下注册表项之一,具体取决于您是仅为当前用户还是计算机上的所有用户修改远程桌面设置:
HKEY_CURRENT_USER\Software\Microsoft \Terminal Server Client
HKEY_LOCAL_MACHIN\Software\Microsoft \Terminal Server Client
创建名为RemoteDesktop_SuppressWhenMinimized的DWORD值并将其设置为2:

在这里插入图片描述
关闭注册表编辑器然后重启即可。

断开mstsc远程后RPA不能正常运行的解决方案

1.查看sessionID.

以管理员身份打开cmd,输入

>query session

注意:每次远程连接session ID是可能改变的,一定要每次都查询一下

图中查询到的id是2

2.使用 tscon 命令切换console模式
tscon [session ID] /password:[user password] /dest:console #填入自己的用户密码
tscon 2 /password:* /dest:console#通用型密码,将2替换成自己查询到的id
tscon 2 /dest:console#无密码则可使用这一行命令,将2替换成自己查询的id

以上三行选择适配自己的,选择其一就可以
在这里插入图片描述
你的远程会话(ID=2)现在和本地控制台绑定了,这意味着你现在可以安全地断开远程连接,会话里的 RPA 机器人会在后台继续运行,不会被终止。
注意:每次远程都会重新切换回RDP模式,所以每次远程之后都必须使用这个方式退出远程在可以,不能直接关闭远程连接。

3.根据脚本实现自动绑定本地控制台
import re
import getpass
import subprocess
import time


def getSessionID() -> int:
    """
    获取当前用户的sessionID
    :return:  当前用户的sessionID   # type:int
    """
    # 1 获取当前Windows用户的用户名
    win_user_id = getpass.getuser()
    # 2 运行命令 query session 命令
    res = subprocess.Popen("query session", shell=True, stdout=subprocess.PIPE)
    # 3 拿到命令的输出(输出的内容需要用.decode('gbk')转换字符类型)
    ''' 输出Demo:
      会话名              用户名                   ID  状态     类型         设备 
      services                                    0  断开                      
     >console            User1                    5  运行中                    
      7a78855482a04...                        65536  侦听                      
      rdp-tcp                                 65537  侦听                      
    '''
    res_str_list = [i.decode('gbk') for i in res.stdout.readlines()]
    # 4 根据 本机会话前面是有一个 > 取到本机会话哪一行数据
    this_session = [i.split() for i in res_str_list if i[0] == ">"]
    if not this_session:   # 如果拿不到当前会话
        raise Exception("The session cannot be obtained because the '>' cannot be matched.")
    # 5 通过正则表达式提取ID (BTW: 希望你的Windows用户名不要那么长,不然可能会变成省略号,这里就不好提取了)
    match_str_list = re.findall("{}\d+".format(win_user_id), "".join(this_session[0]))
    if not match_str_list:  # 如果拿不到当前会话
        raise Exception("The session cannot be obtained because the username: {} cannot be matched.".format(win_user_id))
    return int(match_str_list[0].replace(win_user_id, ""))


def runSwitchConsoleModeCMD(session_id, password:str):
    """
    运行切换console session命令
    :param session_id:      当前用户的sessionID
    :param password:        当前用户的密码
    """
    session_id = int(session_id)    # 转成int类型,主要是为了不是int或者不使int的字符串报错
    # 1 运行tscon命令切换console模式  # 此处已修改感谢评论区额的小伙伴
    res = subprocess.Popen("tscon {} /password:* /dest:console".format(session_id), shell=True,
                           stdout=subprocess.PIPE, stdin=subprocess.PIPE)
    # 2 等一定时间然后输入密码
    time.sleep(2)
    res.stdin.write(password.encode('gbk'))


if __name__ == '__main__':
    # 控制台输入密码
    pwd = input("Enter this windows user's password: ")
    # 写死密码
    pwd = pwd or "XXXXXXXXXXXXXXXXXX"
    try:
        runSwitchConsoleModeCMD(getSessionID(), pwd)
    except Exception as e:
        print(e)
        input("Press enter to exit...")


这是python脚本

1.选一个合适的存放位置

推荐放在容易找到、无中文 / 空格的路径下,避免脚本运行出错,比如:

D:\RPA_Tools\close_remote.py

具体操作:
在目标路径下新建文本文档叫脚本代码复制进去。
点击「文件→保存」,路径选 D:\RPA_Tools\,文件名填 close_remote.py,保存类型选「所有文件」(避免变成.txt 格式)。
在这里插入图片描述

2.打包为EXE
  • 给远程服务器装 Python(如果没装)
    下载 Python 安装包:python官网
    勾选「Add Python to PATH」
    这是最重要的一步,这样你才能在 CMD 里直接运行 python 和 pip 命令。
    选择「Customize installation」
    可以自定义安装路径(推荐装在 D:\Python314,避免 C 盘空间不足)。
    完成后新打开一个以管理员运行的cmd,输入python --version,会显示python版本代表成功
  • 安装 PyInstaller
    以管理员身份打开 CMD,执行:
pip install pyinstaller#下载
cd /d D:\RPA_Tools#切换到脚本所在目录
pyinstaller -F -w --uac-admin close_remote.py#打包成 EXE

dist目录下的close_remote为退出程序,将该程序设置快捷方式后,点击即可安全退出
在这里插入图片描述
在这里插入图片描述
该文章内容主要记录本人实现过程
该方法原博为:原博链接

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐