Python3 实现 > 远程桌面访问退出后被访问电脑显示屏自动切换回本地桌面

      公司大堂有一块LED显示屏长期播放宣传内容,播放用的电脑放置在附近弱电间内,每次更改内容都需要跑去弱电间,实在不方便。正好播放电脑已连接至公司内网,就想使用Windows自带的远程桌面来远程更换宣传内容。

    遗憾的是远程桌面访问时,显示屏将切换成登录界面,退出远程桌面后,登录界面无法自动切换回桌面,远程更换宣传内容算是失败了。

    失败了?怎么可能?

    经过网上查找资料,加上几天的研究还是想到了解决办法,再加上自己自学了Python,就用Python写了个小程序,现分享给有需要的朋友,希望能帮到各位。如有更好的方法,还请评论区留言。我们一起进步!!!

程序代码如下(复制保存为py文件即可):

import subprocess
import time
import ctypes
import sys

def run_as_admin():
    """
    以管理模式运行Python文件
    """
    try:
        is_admin = bool(ctypes.windll.shell32.IsUserAnAdmin())
    except:
        is_admin = False

    if not is_admin:
        ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
        exit()


def get_sessions():
    """
    获取当前Windows操作系统的全部会话信息
    :return: [[session_name, session_id, session_status], ...], 如下所示:
            [
                ['services', '0', '断开'],
                ['>console', '1', '运行中'],
                ['rdp-tcp', '65536', '侦听']
            ]
    """

    # 创建子进程,执行“query session”命令,并捕获输出的内容
    process = subprocess.run(['query', 'session'], capture_output=True)

    # 获取标准输出原始数据,解码,并以每行数据转换成列表
    # 原始数据如下:
    #  会话名            用户名                   ID  状态    类型        设备
    #  services                                    0  断开
    # >console           Frank                     1  运行中
    #  rdp-tcp                                 65536  侦听
    # 转换后的数据:
    # [
    #     ['会话名', '用户名', 'ID', '状态', '类型'],
    #     ['services', '0', '断开'],
    #     ['>console', 'Frank', '1', '运行中'],
    #     ['rdp-tcp', '65536', '侦听'],
    #     []
    # ]
    original_data = process.stdout.decode('ansi').split('\r\n')
    sessions = []
    for x in original_data:
        temp = []
        x_list = x.split(' ')
        empty_quantity = x_list.count('')
        for number in range(empty_quantity):
            if x_list[number] != '':
                temp.append(x_list[number])
        sessions.append(temp)

    # 去头 => ['会话名', '用户名', 'ID', '状态', '类型'],去尾 => []
    sessions.pop(0)
    sessions.pop(-1)

    # 再加工,仅仅保留 [session_name, session_id, session_status]
    for session in sessions:
        if len(session) == 4:
            session.pop(1)

    # 返回经过加工处理的会话列表数据
    return sessions


def get_current_session():
    """
    获取当前正在运行中的session信息
    :return: [session_name, session_id, session_status]
    """
    # 获取全部会话信息
    sessions = get_sessions()
    
    # 遍历获取会话名中带'>'的会话,
    for session in sessions:
        if session[0][0] == '>':
            return session


if __name__ == '__main__':

    # 以管理员模式运行当前程序
    run_as_admin()

    # 监测远程会话是否已退出,若退出则将会话切换成本地会话。
    # 远程桌面未关闭前,session_name显示如“>rdp-tcp#2”,
    # 远程桌面退出后,session_name显示成'>',
    while True:
        # 获取当前session信息
        session_name, session_id, session_status = get_current_session()

        # 判断远程桌面是否已断开,断开就切换成本地会话
        if session_name == '>':
            subprocess.run(['tscon', session_id, '/dest:console'])

        # 每隔3秒监测1次
        time.sleep(3)

     程序运行时还需要2个程序文件,都是Windows自带的,可以在Windows安装目录中找到。因我使用的操作系统是Windows 8.1,且系统安装在C盘,故可以在C:\Windows\System32下找到,第一个程序文件为query.exe(C:\Windows\System32\query.exe),第二个程序文件为tscon.exe(C:\Windows\System32\tscon.exe)。两个程序文件必须复制到当前python程序文件的同一目录内,在Windows安装目录中会执行出错,也不知是何原因造成。

    好了,你现在已有3个文件,这是程序能正常使用的全部文件,赶紧试试吧!

    经测试,将其复制到Windows 10下也可以正常使用哦!

    不好意思!还有最重要的一点,远程桌面时此python程序必须处于运行状态哈!

你可能感兴趣的:(Python,python,开发语言)