Поиск буквы USB-накопителя с помощью VBScript
Я нашел этот скрипт на 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 ответа
Это чрезвычайно сложно сделать. Наиболее полезная информация о диске извлекается из класса 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
Конечно, это будет работать, только если вставленный диск является единственным съемным диском в системе. Вы можете обойти это ограничение, захватив все буквы диска при запуске скрипта и сравнив их при вставке диска, однако этот подход также не пуленепробиваемый. Изменение назначения букв дисков любых других дисков приведет к тому, что ваш скрипт вернет неверную информацию.
colDrives - это коллекция всех подключенных дисков, а не только последние подключенные. Должно быть:
strDriveLetter = ""
For Each objDrive in colDrives
strDriveLetter = strDriveLetter & objDrive.DeviceID
Next