公司大堂有一块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程序必须处于运行状态哈!