获取其中所有硬盘和分区的序列号

Posted

技术标签:

【中文标题】获取其中所有硬盘和分区的序列号【英文标题】:Get serial number of all hard disks and partitions in it 【发布时间】:2015-01-12 14:16:54 【问题描述】:

我想获取所有物理硬盘序列号(不是驱动器的卷序列号)和其中存在的分区。

其实我用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 pc 中测试时,我在获取序列号时出错,即 wmiDiskDrive.SerialNumber 。所有其他对象都正常工作。

然后我发现这个属性在windows XP、windows server 2003等中是不可用的。 现在从上面的代码我可以得到硬盘型号和其中的分区,但我想要序列号。

那么我怎样才能获得硬盘序列号和它们的分区(应该在所有 Windows 操作系统中工作)?有什么想法吗?

【问题讨论】:

Get H/D Serial number (Not Volumn Serial Number) for IDE and SATA的可能重复 @jac 它在 Windows XP 中不起作用,而且我的问题与该问题并不完全相同(因为我要求它也适用于 win xp)。我也想根据硬盘序列号获取分区。所以请不要认为它是重复的 您可能需要第 3 方 DLL 才能在 Vista/Non XP Pro 之前的机器上获得它……或一些低级 C++ 代码 为什么还要关心一个生命周期已经结束半年多的操作系统? 你有没有找到解决这个问题的方法?我也一直在尝试为我在 Tcl 中编写的脚本解决这个问题,我研究过一些资源来帮助我,这些资源是 WMIC 命令和 DISKPART 命令。 !WMIC !DiskPart 也许有一些潜力,但如果你已经找到了不同的解决方案,请告诉我们。 【参考方案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

【讨论】:

您代码中的序列号是卷序列号,它不是我想要的。在我的问题中,我提到我不想要卷序列号。我想要唯一的硬盘序列号。我也想获取硬盘中的所有分区。

以上是关于获取其中所有硬盘和分区的序列号的主要内容,如果未能解决你的问题,请参考以下文章

paragon ntfs for mac 15 激活码序列号完整版免费下载

VC++如何获取机器码?硬盘序列号、CPU编号、BIOS编号等~

怎么查看电脑硬盘序列号

在Linux下用c编程怎么获取网卡序列号和硬盘序列号

获取硬盘序列号

windows x下的c编程,获取电脑硬件序列号(cpu 硬盘 bios 主版)!很着急!邮箱wangyu850722@163.com