打开,附加和分配VHD

时间:2015-08-06 07:31:43

标签: c# c++ powershell vhd

我的用例如下: 我有一个准备好的vhd图像,需要将它挂载到路径f.e. d:\ VHD \活跃。 目前我的解决方案是Powershell Hyper-V和diskpart命令的组合,但这看起来非常脏和黑客攻击:

Mount-VHD -Path D:\vhd-file.vhd -NoDriveLetter 
diskpart> select vdisk file="D:\vhd-file.vhd"
diskpart> sel par 1
diskpart> assign mount="D:\vhd\active

正如您所看到的,我已经使用过" NoDriveLetter"因为我不想要自动分配。 " sel par 1"我必须这样做,因为我找不到更容易的方法来选择正确的音量(其他想法是检查" lis vol"在Mount-VHD之前和之后......但是我总是只有一个分区所以" sel par" ftw!)

我找到了Microsoft Dev VHD Reference,可以"打开"和"附加"通过C#pinvoke代码的VHD图像。我甚至可以使用来自kernel32.dll的CreateFile和带有CREATE_DISK参数的DeviceIoControl来初始化它。但我发现无法将其挂载到文件夹路径。我从kernel32.dll尝试了SetVolumeMountPoint和GetVolumeNameForVolumeMountPoint,但我的VHD的Guid或VirtualDiskIdentifier似乎不是这些函数的正确参数。

我的问题是,是否有人可以指出正确的函数/方法来实现与脚本化解决方案相同的结果,但是在代码中。在代码中意味着C / C ++或C#...如果在普通C或C ++中更容易完成此任务,我可以编写自己的C#-Wrappers。

1 个答案:

答案 0 :(得分:0)

SetVolumeMountPoint()需要已安装的卷的GUID; VirtualDiskIdentifier在这里不起作用,因为它与磁盘相关。

解决这个问题的一种方法是两次运行FindFirstVolume / FindNextVolume循环。一次,在安装之前和安装之后立即。 2个结果之间的差异应该为您提供已安装的卷的GUID。

另外,如果您要创建基于GPT的虚拟磁盘,那么您可以直接传递"唯一分区GUID"它嵌入在您尝试装入的vhd文件的GPT分区表条目中。含义:在Windows上,在安装GPT磁盘后,生成的卷GUID与嵌入VHD / LUN的相应GPT分区表条目内的卷相同。见下图。为此,您必须阅读几个原始VHD文件块并进行一些解析。 mountvol output - embedded PTE unique GUID comparision

相关问题