【问题标题】:Create VM with WMI in c#在 C# 中使用 WMI 创建 VM
【发布时间】:2017-03-27 20:37:50
【问题描述】:

我正在尝试使用 WMI 在 Hyper-V 中创建 VM。

        ManagementClass virtualSystemManagementService = 
            new ManagementClass(@"root\virtualization\v2:Msvm_VirtualSystemManagementService");

        ManagementBaseObject inParams = 
            virtualSystemManagementService
                .GetMethodParameters("DefineSystem");

        // Add the input parameters.
        ManagementClass virtualSystemSettingData = 
            new ManagementClass(@"root\virtualization\v2:Msvm_VirtualSystemSettingData")
        {
            ["ElementName"] = "Test"
        };

        inParams["SystemSettings"] = 
            virtualSystemSettingData.GetText(TextFormat.CimDtd20);

        // Execute the method and obtain the return values.
        ManagementBaseObject outParams = 
            virtualSystemManagementService
                .InvokeMethod("DefineSystem", inParams, null);

对 InvokeMethod 的调用会引发 System.Management.MangementException -“方法参数无效。

我将此代码基于https://blogs.msdn.microsoft.com/virtual_pc_guy/2013/06/20/creating-a-virtual-machine-with-wmi-v2/

我确实意识到使用 powershell 真的很容易,但我正在尝试了解 WMI 方面的工作原理。

【问题讨论】:

  • 您是否设法向虚拟服务器添加了 HDD 或一些内存?

标签: c# wmi hyper-v


【解决方案1】:

使用带有 C# 的 WMI 创建虚拟机的基本工作流程:

您错过了创建 VirtualSystemSettingData 的实例和获取 VirtualSystemManagment Service 的实例。 System.Management.MangementException - "Invalid method Parameter(s) 当您在 类而不是对象上调用调用方法时抛出异常!

  1. 创建 VirtualSystemSettingData 类
  2. 添加属性
  3. 创建新的 VirtualSystemSettingData 实例
  4. 转换为文本
  5. 传递给参数
  6. 创建 VirtualSystemManagementService 类
  7. 获取现有的 VirtualSystemManagementService 实例
  8. 调用方法

例子:

         ManagementClass virtualSystemManagementServiceClass =
            new ManagementClass(@"root\virtualization\v2:Msvm_VirtualSystemManagementService");

        ManagementBaseObject inParams =
            virtualSystemManagementServiceClass
                .GetMethodParameters("DefineSystem");

        // Add the input parameters.
        ManagementClass virtualSystemSettingDataClass =
            new ManagementClass(@"root\virtualization\v2:Msvm_VirtualSystemSettingData")
            {
                ["ElementName"] = "Test"
            };

        // Create Instance of VirtualSystemSettingData
        ManagementObject virtualSystemSettingData = virtualSystemSettingDataClass.CreateInstance();

        inParams["SystemSettings"] =
            virtualSystemSettingData.GetText(TextFormat.CimDtd20);

        // Get Instance of VirtualSystemManagmentService
        ManagementObject virtualSystemManagementService = null;
        foreach (ManagementObject instance in virtualSystemManagementServiceClass.GetInstances())
        {
            virtualSystemManagementService = instance;
            break;
        }

        // Execute the method and obtain the return values.
        ManagementBaseObject outParams = virtualSystemManagementService.InvokeMethod("DefineSystem", inParams, null);

【讨论】:

    【解决方案2】:

    您需要创建一个 msvm_VirtualSystemSettingData 实例。

       ManagementObject newInstance = new ManagementClass(scope, new ManagementPath("Msvm_VirtualSystemSettingData"), null).CreateInstance();
       newInstance["ElementName"] = vmName;
       inParameters["SystemSettings"] = newInstance.GetText(TextFormat.CimDtd20); 
    

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      相关资源
      最近更新 更多