如何在以服务运行的Windows自托管Runner中启动UI应用?
问题:Windows自托管Runner以服务运行时无法显示UI应用界面
我有一台Windows自托管Runner,通过工作流启动记事本。当GitHub Runner以service方式运行时,执行工作流后,记事本进程在任务管理器中可见,但桌面无法显示其UI;而通过运行run.cmd启动GitHub Runner时,执行相同工作流可在桌面看到记事本UI。
针对GitHub服务已尝试的操作:
- 将服务登录账户改为当前用户,仍无法启动UI
- 尝试使用本地系统账户,并允许服务桌面交互,依旧无效
请问当GitHub Runner以服务激活时,是否有办法启动UI应用?
解决方案
当GitHub Runner以服务模式运行时,默认处于会话0隔离环境,这个环境和当前用户的交互式桌面会话(通常是会话1及以上)相互独立,这就是即便开启服务桌面交互也无法显示UI的核心原因。可以通过以下两种方式解决:
借助PsExec工具将UI程序启动到用户会话
- 先通过命令
query session获取当前登录用户的会话ID(比如输出中对应用户名的Session列数值)。 - 在工作流步骤中调用PsExec命令,指定会话ID启动UI程序,示例命令:
psexec.exe -i <你的会话ID> -u <当前用户名> -p <用户密码> notepad.exe - 注意:需要提前将PsExec工具放置在Runner可访问的路径,或添加到系统环境变量中。
- 先通过命令
改用交互式会话启动Runner
- 放弃服务模式,创建一个包含
run.cmd启动命令的批处理脚本,将其放入用户启动文件夹(路径:C:\Users\<你的用户名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup),让Runner随用户登录以交互式会话启动,这样工作流启动的UI程序会直接显示在用户桌面。 - 如果一定要保留服务模式,可基于Windows的
CreateProcessAsUserAPI编写工具,实现将UI程序启动到指定用户会话,不过这需要具备一定的Windows开发能力。
- 放弃服务模式,创建一个包含
补充说明:你之前尝试的修改服务登录账户、允许桌面交互无效,是因为服务即使用当前用户账户运行,仍处于会话0,和用户桌面所在的会话不互通。
内容的提问来源于stack exchange,提问作者New Developer
相关产品推荐
相关产品推荐

