none
отслеживание копирования RRS feed

  • Вопрос

  • Есть любая win NT, с любой файловой системой, на этой локальной машине следует провернуть: Как только происходит копирование на сьемный носитель (флешка, диск) следует тут же отправить подробную инфу на сервер; если сервер недоступен, то повторить чуть поже.......Какие могут быьт варианы? заранее благодарю....
    14 ноября 2006 г. 8:55

Ответы

  • В WMI нет возможности сразу следить за всеми потомками в иерархии классов базовой директории, поэтому приходится отправлять запросы на события для всех вложенных дирректорий и обрабатывать все это дело асинхронно. Косяк такого метода в том, что если юзер создаст свою дирректорию, то сможет вполне бесследно скопировать туда файл! Это было бы не проблема, если можно было бы отследить создание папки, но насколько я понял, в WMI такое тоже нельзя реализовать (разумеется если только, тупо не сканировать содержимое и сравнивать с содержимым предыдущего сканирования). Может мои результаты кому-нибуть помогут, мне они не помогли - я уволен на испытательном сроке :)

     

    P.S.: сравнение дат создания и модификации файла, для идентификации копирования/создания файла, допишет тот кому это будет необходимо...

    P.P.S: еще неплохо бы продумать выход из скрипта при отсоединении устройства...

     

    'Функция перебирает все поддирректории указанной дирректории path

    Sub IterFolders(path, wql_path)

      UseFolder(wql_path)

      Dim objFolder, objSubfolder, objSubfolders

      Set objFolder = objFSO.GetFolder(path)

      Set objSubfolders = objFolder.Subfolders

      For Each objSubfolder in objSubfolders

        wql_path = wql_path & "\\\\" & objSubfolder.Name

        IterFolders objSubfolder.Path, wql_path

      Next

    End Sub

     

    'Отсылает запрос на перехват события создания файла в дирректории path

    Sub UseFolder(path)

      If f_first_path = true Then

        path = path & "\\\\"

        f_first_path = false

      End If

      objService.ExecNotificationQueryAsync objSink, "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE " _

                & "TargetInstance ISA 'CIM_DirectoryContainsFile' and " _

                & "TargetInstance.GroupComponent = 'Win32_Directory.Name=""" & path & """'"

    End Sub

     

    'Функция проверяет создан ли был файл или скопирован, если копирован - возвращает true

    '!!!Недоделана!!!

    Function FileIsCopy(path)

      Dim objFile

      Set objFile = objFSO.GetFile(path)

      MsgBox objFSO.DateCreated

      MsgBox objFSO.DateLastAccessed

      MsgBox objFSO.DateLastModified

    End Function

     

    'путь к коренной дирректории и флаг сопоставления пути для wql-запроса

    Dim basepath, f_path

    basepath = "h:"

    f_first_path = true

     

    'объекты: FSO для перебора папок; SWbemServices и SWbemSink для ассинхронного запроса;

    Dim objFSO, objService, objSink

    Set objFSO = CreateObject("Scripting.FileSystemObject")

    Set objService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")

    Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")

     

    'поехали :)

    IterFolders basepath, basepath

    'асинхронный запрос

    bdone = False

    'цикл ожидания, пока выполнится запрос

    While Not bdone

        WScript.Sleep 1000

    Wend

     

    'обработчик события OnObjectReady

    Sub Sink_OnObjectReady(objWbemObject, objWbemAsyncContext)

        Wscript.Echo objWbemObject.TargetInstance.PartComponent

        'FileIsCopy(objWbemObject.TargetInstance.PartComponent)

    End Sub

    'обработчик события OnCompleted

    Sub Sink_OnCompleted(iHResult, objWbemErrorObject, objWbemAsyncContext)

        If iHResult=0 Then 'проверка кода возврата запроса

            WScript.Echo "Запрос завершён успешно."

        End If

        bdone = True 'флаг завершения запроса

    End Sub

    26 ноября 2006 г. 22:42

Все ответы

  • Здравствуйте!

    Могу порекоммендовать программу DeviceLock - http://www.protect-me.com/ru/dl/

    Она обладает необходимым функционалом.

    14 ноября 2006 г. 9:16
  • А если выполнять собственными силами на vbs или .net
    14 ноября 2006 г. 9:33
  • Нет, невозможно. Но можно отключить либо запись на флэшки, либо совсем.

    Для XP SP2

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

    Create a new key called StorageDevicePolicies and create a REG_DWORD under it called WriteProtect and set the value to 1

    Совсем запретить:

    HKLM\system\currentcontrolset\services\USBstor.
    Change the value of the dword "Start" from 3 to 4.

     

    14 ноября 2006 г. 10:11
  • А как узнать как происходит копирование, какие затрагиваются службы и как сними работать? Может хуки следует по апи написать?
    14 ноября 2006 г. 10:42
  • Почему же невозможно? Возможно средствами WMI следить за подключением флешек и за изменениями объектов файловой системы, затем отправлять отчеты по SMTP. Но если, как уже ответили, есть готовый DriveLock, который может решать эти задачи, то зачем изобретать велосипед?
    15 ноября 2006 г. 8:48
  •  Andrey Ivanov - MSFT написано:
    Почему же невозможно? Возможно средствами WMI следить за подключением флешек и за изменениями объектов файловой системы, затем отправлять отчеты по SMTP. Но если, как уже ответили, есть готовый DriveLock, который может решать эти задачи, то зачем изобретать велосипед?

    у меня складывается мнение, что вы не понимаете, что человек от вас хочет узнать...

    он хочет узнать, можно ли стандартными утилитами винды (или даже другими) следить за перемещением файлов в системе (точнее копировании).

    моё имхо: да возможно, как уже сказали, можно повесить хуки на апи и ваша процедура будет вызваться при копировании. соотвественно программу надо будет писать вам самим, потому как я такой не видел. есть одна маленькая проблема. к примеру Total Commander не будет отслеживаться или другие программы копирования, и команда консоли "copy".

    кстати, есть еще такая штука в файловой системе как журналирование. если мне не изменяет память то в NTFS оно есть. только я с этим не работал.

    извените, если что то не так понял

    15 ноября 2006 г. 8:55
  • Роман, но я так и ответил: возможно. Я предложил использовать события WMI, поскольку этот способ не обладает указанными вами недостатками хуков на апи. Но! Если уже все написано, то зачем тратить время на разработку?

    В NTFS есть аудит, но на флэшках редко бывает NTFS. ;)

    15 ноября 2006 г. 9:05
  • Кто-нибудь может дать пример как писать хук на апи-функции?
    17 ноября 2006 г. 14:12
  • Есть продукты, которые контролируют использование USB устройств, например:

    http://www.safend.com/200-en/USB%20Data%20Protection.aspx

    http://www.ezaudit.net/

    Если орыться, то можно найти и еще

    17 ноября 2006 г. 14:38
    Модератор
  • Я пишу собственный продукт, ломать чужие не хочу и не умею, так что...
    17 ноября 2006 г. 14:45
  •  andeath написано:
    Я пишу собственный продукт, ломать чужие не хочу и не умею, так что...

    Остается только пожелать удачи. По отзывам, Device Lock, не смотря на многолетнюю историю продукта, рекламу, сертификаты все же доставляет множество проблем, но лучшего продукта при этом нет. А вы готовы потягаться с ДиалогНаукой. :-)

    19 ноября 2006 г. 15:19
  • Не понял, с помощью WMI можно сделать все то что я описал в начале?

    Насколько, я заметил WMI позволяет отслеживать только создание, удаление и изменение файлов в указанной области. Решение задачи было бы возможно, если бы  WMI позволял как-нибудь реагировать на подключение новых запоминающих устройств. Такое возможно?

    А как определить самое важное - имя исходного файла? Можно путем сопостовления конечного и исходного файла. Но ведь если человек сохранит файл, скажем в Exel'e, через "Сохранить как..." и поменяет имя конечного файла, то мы в итоге получим очень размытую информацию?

    20 ноября 2006 г. 7:49
  • Не понял, с помощью WMI можно сделать все то что я описал в начале?

    Насколько, я заметил WMI позволяет отслеживать только создание, удаление и изменение файлов в указанной области. Решение задачи было бы возможно, если бы  WMI позволял как-нибудь реагировать на подключение новых запоминающих устройств. Такое возможно?

    А как определить самое важное - имя исходного файла? Можно путем сопостовления конечного и исходного файла. Но ведь если человек сохранит файл, скажем в Exel'e, через "Сохранить как..." и поменяет имя конечного файла, то мы в итоге получим очень размытую информацию?

    20 ноября 2006 г. 8:22
  • Вопросы касаются исключительно vbs:

    А есть метод определить копирование файла на CD? Для стандартного win-резака можно следить за папкой, куда винда временно кидает файлы (кстати, путь не напомните?), но как быть с Nero и т.п.

    Сложности добавляет то, что надо отслеживать пермещение ВСЕХ файлов, а не отдельных...

    На данный момент делаю:

    1) создаю скрипт следящий за текущими и новыми подключенными съемными дисками, Floppy и CD приводами, ну и за локальными дисками с интерфейсом usb (для внешних хардов). Если уже подключенны такие устройства, то для какждого из них запускается скрипт описанный во втором разделе.

    2) как только подключается запоминающее устройство к usb или втыкается floppy-дискета - запускается скрипт реагирующий на события записи и изменения файлов. Если таковое наступает - отпраляем данные на сервер.

    3) после отключения устройства убиваю процесс.

    В связи со всем этим возникает следующие вопросы:

    1) как определить наличие дискеты во флопи-приводе и диска в сдруме?

    2) как запустить из одного скрипта другой, запомнить id процесса и убить по id процесс?

    20 ноября 2006 г. 10:30
  • У меня на работе есть хорошая присказка "MSDN, батенька". Произношу не я :) Я обычно говорю "Гугл".

    По первому вопросу ответ, но скрипеть будет:

    With CreateObject("Scripting.FileSystemObject")
      Set dc = .Drives
      For Each d in dc
        If d.DriveLetter = "A" Then
          Do While d.IsReady

    А вообще у тебя задача всё больше и больше разрастается, поэтому рекомендую сделать ход конём:

    http://www.microsoft.com/technet/sysinternals/FileAndDisk/Filemon.mspx найди исходники. Когда-то (меньше пары месяцев назад) они раздавались, если мне не изменяет память. Даже без исходников - запускаешь filemon, делаешь вывод в файл, ставишь исключающий фильтр на локальные диски и остаётся только распарсить результат. Отличное решение.

    Помогло?

    20 ноября 2006 г. 19:24
  • Данила Полевщиков, ну если речь зашла о WMI то можно пример основаный на его объектах, а не на FSO?(достаточно указать св-во объекта для логических дисков, типа .IsReady).

    Еще вопрос: 1) как можно определить какие логические диски соответствуют физическим; 2) возможно ли используя WMI и методику в ссылках на примеры приведенных выше, узнать какой именно файл был скачен (полный путь)

    + ссылка, к сожалению, мертвая...

    20 ноября 2006 г. 22:26
  •  andeath написано:

    Данила Полевщиков, ну если речь зашла о WMI то можно пример основаный на его объектах, а не на FSO?(достаточно указать св-во объекта для логических дисков, типа .IsReady).

    Еще вопрос: 1) как можно определить какие логические диски соответствуют физическим; 2) возможно ли используя WMI и методику в ссылках на примеры приведенных выше, узнать какой именно файл был скачен (полный путь)

    + ссылка, к сожалению, мертвая...

    Какая ссылка мёртвая? на файлмон? Только что открыл.

    www.sysinternals.com 

    http://www.microsoft.com/technet/sysinternals/default.mspx

    Сам же просил "вопросы касаются только vbs". Вот для vbs:

    Свойство DriveType=Removable показывает, что диск извлекаемый.

    switch (d.DriveType)
       {
          case 0: t = "Unknown"; break;
          case 1: t = "Removable"; break;
          case 2: t = "Fixed"; break;
          case 3: t = "Network"; break;
          case 4: t = "CD-ROM"; break;
          case 5: t = "RAM Disk"; break;
       }

    Другие свойства:AvailableSpace Property | DriveLetter Property | DriveType Property | FileSystem Property | FreeSpace Property | IsReady Property | Path Property | RootFolder Property | SerialNumber Property | ShareName Property | TotalSize Property | VolumeName Property

    Для wmi (status, mediatype, statusinfo и другие посмотри):

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_LogicalDisk", , 48)
    For Each objItem In colItems
    If objItem.Description = "Дисковод 3,5 дюйма" Then
    MsgBox "Access: " & objItem.Access
    MsgBox "Availability: " & objItem.Availability
    MsgBox "BlockSize: " & objItem.BlockSize
    MsgBox "Caption: " & objItem.Caption
    MsgBox "Compressed: " & objItem.Compressed
    MsgBox "ConfigManagerErrorCode: " & objItem.ConfigManagerErrorCode
    MsgBox "ConfigManagerUserConfig: " & objItem.ConfigManagerUserConfig
    MsgBox "CreationClassName: " & objItem.CreationClassName
    MsgBox "Description: " & objItem.Description
    MsgBox "DeviceID: " & objItem.DeviceID
    MsgBox "DriveType: " & objItem.DriveType
    MsgBox "ErrorCleared: " & objItem.ErrorCleared
    MsgBox "ErrorDescription: " & objItem.ErrorDescription
    MsgBox "ErrorMethodology: " & objItem.ErrorMethodology
    MsgBox "FileSystem: " & objItem.FileSystem
    MsgBox "FreeSpace: " & objItem.FreeSpace
    MsgBox "InstallDate: " & objItem.InstallDate
    MsgBox "LastErrorCode: " & objItem.LastErrorCode
    MsgBox "MaximumComponentLength: " & objItem.MaximumComponentLength
    MsgBox "MediaType: " & objItem.MediaType
    MsgBox "Name: " & objItem.Name
    MsgBox "NumberOfBlocks: " & objItem.NumberOfBlocks
    MsgBox "PNPDeviceID: " & objItem.PNPDeviceID
    MsgBox "PowerManagementCapabilities: " & objItem.PowerManagementCapabilities
    MsgBox "PowerManagementSupported: " & objItem.PowerManagementSupported
    MsgBox "ProviderName: " & objItem.ProviderName
    MsgBox "Purpose: " & objItem.Purpose
    MsgBox "Size: " & objItem.Size
    MsgBox "Status: " & objItem.Status
    MsgBox "StatusInfo: " & objItem.StatusInfo
    MsgBox "SupportsFileBasedCompression: " & objItem.SupportsFileBasedCompression
    MsgBox "SystemCreationClassName: " & objItem.SystemCreationClassName
    MsgBox "SystemName: " & objItem.SystemName
    MsgBox "VolumeName: " & objItem.VolumeName
    MsgBox "VolumeSerialNumber: " & objItem.VolumeSerialNumber
    End If
    Next


     

    21 ноября 2006 г. 7:57
  • Очень важно! В WMI возможно отследить создание, удаление и изменение файла в указанной дирректории, но как определить был ли этот файл создан посредством перемещения/копирования и как узнать откуда он был скопирован? Если хотя бы можно было следить за чтением файлов...

    Сейчас, еще посмотрю filemon, если на выше поставленный вопрос, нет вариантов, то снова берусь за написание api-hook'a...

    21 ноября 2006 г. 10:59
  • http://www.microsoft.com/technet/scriptcenter/csc/scripts/logs/monitoring/csclo040.mspx

    Тут есть статья про мониторинг usb девайсов

    Language: VBScript

    Description: Runs in the background and sends an email any time a USB storage device is plugged into a computer.

    Language: VBScript

    Description: Runs in the background and sends an email any time a USB storage device is plugged into a computer.

    21 ноября 2006 г. 12:38
  • В статье описывается пример скрипта реагирующего на подключение usb-устройств и отправка инфы через smtp. На этапе когда я даже не могу узнать: копируется файл или просто создается - пример впринципе безполезен....

    Не знаю, за что сейчас хвататься - толи за api-hook, толи за .net...второе вообще не знаю, а первое сулит большим гемороем...

    21 ноября 2006 г. 20:17
  •  andeath написано:

    В статье описывается пример скрипта реагирующего на подключение usb-устройств и отправка инфы через smtp. На этапе когда я даже не могу узнать: копируется файл или просто создается - пример впринципе безполезен....

    Не знаю, за что сейчас хвататься - толи за api-hook, толи за .net...второе вообще не знаю, а первое сулит большим гемороем...

    "Решение задачи было бы возможно, если бы  WMI позволял как-нибудь реагировать на подключение новых запоминающих устройств".

    Сами же просили, вам и ответили.

    Садитесь и пишите строгое ТЗ. Иначе каша какая-то уже в голове.

    p.s. А узнать, было ли копирование файла, не сложно - при создании дата создания ставиться сегодняшняя, и модификации тоже, а при копировании меняется только дата модификации.

     

    22 ноября 2006 г. 15:24
  • "Сами же просили, вам и ответили" (c)

    Ну с ходу ведь, я в WMI не разобрался...если следить за сообщениями, мне кажется, все становится понятно...

    "Садитесь и пишите строгое ТЗ" (с)

    у меня задача не усложняется, а вертится вокруг одного и того же трабла...см. первое сообщение...

    "p.s. А узнать, было ли копирование файла, не сложно..." (с)

    Ага, осталось всего-то узнать путь к файлу который был скопирован...вообще, не хочется использовать такие примитивные методы...типа если файл будет создан сегодня и сегодня его скопируют, то получится - лажа!

    Я, по-аналогу, сначала хотел отправлять на сервер конечный файл, а не исходный...

    P.S.: нашел и осмыслил пример апи-хука http://www.cracklab.ru/pro/cpp.php?r=appli&d=zart217

    ...но он применим только к определенному процессу...я так понял, что писать самому подобное проблемотично, ибо там требуется знание ассемблера...разве что, можно только по аналогии применять к  своей проге...

    22 ноября 2006 г. 21:25
  • Все-таки у меня сложилось впечатление, что исходная задача сформулирована нечетко. Значит так.

    Пользователи имеют право использовать устройства со сменным носителем, могут копировать на них файлы и создавать новые. Необходимо иметь информацию, какие именно файлы и кем были скопированы, так? А цель? 

     

    22 ноября 2006 г. 21:52
    Модератор
  • Igor Leyko, к вашему описанию задачи можно добавить, что все это должно происходить в реальном времени...

    А цель? Организация безопасности? Если чесно, точно я сам не знаю... у меня есть задача, а цель мне не поможет в ее решении...тем более что сомневаюсь, буду ли я писать обработчик данных поступивших на сервер...

    p.s.:

    "типа если файл будет создан сегодня и сегодня его скопируют, то получится - лажа!" (с) Я

    каюсь, сразу не посмотрел, что регистрируется точная инфа о создании/модификации файла вплоть до секунд...но все равно обидно, что нельзя узнать от куда был скопирован файл...

    22 ноября 2006 г. 23:01
  • В момент копирования происходит открытие исходного файла, так что, наверняка, вы можете отслеживать события __InstanceOperationEvent объектов файловой системы в WMI.
    23 ноября 2006 г. 8:41
  • Если цель - организация безопасности, то не проще ли ограничить или запретить использование устройств со сменными носителями?

    Отслеживать копирование файлов - спорно. Человек может, к примеру, выполнить copy /b продажи.mdb A:\fun.mp3, и какой результат даст слежение за копированием? Слежение за открытием файлов тоже ничего не даст, если файлы нужны для работы, а не лежат в архивной папке.

    23 ноября 2006 г. 11:31
    Модератор
  • case 0: t = "Unknown"; break;
    case 1: t = "Removable"; break;
    case 2: t = "Fixed"; break;
    case 3: t = "Network"; break;
    case 4: t = "CD-ROM"; break;
    case 5: t = "RAM Disk"; break;

    вообще то это сменный носитель, а не извлечённый девайс вроде

    23 ноября 2006 г. 11:44
  • "вы можете отслеживать события __InstanceOperationEvent объектов" (с) Andrey Ivanov

    О событии чтения файлов, ранее в msdn ничего не нашел...сейчас еще поковыряюсь, а вообще я тоже сначала думал отслеживать события чтения и записи, и сопостовлять имена или расширения (для любителей сохранять через приложения) файлов. Если у вас есть пример - дайте ссылку пожалуйста...

    В filemon и вообще в С++ решил больше не ковыряться, буду до последнего биться на vb...но боюсь мой скрипт будет заметно подтормаживать систему...

    "...то не проще ли ограничить или запретить использование устройств со сменными носителями?" (c) Igor Leyko

    Проще! Но от меня этого не требуют...

    "Человек может, к примеру, выполнить copy /b продажи.mdb A:\fun.mp3" (с)

    На данный момент я эту ситуацию опускаю, многие пользователи даже не знают что есть командная строка....повторяю: на данный момент...

    p.s.: как процессу моего скрипта назначить повышенный приоритет?

    24 ноября 2006 г. 10:42
  •  undeath написано:
    как процессу моего скрипта назначить повышенный приоритет?

    start /belownormal calc

    24 ноября 2006 г. 13:59
  • belownormal - это пониженный. Повышенный - abovenormal
    24 ноября 2006 г. 15:02
    Модератор
  • start /belownormal calc (с)

    вы предлагаете создать bat-файл, и запускать его вместо файла-скрипта? а это прокатит для всех версий виндоус?

    Выявил ОЧЕНЬ неприятную особенность, следующий код следит только за указанной папкой, неучитывая вложенные... это дело поправимое?

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & _
            strComputer & "\root\cimv2")

    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
        ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _
            & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
                & "TargetInstance.GroupComponent= " _
                    & "'Win32_Directory.Name=""h:\\\\""'")

    Do
        Set objLatestEvent = colMonitoredEvents.NextEvent
        Wscript.Echo objLatestEvent.TargetInstance.PartComponent
    Loop

    24 ноября 2006 г. 15:34
  •  Igor Leyko написано:
    belownormal - это пониженный. Повышенный - abovenormal

    Да, на автопилоте отвечал. Впрочем, два замечания:

    1) автор вопроса прочитаешь start /?, чтобы узнать что такое belownormal и какие еще бывают.

    2) программист должен знать английский. have to :) У нас был один студент, он знал немецкий. Через пару месяцев уволился, не прошёл испытания, но один его проект остался работать. Когда я туда полез, долго плевался: у него все функции назывались примерно так: PersonMitSales. :)

    24 ноября 2006 г. 21:01
  • Ну, я предложил самое первое пришедшее на ум решение. Бат файл писать не нужно, есть же

    dim wShell
    Set wShell = CreateObject("WScript.Shell")
    wShell.Run("start /realtime calc.exe")

    Только /realtime конечно же шутка. А еще у wshell есть забавный метод specialfolders, может пригодится. Хотя вряд ли.

    Всё, закрывайте тему. Я уже начинаю сомневаться, кто же из нас программист, решающий поставленную задачу. Еще неделя, и мы вам весь код напишем. Информации вам дали достаточно, пора уже открывать MSDN и вдумчиво читать, и писать код. И всё-таки начните с ТЗ, То, что вы написали - это видение, а не ТЗ.

    p.s. Закрывая тему, можно указать "отметить как ответ" на сообщениях, которые могут помочь человеку, наткнувшемуся на тему и решающему ту же задачу. Чтоб читать только важное, а не всё подряд. Спасибо

    24 ноября 2006 г. 21:36
  • Впринципе, установка приоритета - это баловство, что делать со скриптом? время уже поджимает...

    Может настроить Log Event на чтение/запись файлов и как только записывается файл-отчет в некоторую дирректорию - хватать его и обрабатывать через vba+wmi?

    24 ноября 2006 г. 21:40
  • И, кстати, позвольте представить: microsoft powershell. Замена WSH.

    1)Управление всеми задачами администратора windows из командной строки

    2)Один интерфейс к wmi, xml, bat и прочему.

    http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx

    24 ноября 2006 г. 21:58
  • Насколько я изучил к данному моменту WMI, могу заявить: проблемма находится в WQL-запросе моего кода, в условии...

    Скачал WMI Tools, буду разбираться со здешней иерархией.

    Пара статей на русском про WMI, оказавшиеся для меня поленными:

    http://www.askit.ru/progr_admin/progr_admin_m14.htm

    http://www.script-coding.info/WMI.html

    Возможно ли "полноценно" следить за дирректорией...если узнаю - выложу скрипт....всем спасибо...тема закрыта...

    25 ноября 2006 г. 10:04
  • В WMI нет возможности сразу следить за всеми потомками в иерархии классов базовой директории, поэтому приходится отправлять запросы на события для всех вложенных дирректорий и обрабатывать все это дело асинхронно. Косяк такого метода в том, что если юзер создаст свою дирректорию, то сможет вполне бесследно скопировать туда файл! Это было бы не проблема, если можно было бы отследить создание папки, но насколько я понял, в WMI такое тоже нельзя реализовать (разумеется если только, тупо не сканировать содержимое и сравнивать с содержимым предыдущего сканирования). Может мои результаты кому-нибуть помогут, мне они не помогли - я уволен на испытательном сроке :)

     

    P.S.: сравнение дат создания и модификации файла, для идентификации копирования/создания файла, допишет тот кому это будет необходимо...

    P.P.S: еще неплохо бы продумать выход из скрипта при отсоединении устройства...

     

    'Функция перебирает все поддирректории указанной дирректории path

    Sub IterFolders(path, wql_path)

      UseFolder(wql_path)

      Dim objFolder, objSubfolder, objSubfolders

      Set objFolder = objFSO.GetFolder(path)

      Set objSubfolders = objFolder.Subfolders

      For Each objSubfolder in objSubfolders

        wql_path = wql_path & "\\\\" & objSubfolder.Name

        IterFolders objSubfolder.Path, wql_path

      Next

    End Sub

     

    'Отсылает запрос на перехват события создания файла в дирректории path

    Sub UseFolder(path)

      If f_first_path = true Then

        path = path & "\\\\"

        f_first_path = false

      End If

      objService.ExecNotificationQueryAsync objSink, "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE " _

                & "TargetInstance ISA 'CIM_DirectoryContainsFile' and " _

                & "TargetInstance.GroupComponent = 'Win32_Directory.Name=""" & path & """'"

    End Sub

     

    'Функция проверяет создан ли был файл или скопирован, если копирован - возвращает true

    '!!!Недоделана!!!

    Function FileIsCopy(path)

      Dim objFile

      Set objFile = objFSO.GetFile(path)

      MsgBox objFSO.DateCreated

      MsgBox objFSO.DateLastAccessed

      MsgBox objFSO.DateLastModified

    End Function

     

    'путь к коренной дирректории и флаг сопоставления пути для wql-запроса

    Dim basepath, f_path

    basepath = "h:"

    f_first_path = true

     

    'объекты: FSO для перебора папок; SWbemServices и SWbemSink для ассинхронного запроса;

    Dim objFSO, objService, objSink

    Set objFSO = CreateObject("Scripting.FileSystemObject")

    Set objService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")

    Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")

     

    'поехали :)

    IterFolders basepath, basepath

    'асинхронный запрос

    bdone = False

    'цикл ожидания, пока выполнится запрос

    While Not bdone

        WScript.Sleep 1000

    Wend

     

    'обработчик события OnObjectReady

    Sub Sink_OnObjectReady(objWbemObject, objWbemAsyncContext)

        Wscript.Echo objWbemObject.TargetInstance.PartComponent

        'FileIsCopy(objWbemObject.TargetInstance.PartComponent)

    End Sub

    'обработчик события OnCompleted

    Sub Sink_OnCompleted(iHResult, objWbemErrorObject, objWbemAsyncContext)

        If iHResult=0 Then 'проверка кода возврата запроса

            WScript.Echo "Запрос завершён успешно."

        End If

        bdone = True 'флаг завершения запроса

    End Sub

    26 ноября 2006 г. 22:42
  • Как узнать какая информация была скопирована с флешки (CD диска) или на нее?
    8 сентября 2011 г. 19:05