Bagaimana cara mengetahui apakah disk memiliki tata letak partisi GPT atau MBR

pemrograman


Saya mencoba mendapatkan tata letak/skema partisi disk USB menggunakan huruf drive. Saya ingin mengetahui apakah disk tersebut MBR atau GPT. Saya dapat menggunakan Powerhell tetapi memerlukan waktu terlalu lama untuk mendapatkan kembali informasinya. Saya telah melihat MSFT_Disk dan MSFT_Partition tetapi saya tidak tahu cara menggunakannya.

Apa yang saya coba:

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

Solusi 2

Pertama, kelas Win32_DiskPartition tidak memiliki properti “DriveLetter”, kueri tersebut akan selalu gagal.

Selanjutnya, huruf drive adalah Logical Disk, bukan fisik. Satu disk fisik dapat berisi beberapa disk logis, masing-masing ditetapkan ke instans Win32_DiskPartition melalui kelas Win32_LogicalDiskToPartition.

Karena WMI tidak menggunakan query JOIN, Anda harus menulis ulang sebagai query ASSOCIATORS OF, seperti ini:

WQL
ASSOCIATORS OF {Win32_LogicalDisk.DeviceId='E:'} WHERE ResultClass=Win32_DiskPartition

Kueri ini akan memberi Anda objek Win32_DiskPartition untuk huruf drive yang ditentukan.

Solusi 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をコピーしました