[ad_1]
ドライブ文字を使用して USB ディスクのパーティション レイアウト/スキームを取得しようとしています。 ディスクがMBRなのかGPTなのかを知りたいのですが。 Powerhell を使用できますが、情報を取得するのに時間がかかりすぎます。 MSFT_Disk と MSFT_Partition について調べましたが、使い方がわかりません。
私が試したこと:
Dim driveLetter As String = USB1 & ":" ' Replace with your drive letter Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_DiskPartition where DriveLetter = '" & driveLetter & "'") For Each queryObj As ManagementObject In searcher.Get() Dim partitionStyle As String = queryObj("DriveType").ToString() If partitionStyle = "3" Then PartitionType = ("GPT") MsgBox(partitionStyle) ElseIf partitionStyle = "2" Then PartitionType = ("MBR") MsgBox(partitionStyle) Else PartitionType = ("NR") MsgBox(partitionStyle) End If Next
解決策 2
まず、Win32_DiskPartition クラスには「DriveLetter」プロパティがないため、そのクエリは毎回失敗します。
次に、ドライブ文字は物理ディスクではなく論理ディスクです。 1 つの物理ディスクに複数の論理ディスクを含めることができ、各論理ディスクは Win32_LogicalDiskToPartition クラスを通じて Win32_DiskPartition インスタンスに割り当てられます。
WMI は JOIN クエリを使用しないため、次のように ASSOCIATORS OF クエリとして書き直す必要があります。
WQL
ASSOCIATORS OF {Win32_LogicalDisk.DeviceId='E:'} WHERE ResultClass=Win32_DiskPartition
このクエリは、指定されたドライブ文字の Win32_DiskPartition オブジェクトを取得します。
解決策 1
Function GetDiskPartitionType(diskDrive As String) As String Dim upperCaseDiskLetter As String = diskDrive.Substring(0, 1).ToUpper() Dim wmiQuery As String = $"SELECT DiskNumber, GptType, MbrType FROM MSFT_Partition WHERE DriveLetter='{upperCaseDiskLetter}'" Dim scope As New ManagementScope("\\localhost\ROOT\Microsoft\Windows\Storage") Dim partitionSearcher As New ManagementObjectSearcher(scope, New ObjectQuery(wmiQuery)) For Each partition As ManagementObject In partitionSearcher.Get() Dim gptType As String = partition("GptType")?.ToString() Dim mbrType As Integer = Convert.ToInt32(partition("MbrType")) If Not String.IsNullOrEmpty(gptType) Then Return "GPT" ElseIf mbrType <> 0 Then Return "MBR" Else Return "Unknown" End If Next Return "Unknown" End Function
[ad_2]
コメント