Comment savoir si le disque a une disposition de partition GPT ou MBR

la programmation


J’essaie d’obtenir la disposition/le schéma de partition d’un disque USB en utilisant la lettre de lecteur. J’aimerais savoir si le disque est MBR ou GPT. Je peux utiliser Powerhell mais la récupération des informations prend trop de temps. J’ai regardé MSFT_Disk et MSFT_Partition mais je ne sais pas comment les utiliser.

Ce que j’ai essayé :

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

Solution 2

Premièrement, la classe Win32_DiskPartition n’a pas de propriété “DriveLetter”, cette requête échouera à chaque fois.

Ensuite, les lettres de lecteur sont des disques logiques et non physiques. Un seul disque physique peut contenir plusieurs disques logiques, chacun étant affecté à une instance Win32_DiskPartition via la classe Win32_LogicalDiskToPartition.

Puisque WMI n’utilise pas de requête JOIN, vous devez la réécrire en tant que requête ASSOCIATORS OF, comme ceci :

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

Cette requête vous obtiendra l’objet Win32_DiskPartition pour la lettre de lecteur spécifiée.

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