【问题标题】:WMI to get drive letter association with physical drive path, misses CDROMsWMI 获取与物理驱动器路径相关的驱动器号,错过 CDROM
【发布时间】:2012-02-19 03:04:35
【问题描述】:

我正在运行以下 WMI 脚本来获取系统上驱动器号和物理驱动器之间的关联,但由于某种原因,它忽略了 CDROM/DVD-ROM。谁能告诉我如何获得这些?

ComputerName = "."
Set wmiServices = GetObject _
    ("winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName)
Set wmiDiskDrives = wmiServices.ExecQuery _
    ("SELECT DeviceID FROM Win32_DiskDrive")

For Each wmiDiskDrive In wmiDiskDrives
    strEscapedDeviceID = _
        Replace(wmiDiskDrive.DeviceID, "\", "\\", 1, -1, vbTextCompare)
    Set wmiDiskPartitions = wmiServices.ExecQuery _
        ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & _
            strEscapedDeviceID & """} WHERE " & _
                "AssocClass = Win32_DiskDriveToDiskPartition")

    For Each wmiDiskPartition In wmiDiskPartitions
        Set wmiLogicalDisks = wmiServices.ExecQuery _
            ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & _
                wmiDiskPartition.DeviceID & """} WHERE " & _
                    "AssocClass = Win32_LogicalDiskToPartition")

        For Each wmiLogicalDisk In wmiLogicalDisks
            WScript.Echo wmiLogicalDisk.DeviceID & " = " & wmiDiskDrive.DeviceID
        Next
    Next
Next

【问题讨论】:

  • 此代码用于检测驱动器号是否与逻辑磁盘分区相关联——这是您真正想要的吗?听起来像是更简单的代码,比如Enumerating Disk Drive Properties Using FSO 可以吗?
  • 谢谢,但这不是我需要的。当前脚本(如果您运行它)会在驱动器号和物理驱动器路径之间产生关联。类似于:“C:”=“\\.\PhysicalDrive0”,但它不会为我的 CD 驱动器产生相同的结果,即“D:”=“\\.\CDROM0”。我想知道为什么?

标签: vba vbscript wmi


【解决方案1】:

考虑到目前所有的 cmets,这里有一个脚本,它添加了列出 CD-Rom 驱动器的功能。

ComputerName = "."

Set dictDrives = CreateObject("Scripting.Dictionary")
Set listDriveLetters = CreateObject("System.Collections.ArrayList")

Set wmiServices = GetObject _
    ("winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName)
Set wmiDiskDrives = wmiServices.ExecQuery _
    ("SELECT DeviceID FROM Win32_DiskDrive")

For Each wmiDiskDrive In wmiDiskDrives
    strEscapedDeviceID = Replace(wmiDiskDrive.DeviceID, "\", "\\", 1, -1, vbTextCompare)
    Set wmiDiskPartitions = wmiServices.ExecQuery _
        ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & _
            strEscapedDeviceID & """} WHERE " & _
                "AssocClass = Win32_DiskDriveToDiskPartition")

    For Each wmiDiskPartition In wmiDiskPartitions
        Set wmiLogicalDisks = wmiServices.ExecQuery _
            ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & _
                wmiDiskPartition.DeviceID & """} WHERE " & _
                    "AssocClass = Win32_LogicalDiskToPartition")

        For Each wmiLogicalDisk In wmiLogicalDisks
            listDriveLetters.Add wmiLogicalDisk.DeviceID
            dictDrives.Add wmiLogicalDisk.DeviceID, wmiDiskDrive.DeviceID
        Next
    Next
Next

Set wmiCDROMDrives = wmiServices.ExecQuery _
    ("Select DeviceID, Drive, MediaLoaded from Win32_CDROMDrive")

For Each wmiCDROMDrive in wmiCDROMDrives
    If wmiCDROMDrive.MediaLoaded Then          ' Only show drives with inserted media
        listDriveLetters.Add wmiCDROMDrive.Drive
        dictDrives.Add wmiCDROMDrive.Drive, wmiCDROMDrive.DeviceID
    End If
Next

listDriveLetters.Sort                          ' List the drives in alphabetical order

For Each strDriveLetter in listDriveLetters
    WScript.Echo strDriveLetter & " = " & dictDrives.Item(strDriveLetter)
Next

