मैं कैसे पता लगाऊं कि डिस्क में जीपीटी या एमबीआर का विभाजन लेआउट है या नहीं


मैं ड्राइव अक्षर का उपयोग करके USB डिस्क का विभाजन लेआउट/स्कीम प्राप्त करने का प्रयास कर रहा हूँ। मैं यह जानना चाहता हूं कि डिस्क एमबीआर है या जीपीटी। मैं पॉवरहेल का उपयोग कर सकता हूं लेकिन जानकारी वापस पाने में बहुत समय लगता है। मैंने 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_LogicalDiskToPartition क्लास के माध्यम से Win32_DiskPartition इंस्टेंस को सौंपा गया है।

चूंकि WMI JOIN क्वेरी का उपयोग नहीं करता है, इसलिए आपको इसे क्वेरी के एसोसिएटर्स के रूप में फिर से लिखना होगा, जैसे:

डब्ल्यूक्यूएल
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をコピーしました