C# 打开、连接和分配VHD

C# 打开、连接和分配VHD,c#,c++,powershell,vhd,C#,C++,Powershell,Vhd,我的用例如下所示: 我有一个现成的vhd映像,需要将其装载到路径f.e.D:\vhd\active。 目前,我的解决方案是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

我的用例如下所示: 我有一个现成的vhd映像,需要将其装载到路径f.e.D:\vhd\active。 目前,我的解决方案是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我必须这样做,因为我没有找到更简单的方法来选择正确的音量,其他想法是在安装VHD之前和之后检查LIS VOL…但是,是的,我总是只有一个分区,所以我的FTW!p> 我找到了,可以通过C pinvoke代码打开并附加VHD映像。我甚至可以使用kernel32.dll中的CreateFile和带有CREATE\u磁盘参数的DeviceIoControl组合来初始化它。但我找不到方法将其装载到文件夹路径。我尝试从kernel32.dll中设置VolumeMountPoint和GetVolumeNameForVolumeMountPoint,但VHD或VirtualDiskIdentifier的Guid似乎不是这些函数的正确参数


我的问题是,是否有人可以向我指出正确的函数/方法,以实现与脚本解决方案相同的结果,但使用的是代码。在代码中表示C/C++或C。。。如果在C或C++中更容易完成这个任务,我就可以编写自己的C包装器。

< P> ValueMUMUntPoT将需要一个安装卷的GUID;VirtualDiskIdentifier在这里不起作用,因为它是相对于磁盘的

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

此外,如果要创建基于GPT的虚拟磁盘,则可以直接传递唯一的分区GUID,该GUID嵌入在要装载的vhd文件的GPT分区表条目中。含义:在Windows上,GPT磁盘装载后,生成的卷GUID与嵌入VHD/LUN的相应GPT分区表项中的卷GUID相同。请参见下图。为此,您必须读取几个原始VHD文件块并进行一些解析。

也许您可以编辑此文件,使其更具可读性。有可用的格式化帮助。