【发布时间】: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 操作系统中工作)?有什么想法吗?
【问题讨论】:
-
@jac 它在 Windows XP 中不起作用,而且我的问题与该问题并不完全相同(因为我要求它也适用于 win xp)。我也想根据硬盘序列号获取分区。所以请不要认为它是重复的
-
您可能需要第 3 方 DLL 才能在 Vista/Non XP Pro 之前的机器上获得它……或一些低级 C++ 代码
-
为什么还要关心一个生命周期已经结束半年多的操作系统?
标签: windows vbscript vb6 wmi hard-drive