You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

远程Windows通过SSH(paramiko)执行PyAutoGUI等UI脚本异常求助

解决远程Windows通过SSH运行PyAutoGUI/Lackey时的屏幕捕获故障

我来帮你搞定这个头疼的问题——这种远程Windows上的UI自动化工具失效的情况,本质是Windows的会话隔离机制在搞鬼,跟PyAutoGUI、Lackey这类依赖活跃桌面会话的工具完全不兼容,而Mac的会话模型没有这个限制,所以那边能正常跑。下面给你分步骤拆解解决方案:

核心原因分析

Windows的SSH服务默认运行在后台会话(Session 0),这个会话没有实际的桌面界面;而PyAutoGUI的locateOnScreenscreenshot,还有Lackey的截图功能,都需要绑定到用户登录的交互式桌面会话(Session 1及以上)。当你通过SSH直接触发脚本时,工具找不到可用的桌面会话,就会抛出OSError: screen grab failed,或者只能获取到黑屏、低分辨率的虚拟屏幕。

可行解决方案

1. 先保持活跃的RDP会话,再用SSH运行脚本

这是最直接有效的方法,原理是让远程Windows保持一个有桌面的活跃会话:

  • 先用RDP(远程桌面)登录你的Windows机器,登录后不要关闭窗口,哪怕最小化也可以(别断开会话);
  • 接着通过SSH连接这台机器,运行你的UI脚本。此时PyAutoGUI/Lackey会自动绑定到RDP的活跃桌面会话,就能正常捕获屏幕、定位元素了。

额外优化:防止RDP会话超时断开
打开tsconfig.msc(远程桌面会话主机配置),找到对应的连接,右键选择「属性」:

  • 在「会话」选项卡,把「结束已断开的会话」设为「从不」;
  • 「活动会话限制」设为「无限制」,避免会话自动断开导致脚本失效。

2. 配置SSH服务允许与桌面交互

如果不想依赖RDP,可以调整OpenSSH服务的运行模式:

  • 打开services.msc(服务管理器),找到「OpenSSH SSH Server」;
  • 右键选择「属性」,切换到「登录」选项卡,勾选「允许服务与桌面交互」;
  • 重启OpenSSH服务,之后通过SSH运行脚本时,工具应该能访问到用户桌面会话。

注意:这个方法在Windows 10/11家庭版上可能受限,专业版及以上版本更稳定。

3. 改用无桌面依赖的UI自动化工具

如果上面两种方法都不适用,可以换用不需要屏幕截图的工具,比如pywinauto——它直接通过Windows API操作控件,不需要依赖桌面会话:

from pywinauto import Application

# 连接到目标应用
app = Application().connect(title_re="你的应用窗口标题.*")
# 点击按钮(示例)
app.window(title_re="你的应用窗口标题.*").button(name="确认").click()

4. 修复Lackey的黑屏/分辨率问题

如果用Lackey,黑屏和分辨率降低是因为SSH会话默认的虚拟屏幕分辨率太低:

  • 可以在RDP连接时用命令行指定分辨率:mstsc.exe /v:你的远程IP /w:1920 /h:1080,强制使用1920*1080的分辨率;
  • 或者在远程Windows的「显示设置」里,把屏幕分辨率固定为1920*1080,确保会话启动时用这个分辨率。

内容的提问来源于stack exchange,提问作者Nandish

火山引擎 最新活动