Моя цель - программно создать новую виртуальную машину и прикрепить к ней существующий файл vhdx. Единственными входными данными для моей программы являются имя виртуальной машины и путь к VHDX. Я реализую это с помощью Hyper-V WMI Provider и Virtualization V2 namespace. В основном я реализую то, что дано в этот статья в виде сценария. Как упоминалось в этот ссылку, я сначала добавляю синтетический диск, а затем пытаюсь прикрепить файл 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. Я также тщательно поискал в Интернете, но не нашел ничего полезного. Что я упускаю или делаю не так?
Я сам решил эту проблему. AP родственно, добавляя жесткий диск, я должен указать путь синтетического диска, который я получил из выходных параметров предыдущего вызова AddResourceSettings, а не входной параметр. После первого вызова AddResourceSettings для добавления синтетического диска я должен сделать следующее:
ManagementObject^ addedSynthetic;
if (syntheticoutParams["ResultingResourceSettings"] != nullptr)
{
addedSynthetic = gcnew ManagementObject(((array<String^>^)syntheticoutParams["ResultingResourceSettings"])[0]);
addedSynthetic->Get();
}
Затем я должен указать путь «addedSynthetic» в качестве родительского для второго вызова.
жесткий диск ["Родительский"] = добавленный Синтетический-> Путь-> Путь;