ansible-playbook远程执行PowerShell脚本无法弹出窗口获取用户输入
问题根因
WinRM 远程执行默认运行在非交互的 Session 0 隔离环境中,该会话是Windows专门用来跑后台服务的会话,禁止弹出可见GUI窗口、也不支持直接获取交互式用户输入,属于系统安全机制限制,和脚本本身逻辑无关。
解决方案
方法1:允许交互窗口弹出到远程主机已登录用户桌面
如果确实需要窗口在远程主机当前登录用户的桌面弹出,按以下步骤修改即可:
- 首先修改
ex1.ps1的启动命令,指定登录用户的会话启动进程,强制创建可见窗口:
# 获取当前已登录的活跃用户会话ID $sessionId = (quser | Where-Object { $_ -match 'Active' } | ForEach-Object { $_.Split(' ', [System.StringSplitOptions]::RemoveEmptyEntries)[2] } | Select-Object -First 1) # 指定会话启动带窗口的PowerShell进程 Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-command C:\APPLICATION1.exe" -WindowStyle Normal -UseNewEnvironment -SessionId $sessionId
- 修改ansible playbook的配置,开启交互执行权限,模拟用户登录上下文:
- name: Run interactive PowerShell script win_powershell: script: | powershell.exe -ExecutionPolicy ByPass -File C:/Users/ex1.ps1 interactive: yes become: yes become_method: ansible.builtin.runas become_user: <远程主机登录的用户名>
注意:该方法要求远程主机必须有用户处于登录状态,且登录的用户名和
become_user配置一致,窗口才会正常弹出到该用户的桌面。
方法2:无需弹窗,直接通过Ansible传递输入参数
如果不需要可视化窗口,只是要给脚本或exe传递用户输入,可以直接将输入参数嵌入到Ansible执行逻辑中,绕过交互式输入要求,稳定性更高:
- 修改
ex1.ps1增加参数接收逻辑,替代原来的交互式输入代码:
param( [string]$InputParam1, [string]$InputParam2 ) # 把原来的读用户输入的逻辑替换为直接使用$InputParam1、$InputParam2变量 Start-Process -FilePath "C:\APPLICATION1.exe" -ArgumentList "/param1 $InputParam1 /param2 $InputParam2" -Wait -NoNewWindow
- 修改Ansible playbook直接传递参数即可:
- name: Run PowerShell script with parameters win_powershell: script: | powershell.exe -ExecutionPolicy ByPass -File C:/Users/ex1.ps1 -InputParam1 "你要传递的第一个值" -InputParam2 "你要传递的第二个值"
方法3:使用PsExec工具强制交互启动
如果以上方法不生效,可以借助微软官方的Sysinternals套件中的PsExec工具强制指定会话启动进程:
- 先把
PsExec.exe放到远程主机的可访问路径,修改ex1.ps1逻辑:
C:\Tools\PsExec.exe -i $sessionId -s powershell.exe -command "C:\APPLICATION1.exe"
其中
-i后面的数字是远程主机已登录用户的会话ID,一般活跃用户的会话ID为1,可通过quser命令查询确认。
内容的提问来源于stack exchange,提问作者Jeevan Kumar
相关产品推荐
相关产品推荐

