能否通过vmware_vm_shell以管理员身份运行PowerShell?
问题
- 想了解Ansible模块
vmware_vm_shell是否可以以管理员身份运行PowerShell?因为部分需要在PowerShell中执行的命令必须提升至管理员权限。 - 不使用
win_shell或win_psexec的原因:希望在Windows虚拟机客户机中执行命令,且不依赖WinRM,无需通过IP地址访问虚拟机,而是借助vmtools进行连接。
用户提供的Playbook代码:
- name: Initiate New Disk vmware_vm_shell: hostname: "{{ lookup ('env', 'VMWARE_HOST' )}}" username: "{{ lookup ('env', 'VMWARE_USER' )}}" password: "{{ lookup ('env', 'VMWARE_PASSWORD' )}}" vm_id: "{{ vmname }}" vm_username: "administrator" vm_password: "password123" vm_shell: 'C:\Windows\System32\WindowsPowershell\v1.0\powershell.exe' vm_shell_args: '-ExecutionPolicy Bypass -command "Initialize-Disk -Number {{newdisk_osnum}}"' vm_shell_cwd: 'C:\Users\administrator\Desktop' wait_for_process: yes validate_certs: no delegate_to: localhost register: initdisk_shell
回答
vmware_vm_shell默认会用你指定的vm_username启动进程,但即使账号属于管理员组,普通启动的PowerShell也不会自动获得管理员权限。要实现管理员权限运行,有两种可靠方式:
方法1:用Start-Process强制提升权限
修改vm_shell_args,通过PowerShell的Start-Process参数触发UAC提升,同时保证进程等待逻辑正常。
修改后的Playbook片段:
- name: Initiate New Disk with Admin Privilege vmware_vm_shell: hostname: "{{ lookup ('env', 'VMWARE_HOST' )}}" username: "{{ lookup ('env', 'VMWARE_USER' )}}" password: "{{ lookup ('env', 'VMWARE_PASSWORD' )}}" vm_id: "{{ vmname }}" vm_username: "administrator" vm_password: "password123" vm_shell: 'C:\Windows\System32\WindowsPowershell\v1.0\powershell.exe' vm_shell_args: > -ExecutionPolicy Bypass -command " Start-Process powershell.exe -ArgumentList '-ExecutionPolicy Bypass -command \"Initialize-Disk -Number {{newdisk_osnum}}\"' -Verb RunAs -Wait " vm_shell_cwd: 'C:\Users\administrator\Desktop' wait_for_process: yes validate_certs: no delegate_to: localhost register: initdisk_shell
关键说明:
-Verb RunAs:触发UAC提升,以管理员身份启动新PowerShell进程-Wait:让主进程等待管理员进程执行完成,配合wait_for_process: yes确保Ansible等待整个命令结束- 嵌套引号用
\"转义,避免语法错误
额外注意事项
如果虚拟机UAC设置为最高级别,非交互式执行可能会被拦截。需要提前调整虚拟机UAC策略(比如通过组策略或注册表将UAC级别设为"不通知"),确保无交互提升权限生效。
内容的提问来源于stack exchange,提问作者anonimus
相关产品推荐
相关产品推荐

