Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
prakt-Storozhok.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
7.98 Mб
Скачать

2.Задание по практическому занятию

Разработать приложение, выполняющее поиск доступных сетевых ресурсов. Приложение имеет вид, изображённый на рис.1 Порядок разработки приложения следующий

1.Создайте проект и перенесите на него компоненты, перечисленные в табл.1.

Таблица 1

Компонент

Класс

Описание

Label1

TLabel

Метка «UNC-имя компьютера»

Edit1

TEdit

Окно ввода UNC-имени компьютера

Memo1

TMemo

Окно вывода информации о доступных сетевых ресурсах

Button1

TButton

Командная кнопка «Просканировать»

Рис 1

2. Для события OnClick командной кнопки «ПРОСКАНИРОВАТЬ» запишите следующий программный код:

procedure TForml.ButtonlClick(Sender: TObject);

var

hNetEnum: THandle;

NetContainerToOpen: NETRESOURCE;

ResourceBuffer: array[1..2000] of TNetResource;

i,ResourceBuf,EntriesToGet: DWORD;

begin

//Заполнение структуры NETRESOURCE

NetContainerToOpen. dwScope: =RESOURCE__GLOBALNET;

NetContainerToOpen. dwType: =RESOURCETYPE__ANY;

NetContainerToOpen.ipLocalName:=nil;

NetContainerToOpen.lpRemoteName:= PChar('\\'+Edit1.Text);

NetContainerToOpen.lpProvider:= ni1;

//Открытие процесса сканирования

WNetOpenEnum (RESOURCE__GLOBALNET, RESOURCETYPE_ANY,

RESOURCEUSAGE_CONNECTABLE or RESOURCEUSAGE_CONTAINER,

@NetContainerToOpen, hNetEnum);

//сканирование сетевых ресурсов

ResourceBuf := sizeof(ResourceBuffer);

EntriesToGet := 2000;

if (NO_ERROR <> WNetEnumResource(hNetEnura, EntriesToGet,

@ResourceBuffer, ResourceBuf)) then exit;

//Вывод на экран найденных ресурсов

for i := 1 to EntriesToGet do

Memol.Lines.Add(string(ResourceBuffer[i].lpRemoteName));

end;.

ДОПОЛНИТЕЛЬНОЕ ЗАДАНИЕ

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

  1. Создайте форму, изображенную на рис.2.

  2. Нанесите на форму компоненты, приведенные в таблице 2.

  3. В разделе public объявите используемые в программе дополнительные процедуры и функции:

public

procedure EnumNet(const ParentNode: TTreeNode;

ResScope, ResType: DWORD;

const NetContainerToOpen: PNetResource);

function OpenEnum(const NetContainerToOpen: PNetResource;

ResScope, ResType, ResUsage: DWORD): THandle;

function EnumResources(const ParentNode: TTreeNode;

ResScope, ResType, ResUsage: DWORD;

hNetEnum: THandle): UINT;

end;

Рис.2.

Таблица 2

Компонент

Класс

Описание

Label1

TLabel

Где ищем

Label2

TLabel

Что ищем

RadioButton1

TRadioButton

Подключенные

RadioButton2

TRadioButton

Глобальные

RadioButton3

TRadioButton

Запомненные

CBTypeAny

TCheckBox

Все

CBTypeDisk

TCheckBox

Сетевые диски

CBTypePrint

TCheckBox

Сетевые принтеры

TreeTreeRes

TTreeView

Окно вывода информации о ресурсах

Button1

TBitBtn

Обновить

  1. В обработчике события OnClick кнопки «Обновить» запишите следующий программный код:

procedure TForm1.Button1Click(Sender: TObject);

var

ResScope,

ResType:DWORD;

Begin

// Очистка компонента TTreeView от текущих данных

TreeTreeRes.Items.Clear;

// Проверка, какой компонент RadioButton выбран

if RadioButton2.Checked then

ResScope := RESOURCE_GLOBALNET

else

if RadioButton1.Checked then

ResScope := RESOURCE_CONNECTED

else

ResScope := RESOURCE_REMEMBERED;

// Проверкатого, что нужно искать

ResType := 0;

if CBTypeAny.Checked then

ResType := ResType or RESOURCETYPE_ANY;

if CBTypeDisk.Checked then

ResType := ResType or RESOURCETYPE_DISK;

if CBTypePrint.Checked then

ResType := ResType or RESOURCETYPE_PRINT;

// Запуск процедуры поиска

EnumNet(TreeTreeRes.Items.Add(NIL, 'Сетевое окружение'), ResScope, ResType, NIL);

end;

Дополнительная процедура EnumNet имеет следующие параметры:

  • ParentNode – родительский объект в дереве TreeView, к которому будут доьавляться имена найденных ресурсов

  • ResScope – указание, где надо будет искать ресурсы (глобальные, подключенные или запомненные)

  • ResType – тип ресурсов, которые надо искать (все, принтеры, диски)

  • NetContainerToOpen –переменная, используется при перечислении

  1. Добавьте к тексту программы описание функции EnumNet:

