¿Cómo puedo saber si el disco tiene un diseño de partición GPT o MBR?

programación


Estoy intentando obtener el diseño/esquema de partición de un disco USB usando la letra de la unidad. Me gustaría saber si el disco es MBR o GPT. Puedo usar Powerhell pero lleva demasiado tiempo recuperar la información. He mirado MSFT_Disk y MSFT_Partition pero no sé cómo usarlos.

Lo que he probado:

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

Solución 2

Primero, la clase Win32_DiskPartition no tiene una propiedad “DriveLetter”, esa consulta fallará siempre.

A continuación, las letras de las unidades son discos lógicos, no físicos. Un único disco físico puede contener varios discos lógicos, cada uno asignado a una instancia de Win32_DiskPartition a través de la clase Win32_LogicalDiskToPartition.

Dado que WMI no utiliza una consulta JOIN, debe reescribirla como una consulta ASOCIADORES DE, así:

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

Esta consulta le proporcionará el objeto Win32_DiskPartition para la letra de unidad especificada.

Solución 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をコピーしました