Làm cách nào để biết đĩa có bố cục phân vùng GPT hay MBR

lập trình


Tôi đang cố gắng lấy bố cục/sơ đồ phân vùng của đĩa USB bằng ký tự ổ đĩa. Tôi muốn tìm hiểu xem đĩa là MBR hay GPT. Tôi có thể sử dụng Powerhell nhưng mất quá nhiều thời gian để lấy lại thông tin. Tôi đã xem MSFT_Disk và MSFT_Partition nhưng tôi không biết cách sử dụng chúng.

Những gì tôi đã thử:

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

Giải pháp 2

Đầu tiên, lớp Win32_DiskPartition không có thuộc tính “DriveLetter”, truy vấn đó sẽ luôn thất bại.

Tiếp theo, ký tự ổ đĩa là Đĩa logic, không phải đĩa vật lý. Một đĩa vật lý có thể chứa nhiều đĩa logic, mỗi đĩa được gán cho một phiên bản Win32_DiskPartition thông qua lớp Win32_LogicalDiskToPartition.

Vì WMI không sử dụng truy vấn THAM GIA nên bạn phải viết lại nó dưới dạng truy vấn LIÊN KẾT, như thế này:

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

Truy vấn này sẽ giúp bạn có được đối tượng Win32_DiskPartition cho ký tự ổ đĩa được chỉ định.

Giải pháp 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をコピーしました