1

Тема: VBScript: Скрипт не отпускает флешку

Проблема такая, есть скрипт который находится в автозагрузке, работает нормально, но есть
два вопроса:
1. При отключении флешки через безопасное отключение, с первого раза не удаётся её отключить, не находит программы, блокирующей её, но и не отключает. Приходится несколько раз нажимать на безопасное отключение, пока отключит. Помогите подправить скрипт, по-видимому, что-то с циклом.
2. Ежедневно к компьютеру подключается несколько десятков флешек, имеется несколько конкретных флешек которым нужно запретить просматривать определённые типы файлов
mp3, jpeg, при этом, чтобы на другие запрет не распространялся, но на других компьютерах они бы просматривать могли. В крайнем случае запретить монтирование или полностью работу с этими флешками. Что посоветуете добавить в этот скрипт, чтобы решить эту задачу? И вообще возможно ли это с помощью скрипта? Спасибо.

On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
set ws=createobject("wscript.shell")
colDrives = Split("B 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
                Set FSO=CreateObject("Scripting.FileSystemObject") 
                ws.run FSO.BuildPath(Drive, "SKL\proverka.exe"), 0, false
If   .FileExists(.BuildPath(Drive, "SKL\proverka1.txt")) = True Then 
      ws.run("C:\proverka1.exe"), 0, false
    End If
            End If
            dictDrives.Item(Drive) = Flag
        End If
    Next
    WScript.Sleep 1000
Wend

2

Re: VBScript: Скрипт не отпускает флешку

serrrr пишет:

не находит программы, блокирующей её, но и не отключает.

Какая ОС. Как определяли, что «не находит программы, блокирующей её».

serrrr пишет:

2. Ежедневно к компьютеру подключается несколько десятков флешек, имеется несколько конкретных флешек которым нужно запретить просматривать определённые типы файлов…

…чтобы на другие запрет не распространялся, но на других компьютерах они бы просматривать могли

Кому что нужно запретить? Флэшкам?

            …
            If Current = False And Flag = True Then
                Set FSO=CreateObject("Scripting.FileSystemObject") 
                …

Во-первых, дублирование. Во-вторых, внутри цикла, — у Вас идёт утечка памяти.

Для начала, ответьте, пожалуйста, на вопрос:

Правила форума пишет:

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

P.S. Откровенно говоря, не знаю, как коллеги, а у меня сразу отпадает желание разбираться, когда я вижу «гольный» «On Error Resume Next» в начале скрипта.

3

Re: VBScript: Скрипт не отпускает флешку

1. ОС – XP 3 сервис пак, установлена  USB Safely Remove, в ней нажимаю безопасно извлечь, иногда останавливает сразу, но чаще выскакивает окно «невозможно остановить и в нём написано о том , что программа блокирующая флешку не найдена». В этом же окне нажимаю «стоп ещё раз», приходится нажимать от одного до нескольких раз, после этого флешка останавливается. Когда за компьютером я мне не трудно нажать несколько раз, хотя охота понять почему не останавливает с первого раза, а когда не я флешка, если не остановлена с первого раза, просто выдёргивается.
2. Запретить нужно человеку, находящемуся за компьютером, просматривать определённые типы файлов  с нескольких конкретных  флешек, при этом с других флешек он эти типы файлов просматривать может, или запретить ему этими флешками совсем пользоваться «монтировать».  Но на других компьютерах они должны работать нормально. Может быть как-то обыграть наличие на этих флешках какого-нибудь файла и при его наличии запретить монтирование этой флешки. Все работают под одной учёткой, несколько устанавливать не получится.
3. Про дублирование, приведённый кусок кода необходимо удалить? А как определить утечку памяти, в диспетчере задач загрузка ЦП 1-2%?
4. Если не использовать «On Error Resume Next», выскакивает сообщение диск такой-то не найден. А что вы посоветуете , что бы оно не выскакивало? Как организовать перебор дисков?
5. Скрипт находится в автозагрузке, при подключении флешки, запускается с флешки при наличии программа proverka, потом проверяется на флешке наличие файла proverka1.txt, и при его нахождении запускается программа с жёсткого диска proverka1.exe. Перед безопасным извлечением проверял в диспетчере задач в процессах ни proverka1.exe, ни proverka.exe не находятся.

4

Re: VBScript: Скрипт не отпускает флешку

1. Загрузите «Unlocker» и попробуйте отследить с помощью него, чем занято устройство.

2. Запретить нужно человеку, находящемуся за компьютером, просматривать определённые типы файлов  с нескольких конкретных  флешек, при этом с других флешек он эти типы файлов просматривать может

Нельзя. Кроме того, кроме Проводника существуют и другие файловые менеджеры.

Может быть как-то обыграть наличие на этих флешках какого-нибудь файла и при его наличии запретить монтирование этой флешки.

Монтируются они системой в автоматическом режиме, если сие отключить — теоретически можно, но не думаю, что кто-то захочет монтировать «ручками»:

…ежедневно … несколько десятков флешек

    \\?\Volume{19a771ac-c879-11df-867c-806d6172696f}\
    \\?\Volume{5beae64f-d6fe-11df-9394-cd3a53f5826e}\
    \\?\Volume{5beae651-d6fe-11df-9394-90bbeda6012e}\
    \\?\Volume{b9c424ee-c86f-11df-938e-806d6172696f}\
    \\?\Volume{b9c424ef-c86f-11df-938e-806d6172696f}\
    \\?\Volume{19a771aa-c879-11df-867c-806d6172696f}\
    \\?\Volume{74dbb846-c861-11df-8b37-0017312d9bef}\
    \\?\Volume{f07625aa-ce16-11df-9393-8aa36c28ea4d}\
    \\?\Volume{f07625ab-ce16-11df-9393-8aa36c28ea4d}\

Также можно попытаться отслеживать монтирование и при наличии определённой смонтированной флэшки размонтировать её и т.п. Муторно.
3. а) да; б) утечка памяти — это разрастание занимаемой процессом памяти, working set («Память-использование» в «Диспетчере задач»); загрузка процессора тут не при чём. В Вашем случае это будет не особо заметно, потому как менеджер очистки памяти будет периодически подчищать автоматом.
4. Поищите по форуму насчёт других способов отслеживания подключенных флэшек. Кроме той темы в Коллекции, где Вы брали данный кусок скрипта, есть и другие способы. Помимо того, поищите и в «Разработке…», откуда в Коллекцию и попадают скрипты. Я против не самого «On Error Resume Next», а против бездумного его использования.
5. Ясно.

