我的用例如下: 我有一个准备好的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。
答案 0 :(得分:0)
SetVolumeMountPoint()需要已安装的卷的GUID; VirtualDiskIdentifier在这里不起作用,因为它与磁盘相关。
解决这个问题的一种方法是两次运行FindFirstVolume / FindNextVolume循环。一次,在安装之前和安装之后立即。 2个结果之间的差异应该为您提供已安装的卷的GUID。
另外,如果您要创建基于GPT的虚拟磁盘,那么您可以直接传递"唯一分区GUID"它嵌入在您尝试装入的vhd文件的GPT分区表条目中。含义:在Windows上,在安装GPT磁盘后,生成的卷GUID与嵌入VHD / LUN的相应GPT分区表条目内的卷相同。见下图。为此,您必须阅读几个原始VHD文件块并进行一些解析。