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

手动运行正常但Windows服务失效的Python截图脚本问题

问题分析与解决方案

Windows服务默认运行在Session 0隔离环境,和用户登录后的桌面Session(通常是Session 1及以上)完全分离,这是导致截图/键鼠捕获功能失效的核心原因——这类操作需要访问用户桌面上下文,而Session 0没有桌面环境。另外服务的运行账户、工作目录、权限也和手动运行时不同,以下是针对性解决步骤:

1. 配置服务允许桌面交互并使用用户账户运行

  • 打开NSSM管理界面,找到目标服务:
    • 切换到Log On标签,选择This account,输入你手动运行exe时使用的Windows账户名和密码(确保该账户有管理员权限)
    • 切换到Service标签,勾选Allow service to interact with desktop选项
  • 重启服务,此时服务会在用户登录的Session中运行,拥有桌面访问权限

2. 修正服务工作目录

Windows服务默认工作目录是C:\Windows\System32,如果你的exe依赖相对路径保存截图或读取配置,会找不到对应位置:

  • 在NSSM的Application标签中,将Working Directory设置为你的exe文件所在的文件夹(比如D:\ScreenshotTool)

3. 验证文件权限

确保截图保存目录和exe所在文件夹对服务运行账户有读写权限:

  • 右键目标文件夹→属性→安全→编辑→添加,输入服务运行的账户名,勾选读取和写入权限,点击确定

4. 加日志排查具体故障

在Python脚本中添加详细日志,定位到底是截图、网络发送还是文件保存环节出错:

import logging
import traceback

# 指定日志绝对路径,避免服务工作目录问题
logging.basicConfig(
    filename='C:\\ScreenshotServiceLogs\\service.log',
    level=logging.DEBUG,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

try:
    # 键鼠捕获、截图逻辑
    logging.info("截图捕获成功")
    
    # socket发送逻辑
    logging.info("截图发送成功")
except Exception as e:
    logging.error(f"运行出错: {str(e)}")
    logging.error(traceback.format_exc())

打包exe后查看日志文件,就能明确故障点(比如是否是截图库无法获取桌面、是否是网络权限受限等)

5. 替代方案:改用开机启动项

如果不需要在用户未登录时运行程序,完全可以放弃Windows服务,改用开机启动项:

  • 右键你的exe文件→创建快捷方式
  • 将快捷方式移动到C:\Users\[你的用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup文件夹
  • 用户登录后程序会自动启动,环境和手动运行完全一致,不会有Session隔离问题

内容的提问来源于stack exchange,提问作者İbrahim Mazlum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:52:16