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

如何通过Ansible在Windows主机桌面会话运行带GUI的应用?

解决Ansible在Windows桌面会话打开窗口应用的问题

问题原因

PsExec的interactive模式在Windows 10 1809+、Server 2019+版本中,受会话隔离和UAC限制,无法直接将程序窗口显示到当前登录用户的桌面会话,因此即使返回退出码0,程序也只是在后台会话运行,看不到窗口。

可行解决方案

方案1:通过计划任务(schtasks)启动程序

利用Windows计划任务可以指定会话ID的特性,将程序绑定到用户的桌面会话运行:

- name: 获取登录用户的会话ID
  win_shell: query user | findstr "{{ logged_in_user }}" | awk '{print $3}'
  register: session_id_result

- name: 在用户桌面会话启动记事本
  win_shell: |
    # 创建临时计划任务,指定会话ID和用户凭据
    schtasks /create /tn "TempNotepadTask" /tr "notepad.exe" /sc once /st 00:00 /ru "{{ logged_in_user }}" /rp "{{ logged_in_pass }}" /sd 01/01/2000 /f /ses "{{ session_id_result.stdout.strip() }}"
    # 立即执行任务
    schtasks /run /tn "TempNotepadTask"
    # 等待程序启动
    timeout /t 2 /nobreak >nul
    # 删除临时任务
    schtasks /delete /tn "TempNotepadTask" /f
  args:
    executable: cmd.exe

方案2:通过PowerShell的Start-Process指定会话ID

如果目标主机安装了PowerShell 5.1及以上版本,可以直接用Start-Process的-SessionId参数绑定到用户会话:

- name: 获取登录用户的explorer进程会话ID
  win_powershell:
    script: |
      (Get-Process -Name explorer -IncludeUserName | Where-Object {$_.UserName -match "{{ logged_in_user }}"}).SessionId
  register: explorer_session_id

- name: 在用户桌面会话启动记事本
  win_powershell:
    script: |
      Start-Process -FilePath notepad.exe -WindowStyle Normal -SessionId {{ explorer_session_id.stdout.strip() }}

注意事项

  • 必须确保目标用户已登录到桌面会话(不能是远程断开状态,需存在活跃的桌面会话)
  • 若程序需要管理员权限,需在计划任务中添加/rl highest参数(schtasks命令),或在PowerShell中添加-Verb RunAs参数(需调整UAC策略避免弹窗)
  • 避免依赖PsExec的交互式模式:微软后续版本对该功能的限制会越来越严格,计划任务或PowerShell方法更稳定

内容的提问来源于stack exchange,提问作者mhm.sherpa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:54:39