使用Hyp-V管理器,我可以连接到一个远程VM主机,转到VM的设置,并将现有的.VHD文件添加为一个新硬盘。如果虚拟机主机正在运行服务器2008 R2,并且磁盘连接到SCSI控制器,我甚至可以在虚拟机运行时执行此操作(请参见What's new in Hyper-V R2)。
手动操作,一切都很好。问题是,现在我想把它自动化,这样我就可以在一些自动化测试期间动态地附加不同的vhd。
我已经有了通过wmi连接到远程vm主机并通过调用RequestStateChange启动/停止vm的c代码,我想扩展它以能够说“这是vhd的路径,将它作为scsi驱动器连接到此vm”。但看看list of WMI virtualization classes,我不知道该怎么做。
我找到的最接近的方法是MountMsvm_ImageManagementService方法,但这似乎会在当前操作系统中安装vhd,这不是我想要的。

最佳答案

必须使用msvm_virtualsystemmanagementservice.addvirtualsystemresources添加合成磁盘(resourcetype.disk,resourcesype.diskssynthetic)。parent=scsi控制器的wmi路径。

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);

然后使用msvm_virtualsystemmanagementservice.addvirtualsystemresources附加虚拟硬盘(resourcetype.storageextent,resourcessubtype.vhd)。parent=合成磁盘的wmi路径,connection=*.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 SamplesWMI Explorer

10-08 00:37