WMI, чтобы получить ассоциацию буквы диска с физическим путем диска, пропускает CDROM - PullRequest
1 голос
/ 19 февраля 2012

Я запускаю следующий сценарий 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

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Учитывая все комментарии к настоящему моменту, вот скрипт, который добавляет возможность перечислять приводы 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
2 голосов
/ 19 февраля 2012

Я думаю, вам не нужно было бы использовать класс 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
...