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

Ansible通过winrm执行NSIS静默卸载命令不生效该如何解决?

问题核心原因

  • NSIS格式的卸载程序默认会拉起子进程执行实际卸载操作,父进程启动子进程后会立即退出,Ansible默认仅跟踪父进程状态,拿到返回码0时就认为任务执行完成,此时子进程要么还未执行完,要么因为WinRM会话结束被系统自动回收终止,导致实际卸载未完成。
  • 卸载C:\Program Files目录下的程序需要管理员权限,WinRM远程连接默认会受UAC限制,即使用管理员账号登录也默认持有限制令牌,没有修改系统目录的权限。

修复后的正确任务写法

- name: 静默卸载my_app
  win_shell: start /wait "" "C:\Program Files\my_app\Uninstall.exe" /S
  args:
    executable: cmd
  # 开启权限提升获取管理员权限
  become: yes
  become_method: runas
  become_user: SYSTEM
  # 可选:增加校验逻辑确保卸载完成
  register: uninstall_res
  retries: 3
  delay: 5
  until: lookup('ansible.windows.win_stat', path='C:\\Program Files\\my_app').exists == False

参数说明

  • start /wait "":start命令的/wait参数会等待卸载程序启动的所有子进程全部执行完成后再退出,避免父进程提前退出导致卸载逻辑中断,第一个空引号是必填的窗口标题参数,避免路径包含空格时命令解析错误。
  • become相关配置:开启权限提升,使用SYSTEM账号执行卸载操作,避开UAC远程会话限制,确保有修改C:\Program Files目录的权限。如果SYSTEM权限执行异常,也可以替换为目标机器的本地管理员账号,同时配置become_password参数传入对应账号密码。

内容的提问来源于stack exchange,提问作者linuxfever

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:06:04