以编程方式将VHD附加到远程Hyper-V VM

使用Hyper-V Manager,我可以连接到远程VM主机,转到VM的设置,并将现有的.VHD文件添加为新硬盘。 如果VM主机正在运行Server 2008 R2,并且磁盘正在连接到SCSI控制器,我甚至可以在VM运行时执行此操作(请参阅Hyper-V R2中的新增function )。

手动完成这一切,一切都很好。 问题是,现在我想自动化它,以便我可以在一些自动化测试中即时附加不同的VHD。

我已经有了通过WMI连接到远程VM主机的C#代码,并通过调用RequestStateChange启动/停止VM,我想扩展它以便能够说“这是VHD的路径,将其作为SCSI驱动器连接到这个VM“。 但是看一下WMI虚拟化类列表 ,我无法弄清楚如何做到这一点。

我发现的最接近的是Msvm_ImageManagementService的Mount方法,但这似乎是在当前操作系统中挂载VHD,这不是我想要的。

必须使用Msvm_VirtualSystemManagementService.AddVirtualSystemResources添加合成磁盘 (ResourceType。Disk,ResourceSubType.DiskSynthetic)。 Parent = SCSI控制器的WMI路径。

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

然后使用Msvm_VirtualSystemManagementService.AddVirtualSystemResources附加虚拟硬盘 (ResourceType.StorageExtent,ResourceSubType.VHD)。 Parent =合成磁盘的WMI路径, Connection = * .vhd文件路径。

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

将Common Utilities用于Virtualization Samples和WMI Explorer 。

另请参阅http://hypervlib.codeplex.com以获取示例。