Получите серийные номера всех жестких дисков и разделов на нем

Я хочу получить серийные номера всех физических жестких дисков (а не серийные номера дисков) и разделы, присутствующие на них.

На самом деле я использовал реализацию из DISKID32, чтобы получить серийные номера всех жестких дисков, но это не даст разделы на жестком диске, поэтому я планировал использовать другой метод.

Приведенный ниже код дает получение серийного номера физического жесткого диска, а также поиск разделов на каждом жестком диске.

ComputerName = "."
Set wmiServices  = GetObject ( _
    "winmgmts:{impersonationLevel=Impersonate}!//" _
    & ComputerName)
' Get physical disk drive
Set wmiDiskDrives =  wmiServices.ExecQuery ( _
    "SELECT * FROM Win32_DiskDrive")

For Each wmiDiskDrive In wmiDiskDrives
    MsgBox "Disk drive Caption: " _
        & wmiDiskDrive.Caption _
        & VbNewLine & "DeviceID: " _
        & " (" & wmiDiskDrive.DeviceID & ")"
    MsgBox  "Serial number" _
                & wmiDiskDrive.SerialNumber
    'Use the disk drive device id to
    ' find associated partition
    query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _
        & wmiDiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
    Set wmiDiskPartitions = wmiServices.ExecQuery(query)

    For Each wmiDiskPartition In wmiDiskPartitions
        'Use partition device id to find logical disk
        Set wmiLogicalDisks = wmiServices.ExecQuery _
            ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _
             & wmiDiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")

        For Each wmiLogicalDisk In wmiLogicalDisks
            MsgBox  "Drive letter associated" _
                & " with disk drive = " _
                & wmiDiskDrive.Caption _
                & wmiDiskDrive.DeviceID _
                & VbNewLine & " Partition = " _
                & wmiDiskPartition.DeviceID _
                & VbNewLine & " is " _
                & wmiLogicalDisk.DeviceID

        Next
    Next
Next

Он отлично работает в Windows 8. Но когда я тестировал компьютер с Windows XP, я получил ошибку при получении серийного номера, то есть wmiDiskDrive.SerialNumber. Все остальные объекты исправно работают.

Затем я обнаружил, что это свойство недоступно в Windows XP, Windows Server 2003 и т. Д. Теперь из приведенного выше кода я могу получить номер модели жесткого диска и его разделы, но мне нужен серийный номер.

Итак, как я могу получить серийный номер жесткого диска и его разделы (должны работать во всех ОС Windows)? Любая идея?


person IT researcher    schedule 15.11.2014    source источник
comment
возможный дубликат Получить серийный номер H / D номер (не серийный номер Volumn) для IDE и SATA   -  person jac    schedule 15.11.2014
comment
@jac Он не работает в Windows XP, и мой вопрос не совсем дублирует этот вопрос (так как я просил его работать и для win xp). Я тоже хочу получить разделы по серийному номеру жесткого диска. Поэтому, пожалуйста, не считайте это дубликатом   -  person IT researcher    schedule 15.11.2014
comment
вам, вероятно, понадобится сторонняя DLL, чтобы получить это на машинах до Vista / Non XP Pro ... или какой-то низкоуровневый код C ++   -  person Ňɏssa Pøngjǣrdenlarp    schedule 16.11.2014
comment
Зачем вам вообще нужна операционная система, жизненный цикл которой закончился более полугода назад?   -  person Ansgar Wiechers    schedule 16.11.2014
comment
Вы когда-нибудь находили решение этой проблемы? Я тоже пытался решить эту проблему для сценария, который я пишу на Tcl. Некоторые ресурсы, которые я искал, чтобы помочь мне, были командой WMIC и командой DISKPART. ! WMIC! DiskPart Возможно, в этом есть некоторый потенциал, но если вы уже нашли другое решение, дайте нам знать.   -  person Legit Stack    schedule 12.06.2015


Ответы (1)


Это должно решить вашу проблему ..

Public Function GetDriveSerialNumber(DrvL As String) As Long

         Dim fso As Object, Drv As Object
        Dim driveletter As String
        Dim DriveSerial As String
         Set fso = CreateObject("Scripting.FileSystemObject")
        driveletter = DrvL


             Set Drv = fso.GetDrive(driveletter)


         With Drv
             If .IsReady Then
                 DriveSerial = Abs(.SerialNumber)
             Else
                 DriveSerial = -1
             End If
         End With


         Set Drv = Nothing
         Set fso = Nothing

         GetDriveSerialNumber = DriveSerial

     End Function
person Arifuzzaman Pranto    schedule 17.11.2014
comment
Серийный номер из вашего кода - это серийный номер тома, и это не то, что я хотел. В своем вопросе я упомянул, что мне не нужен серийный номер тома. Мне нужен уникальный серийный номер жесткого диска. Также я хочу получить все разделы на жестком диске. - person IT researcher; 17.11.2014