Поиск буквы USB-накопителя с помощью VBScript - PullRequest
1 голос
/ 26 ноября 2011

Я нашел этот скрипт на http://network -blog.lan-secure.com / 2008/03 / usb-Detection using-wmi-script.html

 strComputer = "." '(Any computer name or address)
 Set wmi = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
 Set wmiEvent = wmi.ExecNotificationQuery("select * from __InstanceOperationEvent within 1 where TargetInstance ISA 'Win32_PnPEntity' and TargetInstance.Description='USB Mass Storage Device'")
 While True
 Set usb = wmiEvent.NextEvent()
 Select Case usb.Path_.Class
 Case "__InstanceCreationEvent" WScript.Echo("USB device found")
 Case "__InstanceDeletionEvent" WScript.Echo("USB device removed")
 Case "__InstanceModificationEvent" WScript.Echo("USB device modified")
 End Select
 Wend

Этот скрипт рядом с тем, что мне нужно. Он обнаруживает вставку USB-накопителя. Как изменить его, чтобы найти букву диска USB-накопителя? Если я получу букву диска, то при вставке вместо отображения «USB device found» я смогу запустить сканер командной строки Avast Antivirus для автоматического сканирования диска при вставке. Пожалуйста, руководство!

Ответы [ 2 ]

3 голосов
/ 26 ноября 2011

Это чрезвычайно сложно сделать. Наиболее полезная информация о диске берется из класса Win32_LogicalDrive. К сожалению, съемные диски часто не заполняют этот класс большим количеством информации о диске. Полезные свойства, такие как DeviceID и PNPDeviceID, чаще всего оставляются пустыми. Следующее, что лучше всего сделать, это выполнить итерацию класса Win32_LogicalDisk для экземпляров, которые являются съемными дисками. В соответствии с вашим подходом, основанным на событиях, это будет выглядеть примерно так:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set wmiEvent = objWMIService.ExecNotificationQuery( _
    "Select * From __InstanceCreationEvent Within 1" & _
        " Where TargetInstance ISA 'Win32_PnPEntity' and" & _
            " TargetInstance.Description='USB Mass Storage Device'")

While True
    Set objEvent = wmiEvent.NextEvent()
    Set objUSB = objEvent.TargetInstance
    strName = objUSB.Name
    strDeviceID = objUSB.DeviceID
    Set objUSB = Nothing

    Set colDrives = objWMIService.ExecQuery( _
        "Select * From Win32_LogicalDisk Where DriveType = 2")

    For Each objDrive in colDrives
        strDriveLetter = objDrive.DeviceID
    Next
    Set colDrives = Nothing

    WScript.Echo strName & " was mounted as " & strDriveLetter
Wend
Set wmiEvent = Nothing
Set objWMIService = Nothing

Конечно, это будет работать, только если вставленный диск является единственным съемным диском в системе. Вы можете обойти это ограничение, захватив все буквы диска при запуске скрипта и сравнив их при вставке диска, однако этот подход также не пуленепробиваемый. Изменение назначения букв дисков любых других дисков приведет к тому, что ваш скрипт вернет неверную информацию.

0 голосов
/ 27 июля 2014

colDrives - это набор всех подключенных дисков , не только последний подключенный.Должно быть:

strDriveLetter = ""
For Each objDrive in colDrives
  strDriveLetter = strDriveLetter  & objDrive.DeviceID
Next
...