как только в папке появляется файл, его нужно тут же удалить
От: sandrey_  
Дата: 25.02.04 11:30
Оценка:
Задача: если в папке появляется exe-файл, сразу же удалять его.
Решаю так: пишу сервис под Win2000 и в нем использую ReadDirectoryChangesW:
   ol.hEvent = hStopEvent[1];
   lstrcpy(szFileName, pszScanDirName);
   dwFileNameOffset = lstrlen(pszScanDirName);
   lstrcpy(szFileName+dwFileNameOffset++, L"\\");

   while( 1 ){
      ZeroMemory(pBuffer, dwBufferSize);
      ReadDirectoryChangesW(hScanDir, pBuffer, dwBufferSize, TRUE,
         FILE_NOTIFY_CHANGE_FILE_NAME, &dwRealBufferSize, &ol, NULL);

      if( WaitForMultipleObjects(2, hStopEvent, FALSE, INFINITE)==WAIT_OBJECT_0+1 ){
         pInfo = (FILE_NOTIFY_INFORMATION*)pBuffer;
         while( 1 ){
            if( pInfo->Action==FILE_ACTION_ADDED || pInfo->Action==FILE_ACTION_RENAMED_NEW_NAME ){
               lstrcpyn(szFileName+dwFileNameOffset, pInfo->FileName, pInfo->FileNameLength+1);
               DeleteFile(szFileName);
...

Однако DeleteFile не срабатывает (GetLastError()==ERROR_SHARING_VIOLATION). Я думаю дело в том, что сообщение о том, что в директории появился новый файл, приходит в момент создания этого файла, а не в момент когда он полностью скопировался в эту директорию. Я хотел вместо DeleteFile вызывать CreateFile c параметром FILE_FLAG_DELETE_ON_CLOSE и сразу CloseHandle(hFile) (ну типа когда докопируешься, то сразу же удаляйся). Но CreateFile не проходит, т.к. файл открыт монопольно....
Как решить эту проблему?
В идеале мне нужно что бы ReadDirectoryChangesW сообщала об изменениях в директории в тот момент когда скопированный туда файл уже полностью лежит в этой самой директории. Но как это сделать? Может определить и описать функцию, которая передается последним параметром в ReadDirectoryChangesW (тип LPOVERLAPPED_COMPLETION_ROUTINE) и/или использовать ожидающие функции с окончанием Ex (и параметром bAlertable). Эта область WinApi для меня не знакома. Поэтому буду благодарен не только за подсказки в решении проблемы, но и ссылки на литературу (на русском) по этой теме.
Re: как только в папке появляется файл, его нужно тут же уда
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 25.02.04 11:33
Оценка:
Здравствуйте, sandrey_, Вы писали:

[]

_>Однако DeleteFile не срабатывает (GetLastError()==ERROR_SHARING_VIOLATION). Я думаю дело в том, что сообщение о том, что в директории появился новый файл, приходит в момент создания этого файла, а не в момент когда он полностью скопировался в эту директорию. Я хотел вместо DeleteFile вызывать CreateFile c параметром FILE_FLAG_DELETE_ON_CLOSE и сразу CloseHandle(hFile) (ну типа когда докопируешься, то сразу же удаляйся). Но CreateFile не проходит, т.к. файл открыт монопольно....

_>Как решить эту проблему?

Решение в лоб: запускаем поток, в котором пытаемся открыть файл на запись. Как только это удалось — закрываем его, удаляем и вываливаемся из потока.
Re: как только в папке появляется файл, его нужно тут же уда
От: SergH Россия  
Дата: 25.02.04 11:34
Оценка:
Здравствуйте, sandrey_, Вы писали:

_>Задача: если в папке появляется exe-файл, сразу же удалять его.

_>Решаю так: пишу сервис под Win2000 и в нем использую ReadDirectoryChangesW:
..
_>Однако DeleteFile не срабатывает (GetLastError()==ERROR_SHARING_VIOLATION). Я думаю дело в том, что сообщение о том, что в директории появился новый файл, приходит в момент создания этого файла, а не в момент когда он полностью скопировался в эту директорию.

Скорее всего так и есть. Проблема несколько раз уже обсуждалась, насколько я помню ничего хорошего не придумали. Но метод всегда остаётся метод "опроса", т.е. можно вызывать DeleteFile в цикле с задержкой. Чтобы это не влияло на обнаружение следующего файла, можно породить отдельный поток.
Делай что должно, и будь что будет
Re: как только в папке появляется файл, его нужно тут же уда
От: BlackHeretic Израиль  
Дата: 25.02.04 11:40
Оценка:
Здравствуйте, sandrey_, Вы писали:

_>Задача: если в папке появляется exe-файл, сразу же удалять его.

_>Решаю так: пишу сервис под Win2000 и в нем использую ReadDirectoryChangesW:
_>
_>   ol.hEvent = hStopEvent[1];
_>   lstrcpy(szFileName, pszScanDirName);
_>   dwFileNameOffset = lstrlen(pszScanDirName);
_>   lstrcpy(szFileName+dwFileNameOffset++, L"\\");

_>   while( 1 ){
_>      ZeroMemory(pBuffer, dwBufferSize);
_>      ReadDirectoryChangesW(hScanDir, pBuffer, dwBufferSize, TRUE,
_>         FILE_NOTIFY_CHANGE_FILE_NAME, &dwRealBufferSize, &ol, NULL);

_>      if( WaitForMultipleObjects(2, hStopEvent, FALSE, INFINITE)==WAIT_OBJECT_0+1 ){
_>         pInfo = (FILE_NOTIFY_INFORMATION*)pBuffer;
_>         while( 1 ){
_>            if( pInfo->Action==FILE_ACTION_ADDED || pInfo->Action==FILE_ACTION_RENAMED_NEW_NAME ){
_>               lstrcpyn(szFileName+dwFileNameOffset, pInfo->FileName, pInfo->FileNameLength+1);
_>               DeleteFile(szFileName);
_>...
_>

_>Однако DeleteFile не срабатывает (GetLastError()==ERROR_SHARING_VIOLATION). Я думаю дело в том, что сообщение о том, что в директории появился новый файл, приходит в момент создания этого файла, а не в момент когда он полностью скопировался в эту директорию. Я хотел вместо DeleteFile вызывать CreateFile c параметром FILE_FLAG_DELETE_ON_CLOSE и сразу CloseHandle(hFile) (ну типа когда докопируешься, то сразу же удаляйся). Но CreateFile не проходит, т.к. файл открыт монопольно....
_>Как решить эту проблему?
_>В идеале мне нужно что бы ReadDirectoryChangesW сообщала об изменениях в директории в тот момент когда скопированный туда файл уже полностью лежит в этой самой директории. Но как это сделать? Может определить и описать функцию, которая передается последним параметром в ReadDirectoryChangesW (тип LPOVERLAPPED_COMPLETION_ROUTINE) и/или использовать ожидающие функции с окончанием Ex (и параметром bAlertable). Эта область WinApi для меня не знакома. Поэтому буду благодарен не только за подсказки в решении проблемы, но и ссылки на литературу (на русском) по этой теме.

Если речь идет о злобном GAIN, то слышал что помогает его попортить что бы не запускался — и всех делов
ICQ 156156278
Re[2]: как только в папке появляется файл, его нужно тут же
От: sandrey_  
Дата: 25.02.04 11:49
Оценка:
Здравствуйте, BlackHeretic, Вы писали:

BH>Если речь идет о злобном GAIN, то слышал что помогает его попортить что бы не запускался — и всех делов


Да нет, тут вот какая проблема: на сервере есть ресурс (папка) с полным доступом для ВСЕХ пользователей. Папка сделана для того что бы пользователи могли обмениваться файлами (в основном документами). Но злобные юзеры стали обмениваться фильмами, музыкой и игрушками. От фильмов избавились введением квотирования. А от игрушек (часто зараженных вирусами; особенно достал FunLove) избавиться решили таким вот образом (т.е. удалять любой exe-шник в этой папке сразу, как только он появляется)
Re[3]: как только в папке появляется файл, его нужно тут же
От: SergH Россия  
Дата: 25.02.04 12:06
Оценка:
Здравствуйте, sandrey_, Вы писали:

_>Да нет, тут вот какая проблема: на сервере есть ресурс (папка) с полным доступом для ВСЕХ пользователей. Папка сделана для того что бы пользователи могли обмениваться файлами (в основном документами). Но злобные юзеры стали обмениваться фильмами, музыкой и игрушками. От фильмов избавились введением квотирования. А от игрушек (часто зараженных вирусами; особенно достал FunLove) избавиться решили таким вот образом (т.е. удалять любой exe-шник в этой папке сразу, как только он появляется)


Тупиковый путь. Во-первых можно заархивировать, во-вторых просто сменить расширение. Может проще попросить атнивирус сканировать эту папку (если такое возможно)?
Делай что должно, и будь что будет
Re[3]: как только в папке появляется файл, его нужно тут же
От: BlackHeretic Израиль  
Дата: 25.02.04 12:11
Оценка:
Здравствуйте, sandrey_, Вы писали:

_>Здравствуйте, BlackHeretic, Вы писали:


BH>>Если речь идет о злобном GAIN, то слышал что помогает его попортить что бы не запускался — и всех делов


_>Да нет, тут вот какая проблема: на сервере есть ресурс (папка) с полным доступом для ВСЕХ пользователей. Папка сделана для того что бы пользователи могли обмениваться файлами (в основном документами). Но злобные юзеры стали обмениваться фильмами, музыкой и игрушками. От фильмов избавились введением квотирования. А от игрушек (часто зараженных вирусами; особенно достал FunLove) избавиться решили таким вот образом (т.е. удалять любой exe-шник в этой папке сразу, как только он появляется)


Если юзеры не чайники алюминиевые — фишку просекут и начнут зипповать — мы так обходим почтовый файрвол на нашей фирме (упаси господь — не игрушки пересылаем — просто ломает все время через FTP работать).
На другой фирме админы это просекли и стали вскрывать зипы и проверять содержимое — кажется последним достижением тамошних жителей стала зипповка с последующим переименованием в BMP
Так что не заморачивайся
Хотя! Опять же — по моему идея не плохая — ты их не удаляй — ты их погань
А насчет ошибки — запусти отдельный процесс — ну поспи чуток — пока файл копируется, а потом как только так сразу. Где нить в важную область пропиши мусор и делов то
ICQ 156156278
Re[4]: как только в папке появляется файл, его нужно тут же
От: sandrey_  
Дата: 25.02.04 12:14
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Тупиковый путь. Во-первых можно заархивировать, во-вторых просто сменить расширение. Может проще попросить атнивирус сканировать эту папку (если такое возможно)?


Все правильно. Но как защита от дурака сойдет. Это во-первых. А во-вторых это спасет от распространения вируса: сейчас он распростаняется как — юзер запустил на своем компе зараженную программу, программа заразила все exe (именно exe) файлы которые только смогла, включая те, что были в общедоступной папке, а из общедоступной папки другие юзеры взяли зараженные exe-шники и запустили их. А будет — заразился юзер, но не заразил общедоступный ресурс — лавинного распространения вируса нет.

Вешали на папку Касперского — сканирует-то он только эту папку, а тормозит весь винт на сервере
Re[2]: как только в папке появляется файл, его нужно тут же
От: sandrey_  
Дата: 25.02.04 12:25
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Скорее всего так и есть. Проблема несколько раз уже обсуждалась, насколько я помню ничего хорошего не придумали.


жаль...

SH>Но метод всегда остаётся метод "опроса", т.е. можно вызывать DeleteFile в цикле с задержкой. Чтобы это не влияло на обнаружение следующего файла, можно породить отдельный поток.


Скорее всего так и сделаю
Спасибо.
Re[4]: как только в папке появляется файл, его нужно тут же
От: SergeySV2  
Дата: 25.02.04 12:32
Оценка:
По хорошему конечно это не сильно поможет в борьбе с вирусоми. Пока есть много чайников, которые могут приносить на комп (с дискет, из инета) и запускать на нем файлы, проблемы всегда останутся. Как наиболее радикальное решение — на компы служащих ставится антивирусная прога с мониторингом (файлов и приход. почты), обновление у нее настраивается автомат. с какого-нибудь сервера (иначе выброшенные деньги, сами юзеры ходить за обновлениями не будут). Так помойму делают в большинстве крупных компаниях.
Re: как только в папке появляется файл, его нужно тут же уда
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 26.02.04 01:43
Оценка:
H e l l o, sandrey_!

s> Задача: если в папке появляется exe-файл, сразу же удалять его.


Можно сделать немного по другому — не давать создавать этот файл.
Раз у нас сервис, то сами создаем файл с этим именем с монопольным
доступом.

--
Всего хорошего, Слава. (http://slava.users.otts.ru)
-= Во что ты все время играешь — пробел до пола продавил! =-
Posted via RSDN NNTP Server 1.8 beta
Re[2]: как только в папке появляется файл, его нужно тут же
От: sandrey_  
Дата: 26.02.04 04:53
Оценка:
Здравствуйте, Slava Antonov, Вы писали:

SA>Можно сделать немного по другому — не давать создавать этот файл.

SA>Раз у нас сервис, то сами создаем файл с этим именем с монопольным
SA>доступом.

"с этим именем"? Но ведь неизвестно заранее какой файл появится в папке.
Re[3]: как только в папке появляется файл, его нужно тут же
От: Pavel Dvorkin Россия  
Дата: 26.02.04 09:34
Оценка:
Привет!

sandrey_ wrote:
>
> Здравствуйте, BlackHeretic, Вы писали:
>
> BH>Если речь идет о злобном GAIN, то слышал что помогает его попортить что бы не запускался — и всех делов
>
> Да нет, тут вот какая проблема: на сервере есть ресурс (папка) с полным доступом для ВСЕХ пользователей. Папка сделана для того что бы пользователи могли обмениваться файлами (в основном документами). Но злобные юзеры стали обмениваться фильмами, музыкой и игрушками. От фильмов избавились введением квотирования. А от игрушек (часто зараженных вирусами; особенно достал FunLove) избавиться решили таким вот образом (т.е. удалять любой exe-шник в этой папке сразу, как только он появляется)

Если решить как хочется не получится, могу предложить другую идею. Не
удалять, а менять ему права доступа (я полагаю, там NTFS) так, чтобы его
эти юзеры читать не могли. . А удалять можно вручную раз в день.

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[3]: как только в папке появляется файл, его нужно тут же
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 28.02.04 01:06
Оценка:
H e l l o, sandrey_!

SA>> Можно сделать немного по другому — не давать создавать этот

SA>> файл. Раз у нас сервис, то сами создаем файл с этим именем с
SA>> монопольным доступом.

s> "с этим именем"? Но ведь неизвестно заранее какой файл появится в

s> папке.

Про это вы в постановке задачи не говорили

--
Всего хорошего, Слава. (http://slava.users.otts.ru)
-= Мое варенье, хочу — ем, хочу — на асфальт мажу! =-
Posted via RSDN NNTP Server 1.8 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.