如何通过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
相关产品推荐
相关产品推荐

