2010-02-05 7 views
4

Используя диспетчер Hyper-V, я могу подключиться к удаленному узлу VM, перейти к настройкам виртуальной машины и добавить существующий файл .VHD в качестве нового жесткого диска. Если на хосте VM работает сервер 2008 R2, и диск подключается к контроллеру SCSI, я могу это сделать даже во время работы виртуальной машины (см. What's new in Hyper-V R2).Программируемое подключение VHD к удаленной виртуальной виртуальной машине

Выполнение этого вручную, все отлично работает. Проблема в том, что теперь я хочу автоматизировать ее, чтобы я мог прикрепить различные VHD на лету во время некоторых автоматических тестов.

У меня уже есть код C#, который соединяется с удаленным хостом VM по WMI и запускает/останавливает виртуальные машины, вызывая RequestStateChange, и я хотел бы расширить его, чтобы иметь возможность сказать «вот путь к VHD, прикрепите его как SCSI-диск для этой виртуальной машины ». Но, глядя на list of WMI virtualization classes, я не могу понять, как это сделать.

Самый близкий, который я нашел, - это метод MountMsvm_ImageManagementService, но, похоже, он монтирует VHD внутри текущей ОС, чего я не хочу.

ответ

4

Необходимо добавить синтетический диска (Тип_ресурс. Disk, ResourceSubType. DiskSynthetic) с использованием Msvm_VirtualSystemManagementService.AddVirtualSystemResources. Parent = путь WMI контроллера SCSI.

ManagementObject synthetic = Utilities.GetResourceAllocationSettingData(scope, 
    ResourceType.Disk, ResourceSubType.DiskSynthetic); 
synthetic["Parent"] = <ideControllerPath>; //or SCSI controller path (WMI path) 
synthetic["Address"] = <diskDriveAddress>; //0 or 1 for IDE 
string[] RASDs = new string[1]; 
RASDs[0] = synthetic.GetText(TextFormat.CimDtd20); 

Затем прикрепить виртуальный жесткий диск (ResourceType. StorageExtent, ResourceSubType. VHD) с помощью Msvm_VirtualSystemManagementService.AddVirtualSystemResources. Parent = путь WMI от синтетического диска, Соединение = * .vhd путь к файлу.

ManagementObject hardDisk = Utilities.GetResourceAllocationSettingData(scope, 
    ResourceType.StorageExtent, ResourceSubType.VHD); 
hardDisk["Parent"] = <syntheticPath>; //WMI path 
string[] connection = { <vhdPath> }; //Path to *.vhd file 
hardDisk["Connection"] = connection; 
string[] RASDs = new string[1]; 
RASDs[0] = hardDisk.GetText(TextFormat.CimDtd20); 

Использование Common Utilities for the Virtualization Samples и WMI Explorer.