Hyper-V 无法将现有的 vhd 文件附加到新创建的虚拟机?

Hyper-V 无法将现有的 vhd 文件附加到新创建的虚拟机?

我的目标是以编程方式创建一个新的虚拟机并将现有的 vhdx 文件附加到该机器。我的程序的唯一输入是虚拟机名称和 VHDX 路径。我使用 Hyper-V WMI 提供程序和虚拟化 V2 命名空间来实现这一点。基本上,我正在实现文章作为脚本。正如在链接,我首先添加一个合成驱动器,然后尝试附加 vhdx 文件。

我能够成功创建虚拟机并向机器添加合成驱动器。但是,当我尝试添加硬盘 vhdx 文件时,出现以下错误。 'New Virtaul Machine' failed to add resources.(Virtual machine ID ...).作业错误代码为 32768,作业状态为 10,这正好对应于“失败”。

这是我用来连接 vhdx 文件的代码。

//Add VHD
    ManagementObject^ hardDisk = GetResourceAllocationsettingDataDefault(scope, 31, "Microsoft:Hyper-V:Virtual Hard Disk", "-");
    hardDisk = (ManagementObject^)hardDisk->Clone();
    array<String^>^ connection = gcnew array<String^>(1);
    connection[0]="E:\\test.vhdx"; //Path to *.vhd file     

    hardDisk["Parent"] = synthetic->Path->Path; //WMI path-> This is the path of the synthetic drive that I added in the previous step.
    hardDisk["HostResource"] = connection;

    array<String^> ^ HDs = gcnew array<String^>(1);
    HDs[0] = hardDisk->GetText(TextFormat::WmiDtd20);

    ManagementBaseObject^ VHDinParams = vmtoCreate->GetMethodParameters("AddResourceSettings");
    VHDinParams["AffectedConfiguration"] = settings->Path->Path;
    VHDinParams["ResourceSettings"] = HDs;

    ManagementBaseObject^ VHDoutParams = vmtoCreate->InvokeMethod("AddResourceSettings", VHDinParams, nullptr);

有关方法 GetResourceAllocationsettingDataDefault,请参阅链接。当我分析 VHDoutParams 变量以获取错误消息和错误代码时,我只得到以下详细信息。

Error description: 'New Virtaul Machine' failed to add resources.(Virtual machine ID ...). 
Error Code: 32768(Failed)
Job State: 10

我不知道我错过了什么。我以管理员身份在提升模式下运行该程序。我没有在 Hyper-V 主机中安装防病毒软件。我也彻底搜索了互联网,但找不到任何有用的信息。我错过了什么或做错了什么?

答案1

我自己解决了这个问题。显然,在添加硬盘时,我应该提供从上一次调用 AddResourceSettings 的输出参数中获得的合成驱动器的路径,而不是输入参数。在第一次调用 AddResourceSettings 添加合成驱动器后,我应该执行以下操作:

ManagementObject^ addedSynthetic;
    if (syntheticoutParams["ResultingResourceSettings"] != nullptr)
    {           
        addedSynthetic = gcnew ManagementObject(((array<String^>^)syntheticoutParams["ResultingResourceSettings"])[0]);
        addedSynthetic->Get();
    }

然后,我应该将“addedSynthetic”的路径作为父级提供给第二个调用。

硬盘["父级"] = AddedSynthetic->Path->Path;

相关内容