現在、物理ディスクと仮想ディスクの両方から VHD を作成する CreateVirtualDisk 機能を試しています。エラーのため、ここで 1 週間立ち往生しています: 物理ディスクから VHD を作成しようとしたときにアクセスが拒否されました。私は常に管理者権限でプログラムを実行していたので、理論的にはうまくいくはずですが、うまくいきませんでした。ここで何がうまくいかなかったのか本当にわかりません。
ここで VHD API ドキュメントを見つけることができます: VHD
PInvoke を使用して、ライブラリ 'virtdisk.dll' からこのメソッドを呼び出しました。関数を次のように定義しました。
[DllImport("virtdisk.dll", CharSet = CharSet.Unicode)]
public static extern Int32 CreateVirtualDisk(
ref VIRTUAL_STORAGE_TYPE VirtualStorageType,
String Path,
_VIRTUAL_DISK_ACCESS_MASK VirtualDiskAccessMask,
IntPtr SecurityDescriptor,
_CREATE_VIRTUAL_DISK_FLAG Flags,
Int32 ProviderSpecificFlags,
ref CREATE_VIRTUAL_DISK_PARAMETERS Parameters,
IntPtr Overlapped,
ref VirtualDiskSafeHandle Handle);
そして、これが私がエラーを受け取った方法です:
すべてのパラメーターを次のように設定します。
VIRTUAL_STORAGE_TYPE:
o virtualStorageType.DeviceID = VIRTUAL_STORAGE_TYPE_DEVICE_VHD;
o virtualStorageType.VendorID = VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT;
PATH: // name of the new VHD file
o m_path = “D:\VirtualDisk\test.vhd”;
VIRTUAL_DISK_ACCESS_MASK:
o virtualDiskAccessMask = VIRTUAL_DISK_ACCESS_MASK.VIRTUAL_DISK_ACCESS_CREATE;
SECURITY_DESCRIPTOR:
o securityDescriptor = IntPtr.Zero;
CREATE_VIRTUAL_DISK_FLAG:
o createVirtualDiskFlag = CREATE_VIRTUAL_DISK_FLAG.CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION
ProviderSpecificFlag:
o providerSpecificFlag = 0;
CREATE_VIRTUAL_DISK_PARAMETER:
o m_createVirtualDiskParameters.Version = _CREATE_VIRTUAL_DISK_VERSION.CREATE_VIRTUAL_DISK_VERSION_1;
o m_createVirtualDiskParameters.Version1.UniqueId = Guid.Empty;
o m_createVirtualDiskParameters.Version1.MaximumSize = 0;
o m_createVirtualDiskParameters.Version1.BlockSizeInBytes = 0;
o m_createVirtualDiskParameters.Version1.SectorSizeInByte = VirtualDisk.CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_SECTOR_SIZE;
o m_createVirtualDiskParameters.Version1.ParentPath = IntPtr.Zero;
o m_createVirtualDiskParameters.Version1.SourcePath = Marshal.StringToHGlobalAuto(sourcepath);
OVERLAPPED:
o Overlapped = IntPtr.Zero ;
HANDLE:
o handle
文字列変数「sourcepath」の多くの値を試してみましたが、結果は次のとおりです。
- 既存の仮想ディスクの絶対パス: sourcepath = @"D:\VirtualDisk\KarhuBearOS.vhd"; 成功!
- 物理ディスクの絶対パス: sourcepath = @"C:\"; 失敗した! アクセスが拒否されました。
- VSS サービスによって作成されたボリューム ID: sourcepath = @"\?\Volume{a3c3c244-8b7a-11de-a777-806e6f6e6963}\" 失敗しました! アクセスが拒否されました。
- VSS サービスで作成したボリューム ID の絶対パスで sourcepath = @"\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy30\" に失敗しました! アクセスが拒否されました。
この問題を解決する方法を教えていただければ、大変助かります。
私の精一杯、
ホアン・アン・グエン