【解決方法】ディスクのパーティション レイアウトが GPT または MBR であるかどうかを確認するにはどうすればよいですか

プログラミングQA


ドライブ文字を使用して 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

コメント

タイトルとURLをコピーしました