环境: server2016

go version go1.17.1 windows/amd64

上代码:

package main

import (
	"fmt"
	"github.com/go-ole/go-ole"
	"github.com/go-ole/go-ole/oleutil"
	"log"
	"time"
)

func main() {
	ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)
	defer ole.CoUninitialize()
	vmname := "goer"
//连接WMI
	service := InitWmiV2()
//调用创建虚拟机方法
	NewVm(service, vmname)
	虚拟机开机
	//VmOn(service, vmname)
	//time.Sleep(time.Second)
	VmReBoot(service, vmname)
	//VmOFForce(service, vmname)
	//time.Sleep(time.Second)
	//VmOFForce(service, vmname)
	}

//连接WMI 服务
func InitWmiV1() *ole.IDispatch {

	unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator") //ISWbemObject

	if err != nil {
		log.Panic(err)
	}

	wmi, err := unknown.QueryInterface(ole.IID_IDispatch)
	if err != nil {
		log.Panic(err)
	}

	serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", nil, "/Root/Virtualization")
	if err != nil {
		log.Panic(err)
	}
	service := serviceRaw.ToIDispatch()
	return service
}
func InitWmiV2() *ole.IDispatch {

	unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator") //ISWbemObject

	if err != nil {
		log.Panic(err)
	}

	wmi, err := unknown.QueryInterface(ole.IID_IDispatch)
	if err != nil {
		log.Panic(err)
	}

	serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", nil, "/root/Virtualization/v2")
	if err != nil {
		log.Panic(err)
	}
	service := serviceRaw.ToIDispatch()
	return service
}

//创建虚拟机方法
func NewVm(service *ole.IDispatch, vmname string) {
	resultRaw, _ := oleutil.CallMethod(service, "ExecQuery", "SELECT * FROM Msvm_VirtualSystemManagementService")
	virtualSystemManagement, _ := oleutil.CallMethod(resultRaw.ToIDispatch(), "ItemIndex", 0)
	//fmt.Println(resultRaw)
	resultRaw, _ = oleutil.CallMethod(service, "ExecQuery", "SELECT * FROM Msvm_VirtualSystemSettingData")
	//fmt.Println(resultRaw)
	settingData, _ := oleutil.CallMethod(resultRaw.ToIDispatch(), "ItemIndex", 0)
	settingData.ToIDispatch().PutProperty("ElementName", vmname)
	// 创建2代虚拟机
	//settingData.ToIDispatch().PutProperty("VirtualSystemSubtype", "Microsoft:Hyper-V:SubType:2")
	settingData.ToIDispatch().PutProperty("Notes", []string{"必诚互联科技1\n这是一行说明;\n这是第二行", "这个是试试看"})
	settingData.ToIDispatch().PutProperty("ExternalDataRoot", "d:\\vms\\"+vmname)
	settingData.ToIDispatch().PutProperty("SnapshotDataRoot", "d:\\vms\\"+vmname)
	settingData.ToIDispatch().PutProperty("ConfigurationDataRoot", "d:\\vms\\"+vmname)
	settingData.ToIDispatch().PutProperty("SwapFileDataRoot", "d:\\vms\\"+vmname)

	settingData_, _ := oleutil.CallMethod(settingData.ToIDispatch(), "GetText_", 2)

	r, e := oleutil.CallMethod(virtualSystemManagement.ToIDispatch(), "DefineSystem", settingData_)
	fmt.Println(r.Value())
	fmt.Println(e)
}