使用Microsoft.Management.Infrastructure创建Hyper-V WMI类实例遇问题
解决Hyper-V WMI创建虚拟机时获取Msvm_VirtualSystemSettingData类定义的问题
问题本质
直接实例化CimInstance不会自动加载类的元数据(属性、方法等),而用GetInstance尝试获取"原型实例"的思路错误——GetInstance仅用于获取已存在的WMI实例,而非类模板。
正确实现方案
获取类元数据并创建实例
先通过CimSession.GetClass拉取Msvm_VirtualSystemSettingData的完整类定义,再基于该类创建实例,此时实例会包含所有属性的结构定义:
using Microsoft.Management.Infrastructure; // 建立本地Cim会话 using var session = CimSession.Create(null); // 获取目标类的完整定义 var cimClass = session.GetClass(@"root\virtualization\v2", "Msvm_VirtualSystemSettingData"); // 基于类定义创建实例,此时实例包含所有属性框架 var vmSettingData = new CimInstance(cimClass); // 验证属性数量(此时将返回该类的实际属性总数) Console.WriteLine(vmSettingData.CimClass.CimClassProperties.Count);
配置虚拟机核心属性
创建实例后,修改必要属性(如名称、内存),为后续创建虚拟机做准备:
// 设置虚拟机名称 vmSettingData.CimInstanceProperties["ElementName"].Value = "MyNewVM"; // 配置内存(单位:MB,示例为2GB) vmSettingData.CimInstanceProperties["MemoryAllocationUnits"].Value = 1024 * 1024; vmSettingData.CimInstanceProperties["VirtualQuantity"].Value = 2048;
调用DefineSystem创建虚拟机
获取Msvm_VirtualSystemManagementService实例,调用DefineSystem方法传入配置好的实例:
// 定位VirtualSystemManagementService实例 var serviceInstance = session.QueryInstances(@"root\virtualization\v2", "WQL", "SELECT * FROM Msvm_VirtualSystemManagementService").FirstOrDefault(); if (serviceInstance != null) { // 构造DefineSystem方法参数 var inParams = new CimMethodParametersCollection(); inParams.Add(CimMethodParameter.Create("SystemSettings", vmSettingData, CimType.Instance)); inParams.Add(CimMethodParameter.Create("ResourceSettings", new CimInstance[0], CimType.InstanceArray)); inParams.Add(CimMethodParameter.Create("HostResource", new string[0], CimType.StringArray)); // 执行创建操作 var result = session.InvokeMethod(@"root\virtualization\v2", serviceInstance, "DefineSystem", inParams); // 输出结果 if ((uint)result.ReturnValue.Value == 0) { Console.WriteLine("虚拟机创建成功"); } else { Console.WriteLine($"创建失败,错误码:{result.ReturnValue.Value}"); } }
重要提示
GetClass是获取WMI类元数据的标准方式,直接实例化CimInstance不会自动加载类结构。DefineSystem需要的是全新的配置实例,无需手动设置InstanceID,该属性由Hyper-V自动生成。- 程序必须以管理员权限运行,否则会触发权限不足的异常。
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

