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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:06:08