كيف يمكنني معرفة ما إذا كان القرص يحتوي على تخطيط قسم GPT أو MBR

برمجة


أحاول الحصول على تخطيط/مخطط القسم لقرص 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”، وسيفشل هذا الاستعلام في كل مرة.

بعد ذلك، أحرف محركات الأقراص هي أقراص منطقية، وليست أقراص فعلية. يمكن أن يحتوي قرص فعلي واحد على أقراص منطقية متعددة، يتم تعيين كل منها لمثيل Win32_DiskPartition من خلال فئة Win32_LogicalDiskToPartition.

نظرًا لأن 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をコピーしました