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

如何修改vRA/vRO PowerCLI脚本实现VM关机状态启用VBS

vRO环境VBS启用脚本修正方案

你之前修改脚本无法正常启停虚拟机的核心原因是 vRO对接vCenter的所有操作默认是异步执行,触发关机/配置/开机操作后如果不等待任务完成、不校验实际状态就执行下一步,会因为时序错位导致操作失败。以下是可直接上线使用的修正版本:

修正后完整脚本

// Input: inputProperties from vRA
var enableVBS = inputProperties.customProperties.enableVBS
if (enableVBS == "true") { 
  var name = inputProperties.resourceNames[0]
  var vms = VcPlugin.getAllVirtualMachines(null, name)
  var vm = vms[0]
  // 记录虚拟机初始电源状态,避免给原本关机的VM误开机
  var originalPowerState = vm.runtime.powerState
  var task = null
  var waitLoop = 0

  // 第一步:VM处于开机状态时先执行关机
  if (originalPowerState === VcVirtualMachinePowerState.poweredOn) {
    // 优先走VMware Tools软关机,无Tools环境可替换为 vm.powerOffVM_Task() 强制断电
    vm.shutdownGuest()
    // 轮询等待关机完成,最长等待300秒,可按需调整超时阈值
    while (vm.runtime.powerState !== VcVirtualMachinePowerState.poweredOff && waitLoop < 60) {
      System.sleep(5000)
      waitLoop++
      // 刷新VM最新状态
      vm = VcPlugin.getVirtualMachineByMor(vm.mor)
    }
    if (vm.runtime.powerState !== VcVirtualMachinePowerState.poweredOff) {
      throw "虚拟机关机超时,VBS配置流程终止,请手动检查VM状态"
    }
  }

  // 第二步:关机状态下执行VBS相关配置
  var bootOpts = new VcVirtualMachineBootOptions()
  var flags = new VcVirtualMachineFlagInfo()
  var spec = new VcVirtualMachineConfigSpec()

  bootOpts.efiSecureBootEnabled = true;
  flags.vbsEnabled = true;
  flags.vvtdEnabled = true;

  spec.firmware = VcGuestOsDescriptorFirmwareType.efi;
  spec.nestedHVEnabled = true;
  spec.bootOptions = bootOpts;
  spec.flags = flags;

  // 提交重配置任务并等待完成
  task = vm.reconfigVM_Task(spec)
  task.waitForEnd()
  if (task.info.state !== VcTaskInfoState.success) {
    throw "VBS配置失败,错误详情:" + task.info.error.msg
  }

  // 第三步:如果VM初始状态为开机,配置完成后自动开机
  if (originalPowerState === VcVirtualMachinePowerState.poweredOn) {
    task = vm.powerOnVM_Task(null)
    task.waitForEnd()
    if (task.info.state !== VcTaskInfoState.success) {
      throw "VBS配置完成但虚拟机开机失败,错误详情:" + task.info.error.msg
    }
  }
}

关键逻辑说明

  • 初始状态留存:脚本启动时首先记录VM原始电源状态,不会对本来就处于关机状态的VM执行多余开机操作
  • 全链路状态校验:关机环节采用轮询机制确认VM真正进入关机状态,重配置、开机环节等待vCenter任务返回成功结果后再进入下一步,彻底解决异步任务时序问题
  • 异常抛出:每个环节超时/失败时直接抛出明确错误信息,方便vRA工作流定位故障点

前置注意事项

  • 目标虚拟机硬件版本需≥14,操作系统版本需为Windows 10 1709/Windows Server 2016及以上,否则VBS功能无法正常生效
  • 软关机依赖虚拟机内正常运行的VMware Tools,如环境内无统一部署Tools,可将软关机逻辑替换为vm.powerOffVM_Task()强制断电,注意强制断电可能导致系统文件损坏
  • 如环境内有防病毒/EDR类软件拦截软关机指令,可适当调长关机等待超时阈值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:54:22