Отслеживание операций с файлами
Попытка найти файлы, открытые другими пользователями, вернее всего сработает, если применять программу, работающую в командной строке, - nthandle Марка Руссиновича (Mark Russinovich), ее можно найти на http://www.sysinternals.com. Она позволяет показать все открытые дескрипторы на определенной системе. Вот как выглядит ее вывод:
System pid: 2
10: File C:\WINNT\SYSTEM32\CONFIG\SECURITY
84: File C:\WINNT\SYSTEM32\CONFIG\SAM.LOG
cc: File C:\WINNT\SYSTEM32\CONFIG\SYSrEM
dO: File C:\WINNT\SYSTEM32\CONFIG\SECURITY.LOG
d4: File C:\WINNT\SYSTEM32\CONFIG\DEFAULT
e8: File C:\WINNT\SYSTEM32\CONFIG\SYSTEM.ALT
fc: File C:\WINNT\SYSTEM32\CONFIG4SOFTWARE.LOG
118: File C:\WINNT\SYSTEM32\CONFIG\SAM
128: File C:\pagefile.sys
134: File C:\WINNT\SYSTEM32\CONFIG\DEFAULT. LOG
154: File С:\WNNT\3YSTEM32\CON'FIG;'SOFTWARE
1bO: File \3evice\NafiedPipe\
294: File C:\WINNT\PROFILES\Adnirustrator\ntLSer.aa-.; OG
2a4: File C:\WINNT\PROFILES\AdminisTrator\NTUSEH.DAT
SMSS.EXE pid: 27 (NT AUTHORITY:SYSTEM)
4: Section С:\WINNT\SYSTEM32\5MSS.EXE
c: File С'\WINNT
28: File C:\WINNT\SYSTEM
Можно также запросить информацию по конкретным файлам и каталогам:
> nthandle c:\temp
Handle V1.11
Copyright (С) 1997 Mark Russinovich
http://www.sysinternals.com
WINWORD.EXE pid: 652
C:\TEMP\~DFF2B3.tmp WINWORD.EXE pid: 652
C:\TEMP\~DFA773.tmp WINWORD.EXE pid: 652
C:\TEMP\~DF9l3E.tmp
Программа nthandle позволяет получить эту информацию по конкретному процессу при помощи ключа -р.
Использовать ее из Perl очень просто, поэтому не будем приводить примеры. Вместо этого посмотрим на подобную, но более интересную операцию - аудит.
NT/2000 позволяет эффективно отслеживать изменения в файлах, каталогах или иерархии каталогов. Вы могли бы учитывать постоянное повторение операции stat() над нужным объектом, но это потребовало бы слишком больших затрат процессорного времени. В NT/2000 отслеживание изменений можно поручить операционной системе.
Относительно безболезненно эту работу выполняют два модуля: Win32: :ChangeNotify Кристофера Мадсена (Christopher J. Madsen) и Win32: :AdvNotify Амина Мюлей Рамдана (Amine Moulay Ramdane). В примерах этого раздела будет использоваться второй, т. к. он более гибкий.
Работа с модулем Win32: : AdvNotify- это многошаговый процесс.
На следующем шаге нужно создать следящий поток (monitoring thread) для интересующего нас каталога. Win32: :AdvNotify позволяет следить сразу за набором каталогов, для этого необходимо лишь создать несколько потоков. Мы же будем следить только за одним каталогом:
Sthread = $aob]->StartThread(Directory => 'C:\terr.c'.
Filter => All, WatchSubtree -> 0) or die "Невозможно начать поток\п":
Первый параметр этого метода говорит сам за себя; рассмотрим остальные.
Установив Filter в одно из приведенных значений (табл. 4.1) или в их комбинацию (SETTING 1 | SETTING2 | SETTINGS. ..), можно следить за различными типами изменений.