【讨论】:

  • 谢谢。现在已经非常接近了。您的脚本为我提供了以下内容,而不是 CDROM 的物理路径: D: = IDE\CDROMHL-DT-ST_DVD+-RW_GH50N____B103____\4&363F6EBE&0&0.1.0
  • @ahmdo 所以你没有在下面尝试我的代码(在顶部_它为 cd-rom 信息提供了相同的输出,即wmiDiskDrive.drive & "=" & wmiDiskDrive.DeviceID?+1 btw Nilpo
  • @ahmd0 \\.\CDROM0 等物理路径只能在 Win32_PhysicalMedia 类的 Tag 属性中找到。没有其他关联的类或属性可以链接到它。您需要自己枚举设备。例如,您可以使用 Win32_SystemDevices 类。您遇到的第一个 CD-ROM 将位于挂载点 0,第二个位于挂载点 1,依此类推。可以通过它们与 Win32_CDROMDrive 类的关联进行过滤。
【解决方案2】:

我认为您需要使用Win32_CDROMDrive WMI 类来访问CD-ROM 信息。您上面的代码正在寻找 Win32_DiskDrive 类中的物理驱动器,它不包括 CD_ROM

您可以添加额外的行来获取类似的数据 - 但由于 CD-ROM 不具有您当前代码所具有的分区特征,所以不一样

ComputerName = "."
Set wmiServices = GetObject _
                  ("winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName)
Set wmiDiskDrives = wmiServices.ExecQuery _
                    ("SELECT * FROM Win32_CDROMDrive")
For Each wmiDiskDrive In wmiDiskDrives
    MsgBox wmiDiskDrive.drive & "=" & wmiDiskDrive.DeviceID
Next

相反,我认为这个不同的 VBS 可能做你想做的事 - 可能部分,因为我认为分区信息与你无关。

版本

Dim objFSO
Dim colDrives
Dim strOut
Dim strArray

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colDrives = objFSO.Drives
strArray = Array("Unknown", "Removable", "Fixed", "Network", "CD-ROM", "RAM Disk")
On Error Resume Next
'File system errors for virtual drives
For Each objDrive In colDrives
    strOut = "Drive letter: " & objDrive.DriveLetter & vbNewLine
    strOut = strOut & ("Drive type: " & strArray(objDrive.DriveType) & vbNewLine)
    strOut = strOut & ("File system: " & objDrive.FileSystem & vbNewLine)
    strOut = strOut & ("Path: " & objDrive.Path)
    wscript.echo strOut
Next
On Error GoTo 0

版本

Sub Test()
Dim objFSO As Object
Dim colDrives As Object
Dim strOut As String
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colDrives = objFSO.Drives
On Error Resume Next
'File system errors for virtual drives
For Each objDrive In colDrives
    strOut = "Drive letter: " & objDrive.DriveLetter & vbNewLine
    strOut = strOut & ("Drive type: " & Choose(objDrive.DriveType + 1, "Unknown", "Removable", "Fixed", "Network", "CD-ROM", "RAM Disk") & vbNewLine)
    strOut = strOut & ("File system: " & objDrive.FileSystem & vbNewLine)
    strOut = strOut & ("Path: " & objDrive.Path)
    MsgBox strOut
Next
On Error GoTo 0
End Sub

【讨论】:

  • 这是正确的。 Win32_DiskDrive 类不包括任何光驱。
  • @brettdj 谢谢,但这并不是我所需要的。同样,此代码的目标是在驱动器号和驱动器的物理路径之间产生关联。像这样的东西:“C:”=“\\.\PhysicalDrive0”、“D:”=“\\.\CDROM0”、“E:”=“\\.\PhysicalDrive2”
  • @Nilpo 是的,从我自己的实验中我了解到 Win32_DiskDrive 不包含光驱,但 Win32_PhysicalMedia 包含,并且我可以使用 Tag 属性而不是 DeviceID,但代码停止在 ASSOCIATORS 中产生任何结果OF 部分,不幸的是我不太了解 WMI 来进一步修复它......在这方面有什么想法吗?
  • @ahmd0 Win32_PhysicalMedia 类的标签属性确实有效,但是,它为 CD 驱动器返回类似“\\.\CDROM0”的内容。此命名约定不会出现在 WMI 存储库中的其他任何地方,因此没有任何与此属性实例相关的关联。您需要添加一个单独的逻辑集才能使用 CD-ROM 驱动器。
  • @Nilpo 我明白了。知道如何为 CDROM 完成它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 2012-03-06
相关资源
最近更新 更多