环境: 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)
}