获取其中所有硬盘和分区的序列号
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编号等~
windows x下的c编程,获取电脑硬件序列号(cpu 硬盘 bios 主版)!很着急!邮箱wangyu850722@163.com