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

标签 windows vbscript vb6 wmi hard-drive

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

实际上我使用了 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 操作系统)?有什么想法吗?

最佳答案

这应该可以解决您的问题..

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

关于windows - 获取其中所有硬盘和分区的序号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26942707/

相关文章:

windows - 使用 VBScript 将多个变量传递给应用程序

c++ - session 之间未正确恢复 CMFCToolbar 布局

sql-server - VBScript:将带有空值的参数传递给存储过程?

vb6 - VB6中函数参数的默认值

windows - Windows 锁定时向程序发送热键

java - 通过 Runtime.exec 从 Web Archive 中的 Java 代码运行命令(部署在 Jetty 中的 WAR)

powershell - 如何使用PowerShell或VBScript获取正在运行的应用程序的列表

windows - 手动删除和脚本删除的区别?! (bat 或 vbs)

.net - 如何避免出现以下错误: "Automation Error. It is illegal to call out while inside message filter "?

windows - 最小化字符数的简单数字到数字(或数字到十六进制)加密算法