5 (изменено: serrrr, 2010-10-29 16:08:37)

Re: VBScript: Скрипт не отпускает флешку

«Unlocker» у меня установлен, но с его помощью отследить не удаётся. Он же используется для удаления файлов, а любой файл с флешки удаляется свободно. Поэтому решил не морочить голову ни себе , ни людям и послушал доброго совета, взял другой скрипт.

set objwmi = getobject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
set disks = objwmi.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent " _
          & "WITHIN 1 WHERE TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.DriveType = 2")
set fso = createobject("scripting.filesystemobject")
    Set objFSO   = WScript.CreateObject("Scripting.FileSystemObject")
do while true
    set remdisk = disks.nextevent
        set ws=createobject("wscript.shell")
Set FSO=CreateObject("Scripting.FileSystemObject") 
    if remdisk.TargetInstance.DeviceID <> "A:" then _
    fso.copyfile "C:\1.txt", remdisk.TargetInstance.DeviceID & "\"
    ws.run remdisk.TargetInstance.DeviceID & "\SKL\proverka.exe", 0, false
 If objFSO.FileExists(remdisk.TargetInstance.DeviceID & "\SKL\proverka1.txt") Then
        ws.run("C:\proverka1.exe"), 0, false
    End If   
loop

Теперь флешка отключается с первого раза, только без "On Error Resume Next" обойтись не получается, при отсутствии на флешке файла proverka1.txt выдаёт ошибку.

6

Re: VBScript: Скрипт не отпускает флешку

serrrr пишет:

«Unlocker» у меня установлен, но с его помощью отследить не удаётся. Он же используется для удаления файлов, а любой файл с флешки удаляется свободно.

1. Он используется прежде всего для отслеживания каким процессом заблокирован файл. Удаление/перемещение и т.п. — побочные функции.
2. Как именно отслеживали? Находясь на уровне диска? Попробуйте, при наличии вышеописанной ситуации, имея текущим диском не диск с флэшкой, выполнить такую команду:

"%ProgramFiles%\Unlocker\Unlocker.exe" <буква устройства смонтированной флэшки>:\

например

"%ProgramFiles%\Unlocker\Unlocker.exe" J:\

Но, подозреваю, что блокировал её упомянутый в первом посте скрипт.

serrrr пишет:

Теперь флешка отключается с первого раза, только без "On Error Resume Next" обойтись не получается, при отсутствии на флешке файла proverka1.txt выдаёт ошибку.

Ознакомьтесь с Правилами форума, п. 4.12, после чего продолжим уже предметный разговор.