You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure无界面VM关闭RDP后Python截图失败的解决方法咨询

解决Azure虚拟机关闭RDP后无法截图的问题

问题原因

关闭RDP连接后,Azure默认会终止当前用户的交互式桌面会话,pyautogui这类依赖活跃桌面上下文的工具会因无可用屏幕环境,抛出OSError: screen grab failed错误。

解决方案

方案1:配置虚拟机保持RDP会话活跃

通过本地组策略修改会话超时设置,避免断开RDP时注销会话:

  • 运行gpedit.msc打开本地组策略编辑器
  • 导航至计算机配置 > 管理模板 > Windows组件 > 远程桌面服务 > 远程桌面会话主机 > 会话时间限制
  • 分别修改以下两项为已禁用:
    • 设置断开连接的会话的时间限制
    • 设置活动但空闲的远程桌面服务会话的时间限制
  • 运行gpupdate /force使策略生效

方案2:以系统账户身份运行脚本

系统账户拥有独立的桌面会话,不会随用户RDP断开而终止,可通过任务计划程序实现:

  1. 打开任务计划程序,创建新任务
  2. 在「常规」选项卡:
    • 勾选「不管用户是否登录都要运行」
    • 勾选「使用最高权限运行」
  3. 在「触发器」选项卡:添加触发器(如「开机时」或定时触发)
  4. 在「操作」选项卡:
    • 选择「启动程序」,程序路径填python.exe的完整路径(如C:\Python39\python.exe)
    • 添加参数为你的脚本完整路径(如C:\scripts\screenshot.py)
  5. 保存任务,启动后即可脱离用户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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:16:04