1

Тема: VBScript: отслеживание подключения устройств USB

Автор идеи - Alexbootch.
Два варианта скрипта.

' Пример сценария асинхронного отслеживания подключения устройств USB
Sub SINK_OnObjectReady(objReceivedEvent, objAsyncContext)
    Wscript.Echo "Name: " & objReceivedEvent.TargetInstance.Name
    Wscript.Echo "FileSystem: " & objReceivedEvent.TargetInstance.FileSystem
    Wscript.Echo "FreeSpace: " & objReceivedEvent.TargetInstance.FreeSpace
    Wscript.Echo "Size: " & objReceivedEvent.TargetInstance.Size
    Wscript.Echo "VolumeName: " & objReceivedEvent.TargetInstance.VolumeName
    Wscript.Echo "VolumeSerialNumber: " & objReceivedEvent.TargetInstance.VolumeSerialNumber
End Sub

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set MySink = WScript.CreateObject( _
    "WbemScripting.SWbemSink","SINK_")

objWMIservice.ExecNotificationQueryAsync MySink, _
    "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
    "TargetInstance ISA 'Win32_LogicalDisk'" & _
    " AND TargetInstance.DriveType = 2"

While (True)
    Wscript.Sleep(1000)
Wend
' Пример сценария синхронного отслеживания подключения устройств USB
strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
    "TargetInstance ISA 'Win32_LogicalDisk'" & _ 
    " AND TargetInstance.DriveType = 2")

Do While(True)
    Set objReceivedEvent = objEvents.NextEvent
    Wscript.Echo "Name: " & objReceivedEvent.TargetInstance.Name
    Wscript.Echo "FileSystem: " & objReceivedEvent.TargetInstance.FileSystem
    Wscript.Echo "FreeSpace: " & objReceivedEvent.TargetInstance.FreeSpace
    Wscript.Echo "Size: " & objReceivedEvent.TargetInstance.Size
    Wscript.Echo "VolumeName: " & objReceivedEvent.TargetInstance.VolumeName
    Wscript.Echo "VolumeSerialNumber: " & objReceivedEvent.TargetInstance.VolumeSerialNumber
Loop

Есть одна особенность: постоянно идёт опрос дисковода А:\. Причём опрос может продолжаться и после завершения скрипта, и даже после логоффа (замечено на WinXP SP2), проходя только после перезагрузки машины. Таким образом, на машинах с дисководом А:\ используйте с осторожностью.

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

2

Re: VBScript: отслеживание подключения устройств USB

Скрипт отслеживает подключение и отключение устройств со сменным носителем и буквой диска больше "С".
Без опроса дисковода А:.
Без использования WMI.

On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
colDrives = Split("D E F G H I J K L M N O P Q R S T U V W X Y Z")
Set dictDrives = CreateObject("Scripting.Dictionary")
For Each Drive In colDrives
    Set Drv = FSO.GetDrive(Drive & ":")
    If Err.Number Then
        dictDrives.Add Drive & ":", False
    Else
        If Drv.DriveType = 1 And Drv.IsReady Then
            dictDrives.Add Drive & ":", True
        Else
            dictDrives.Add Drive & ":", False
        End If
    End If
    Err.Clear
Next
' Бесконечный цикл
While True
    For Each Drive In dictDrives.Keys
        Set Drv = FSO.GetDrive(Drive)
        If (Err.Number) Or (Drv.IsReady = False) Or (Drv.DriveType <> 1) Then
            Flag = False
        Else
            Flag = True
        End If
        Err.Clear
        Current = dictDrives.Item(Drive)
        If Current <> Flag Then
            If Current = False And Flag = True Then
                WScript.Echo "Диск " & Drive & " был подключён."
                WScript.Echo "FileSystem = " & Drv.FileSystem
                WScript.Echo "FreeSpace = " & Drv.FreeSpace
                WScript.Echo "TotalSize = " & Drv.TotalSize
                WScript.Echo "SerialNumber = " & Drv.SerialNumber
                WScript.Echo "VolumeName = " & Drv.VolumeName
            Else
                WScript.Echo "Диск " & Drive & " был отключён."
            End If
            dictDrives.Item(Drive) = Flag
        End If
    Next
    WScript.Sleep 1000
Wend

Примечание: для отслеживания конкретной флешки можно контролировать, например, VolumeName.

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