NetAPI. Детектор подключений
raxp@mail.zp.ua
Данная статья является логическим продолжением [1].
Краткий экскурс...
Последнее время "сетка" так разрослась, как и количество желающих "покачать у соседа", что пришлось ставить ftp сервак. Тем не менее, сетевые папки по необходимости остались, а вызывать и обновлять вручную каждый раз системный менеджер сессий ОС (консоль MMC), чтобы глянуть кто висит на машине, просто надоело. "Лень - двигатель пргресса". Мониторинг подключений достаточно просто осуществить, воспользовавшись системными библиотеками самой оси. Для 9x/Me - это srvapi. Для NT подобных - это netapi.
Решение*
Для получения необходимой информации по подключениям используем функции, экспортируемые системной библиотекой netapi32.dll
- NetSessionEnum
- NetFileEnum
- NetSessionDel (желающие могут добавить и контроль “нежелательных элементов”)
- NetFileClose
* Создание формы на WinAPI опускаем. Полный исходный текст детектора и компиляция доступен по [2].
Прежде всего, осуществим сканирование сессий и подключений
…
setlength(ip_ses,0); //массив IP
setlength(name_ses,0); //массив юзеров по сессиям
setlength(name_file,0); //массив юзеров по файлам и папкам
setlength(path_file,0); // массив папок и файлов
//
FLibHandle:= LoadLibrary('NETAPI32.DLL');
if FLibHandle = 0 then Exit;
@NetSessionEnumNT:= GetProcAddress(FLibHandle, 'NetSessionEnum');
SessionInfo502:= nil;
if NetSessionEnumNT(nil,nil,nil,502,@SessionInfo502,DWORD(-1),@entriesreadNT,
@totalentries, nil)=0 then begin
for i:=0 to EntriesReadNT-1 do begin
setlength(ip_ses,length(ip_ses)+1); //IP
ip_ses[length(ip_ses)-1]:= string(SessionInfo502^[i].sesi502_cname);
setlength(name_ses,length(name_ses)+1); //NAME
name_ses[length(name_ses)-1]:= SessionInfo502^[i].sesi502_username
end
end else gl_mig:= false;
//скан по файлам-
@NetFileEnumNT:= GetProcAddress(FLibHandle, 'NetFileEnum');
if not Assigned(NetFileEnumNT) then begin FreeLibrary(FLibHandle); Exit end;
FileInfoNT:= nil;
if NetFileEnumNT(nil,nil,nil,3,@FileInfoNT,DWORD(-1),@entriesreadNT,
@totalentries, nil)=0 then begin
//проверяем "чтение" файла и выставляем флаг смены маски в иконке (мигание)
if EntriesReadNT > 0 then gl_mig:= not gl_mig else gl_mig:= false;
//
for i:=0 to EntriesReadNT-1 do begin
setlength(path_file,length(path_file)+1); //PATH
path_file[length(path_file)-1]:= FileInfoNT^[i].fi3_pathname;
setlength(name_file,length(name_file)+1); //NAME
name_file[length(name_file)-1]:= FileInfoNT^[i].fi3_username
end
end;
FreeLibrary(FLibHandle);
…
добавим выборку информации о подключениях по сессиям (сортировку)
…
for i:= 0 to length(name_ses)-1 do begin
if name_ses[i]<>'' then gl_stat:= gl_stat + 'o ' + ip_ses[i]
+ ' (' + name_ses[i] + ')' + #10;
for j:= 0 to length(name_file)-1 do
if name_ses[i]=name_file[j] then gl_stat:= gl_stat + path_file[j] + #10;
end;
if length(path_file)=0 then gl_stat:= 'Угроза отсутствует!'
…
не забыть про горячую клавишу
…
id:=GlobalAddAtom('hotkey1');
RegisterHotKey(handle,id,mod_control,ord('1'));
…
и осталась обработка "кликов"
…
function WndProc(hnd, wmsg, wparam, lparam: integer): integer; stdcall;
begin
case wmsg of
//консольное сообщение [mmc]
WM_HOTKEY: mmc; //наша горячая клавиша
//обрабатываем клики по иконке в трее
TRAY_CALLBACK: case dword(lparam) of
WM_MBUTTONDOWN : begin //средняя кнопка
UnRegisterHotKey(handle,id);
PostQuitMessage(handle);
timer_destroy;
closeWindow(Handle)
end;
WM_LBUTTONUP : begin //левая кнопка
hint:= 'NetAPI';
show_tn(1,gl_stat,'NetAPI.
Статистика подключений...')
end;
end;
else Result:= DefWindowProc(hnd, wmsg, wparam, lparam);
end
end;
…
Итак, если у вас просматривают сетевые папки или файлы, то в трее иконка начнет мигать и при клике левой кнопкой мыши вы увидите "кто и что":

При отсутствии сессий - "угроза отсутствует" (поклонники Стива Мартина поймут):

Ссылки:
Контактная информация:
raxp@mail.zp.ua
27.04.2008
[Переход к списку статей]
|