procedure TForm1.EnumNet(const ParentNode: TTreeNode; ResScope, ResType: DWORD; const NetContainerToOpen: PNetResource);

var

hNetEnum: THandle;

begin

// Инициализировать операцию поиска ресурсов

hNetEnum := OpenEnum(NetContainerToOpen, ResScope, ResType, RESOURCEUSAGE_CONNECTABLE or RESOURCEUSAGE_CONTAINER);

// Если поиск ресурсов невозможно запустить, то выход

if (hNetEnum = 0) then exit;

// Функция поиска ресурсов

EnumResources(ParentNode, ResScope, ResType, RESOURCEUSAGE_CONNECTABLE or RESOURCEUSAGE_CONTAINER, hNetEnum);

// Закрыть перечисление ресурсов

if (NO_ERROR <> WNetCloseEnum(hNetEnum)) then

ShowMessage('WNetCloseEnum Error');

end;

  1. Добавьте к тексту программы описание функции OpenEnum, которая инициализирует операцию поиска.

function TForm1.OpenEnum(const NetContainerToOpen: PNetResource;

ResScope, ResType, ResUsage: DWORD): THandle;

var

hNetEnum: THandle;

begin

Result := 0;

if (NO_ERROR <> WNetOpenEnum(ResScope, ResType, RESOURCEUSAGE_CONNECTABLE or RESOURCEUSAGE_CONTAINER,

NetContainerToOpen, hNetEnum)) then

showmessage('Ошибка')

else

Result := hNetEnum;

end;

Функция OpenEnum запускает системную функцию WNetOpenEnum и проверяет результат выполнения данной функции.

Системная функция WNetOpenEnum рассматривалась в предыдущей работе

Структура NETRESOURCE рассматривалась в предыдущей работе.

  1. Добавьте к тексту программы описание функции EnumResources, которая выполняет поиск ресурсов:

function TForm1.EnumResources(const ParentNode: TTreeNode;

ResScope, ResType, ResUsage: DWORD;

hNetEnum: THandle): UINT;

function ShowResource(const ParentNode: TTreeNode; Res: TNetResource): TTreeNode;

var

Str:String;

index:Integer;

begin

Result:=ParentNode;

if Res.lpRemoteName=nil then exit;

Str:=string(Res.lpRemoteName);

index:=Pos('\',Str);

While index>0 do

begin

Str:=Copy(Str,index+1,Length(Str));

index:=Pos('\',Str);

end;

Result := TreeTreeRes.Items.AddChild(ParentNode, Str);

end;

var

ResourceBuffer: array[1..2000] of TNetResource;

i,ResourceBuf,EntriesToGet: DWORD;

NewNode: TTreeNode;

begin

Result := 0;

while TRUE do

begin

ResourceBuf := sizeof(ResourceBuffer);

EntriesToGet := 2000;

// Системная функция поиска ресурсов

if (NO_ERROR <> WNetEnumResource(hNetEnum,EntriesToGet,@ResourceBuffer,ResourceBuf)) then

begin

case GetLastError() of

NO_ERROR: break;

ERROR_NO_MORE_ITEMS: exit;

else

ShowMessage('Ошибка');

Result := 1;

exit;

end;

end;

// рекурсивный поиск нового ресурса.

for i := 1 to EntriesToGet do

begin

NewNode := ShowResource(ParentNode, ResourceBuffer[i]);

if (ResourceBuffer[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then

EnumNet(NewNode, ResScope, ResType, @ResourceBuffer[i]);

end;

end;

end;

  1. В функции EnumResources основной является системная функция WNetEnumResource, которая перечисляет ресурсы сетевых объектов. Это функция рассматривалась в предыдущей работе.

  2. Откомпилируйте созданное приложение и проверьте его работу.

ЛИТЕРАТУРА

Фленов М. Е. Программирование в Delphi глазами хакера. СПб., БХВ-Петербург, 2005. 368 с.

КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Опишите алгоритм поиска свободных ресурсов.

  2. Опишите назначение полей структуры NETRESOURSE.

  3. Для каких целей используются функция WNetOpenEnum?

  4. Для каких целей используются функция WNetEnumRESOURСE?

  5. Как в программе определить, что поиск ресурсов завершён?

Занятие 7. Освоение методов работы с протоколом NETBIOS

NetBIOS (Network Basic input Output System, базовая система сетевого ввода-вывода) это стандартный интерфейс прикладного программирования, то есть это набор API-функций для работы с сетью (хотя весь NetBIOS состоит только из одной функции). Протокол NetBIOS был разработан в 1983 году компанией Sytek Corporation специально для IBM.

Система NetBIOS определяет только программную часть передачи данных т. е. как должна работать, программа для передачи данных по сети. NetBIOS расположен на уровнях сеанса, представлении и приложения.

Цель работ: получить практику в программировании и освоить структуру протокола NetBIOS.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]