Параметры Filter в Win32 AdvNotifу
Таблица 4.1. Параметры Filter в Win32::AdvNotifу
Параметр | Отмечает |
FILE_NAME | Создание, удаление, переименование файла(ов) |
DIR_NAME | Создание или удаление каталога(ов) |
ATTRIBUTES | Изменение атрибутов любого каталога |
SIZE | Изменение размера любого файла |
LAST_ WRITE | Изменение даты модификации файла(ов) |
CREATION | Изменение даты создания файла(ов) |
SECURITY | Изменение информации безопасности (ACL и пр.) файла(ов) |
Значение АИ из приведенного примера- это всего лишь постоянная, объединяющая все варианты выбора. Если не указать параметр Filter при вызове метода, то по умолчанию будет использоваться АИ. Параметр WatchSubtree определяет, необходимо ли следить только за указанным каталогом или за каталогом и всеми его подкаталогами.
StartThreadO создает поток, но проверка начинается только после того, как поступает распоряжение об этом:
$thread->EnableWatch() or die
"Невозможно начать наблюдение\п";
Существует также функция OisableWatch(), которую необходимо использовать в программе для завершения проверки.
Мы следим за нужным объектом, но как узнать, изменилось ли что-нибудь? Надо придумать что-то, что позволило бы потоку сообщить нам об изменениях, за которыми мы наблюдаем. Здесь тот же подход, что и в главе 9 «Журналы» при обсуждении сетевых сокетов. Обычно следует вызывать функции, которые заблокированы до тех пор, пока ничего не происходит:
while($thread->Wait(INFINITE)){
print "Что-то изменилось1\п":
last if ($changes++ == 5):
}
Этот цикл while() вызовет метод Wait() для нашего потока. До тех пор пока потоку нечего сообщить, вызов будет заблокирован. Обычно Wair() принимает в качестве параметра число миллисекунд, равное времени ожидания. Мы же передаем специальное значение, которое соответствует «бесконечному ожиданию». Когда Wait() возвращает значение, следует вывести сообщение и ждать дальше, если только уже не были замечены пять других изменений. Теперь можно закончить:
$thread->Terminnte() undef $aobj;
Наша программа пока еще не очень полезна. Нам известно, что что-то изменилось, но мы не знаем ни что изменилось, ни как это произошло. Чтобы исправить эту ситуацию, изменим тело цикла wniie() и добавим определение формата:
while($thread->Wait(INFINITE)){
while ($thread->Read(\@status)){ foreach Sevent (@status){
Sfilename = $event->{FileName); $time = $event->{DateTime};
Saction = $ActionName{$event->{Action}}; write; } } }
format STDOUT =
@««««««««« @««««««««« @«««««««««
Sfilename,$time,Saction
format STDOUT_TOP =
File Name Date Action
Основное изменение- это добавление метода Read(). Он получает информацию об изменении и заполняет элементы списка ©status ссылками на хэш. Каждая ссылка указывает на анонимный хэш, который выглядит примерно так:
{'FileName' => "GLF2425.TMP',
'DateTime' => '11/08/1999 06:23:25р',
'Directory' => 'C:\temp', 'Action' => 3 }
Для каждого изменения могут произойти несколько событий, отсюда и необходимость вызывать Read() в цикле while(). Если соответствующим образом разыменовать содержимое этих хэшей и применить к ним форматирование, то получатся примерно такие данные:
File Name Date Acti01
"DF400E.tmp 11/08/1999 07:29:56p
FILE_.ACTION_PEMO\,'F.D
"DF6C5C. fnp 11/08/1999 07'29'56p
F1LF_AC1ION_ADDED
~OF6E66.tmp 11/08/1999 07:29:56р
FILE_ACTION_ADOED
~DF6E5C.tmp 11/08/1999 07:29:56р
FILE_ACriON_REMOVEO
К сожалению, отслеживание операций с сетью в NT/2000 впечатляет намного меньше. В идеале, как администратор вы хотели бы знать, какой процесс (а, следовательно, какой пользователь) открыл сетевой порт. Печально, но я не знаю ни одного модуля и ни одного инструмента, которые могли бы предоставить такую информацию. Существует один коммерческий инструмент, работающий в командной строке, под названием TCPVstat, который может показать связь процессов с использованием сети. TCPVstat можно найти в пакете TCPView Professional Edition, который доступен на http://www.winternals.com.
Если использовать только некоммерческие инструменты, то придется иметь дело лишь со списком сетевых портов, открытых в настоящее время. Для этого следует применять другой модуль Рамдана -Win32: :1рНе1р. Вот как выглядит код, печатающий нужную информацию:
use Win32: -.IpHelp;
# замечание: в данном случае регистр "IpHelp"
имеет значение' my $iobj = new Win32::IpHelp;
# заполняем список хэшем хэшей $iobj->GetTcpTable(\(a>table,1);
foreach Sentry (@table){
print $entry->{LocalIP}-><Value( . ":" .
$entry->{LocalPort}->{ValLie}. " -> ";
print $entry->{fiemoteIP}->{Value} . ":" .
Sentry->{RemotePort}->{Value}."\n";
}
Посмотрим, как можно сделать то же самое в Unix.