Azure无界面VM关闭RDP后Python截图失败的解决方法咨询
解决Azure虚拟机关闭RDP后无法截图的问题
问题原因
关闭RDP连接后,Azure默认会终止当前用户的交互式桌面会话,pyautogui这类依赖活跃桌面上下文的工具会因无可用屏幕环境,抛出OSError: screen grab failed错误。
解决方案
方案1:配置虚拟机保持RDP会话活跃
通过本地组策略修改会话超时设置,避免断开RDP时注销会话:
- 运行
gpedit.msc打开本地组策略编辑器 - 导航至
计算机配置 > 管理模板 > Windows组件 > 远程桌面服务 > 远程桌面会话主机 > 会话时间限制 - 分别修改以下两项为已禁用:
- 设置断开连接的会话的时间限制
- 设置活动但空闲的远程桌面服务会话的时间限制
- 运行
gpupdate /force使策略生效
方案2:以系统账户身份运行脚本
系统账户拥有独立的桌面会话,不会随用户RDP断开而终止,可通过任务计划程序实现:
- 打开任务计划程序,创建新任务
- 在「常规」选项卡:
- 勾选「不管用户是否登录都要运行」
- 勾选「使用最高权限运行」
- 在「触发器」选项卡:添加触发器(如「开机时」或定时触发)
- 在「操作」选项卡:
- 选择「启动程序」,程序路径填
python.exe的完整路径(如C:\Python39\python.exe) - 添加参数为你的脚本完整路径(如
C:\scripts\screenshot.py)
- 选择「启动程序」,程序路径填
- 保存任务,启动后即可脱离用户RDP会话运行
适配系统账户的脚本修改
系统账户的桌面路径与普通用户不同,建议将截图保存到固定路径:
import os import pyautogui import time from datetime import datetime def take_screenshot(): # 自定义固定保存路径,需确保路径存在 save_dir = 'C:\\screenshots' if not os.path.exists(save_dir): os.makedirs(save_dir) timestamp = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') screenshot_path = os.path.join(save_dir, f'{timestamp}.png') screenshot = pyautogui.screenshot() screenshot.save(screenshot_path) print(f"Screenshot saved as '{screenshot_path}'") while True: take_screenshot() time.sleep(10)
方案3:使用虚拟显示适配器(适用于无GPU的虚拟机)
部分Azure虚拟机支持添加虚拟显示适配器,确保无物理/远程显示器连接时仍保持桌面会话:
- 登录Azure门户,进入目标虚拟机的「配置」页面
- 在「显示」选项中,启用「虚拟显示适配器」
- 重启虚拟机后生效
内容的提问来源于stack exchange,提问作者Ali Kaissi
相关产品推荐
相关产品推荐

