Теперь давайте на практике будем знакомиться с функциями, описанными в модуле NetAPI.pas. Для начала создадим программу, которая будет открывать общий доступ.

Создайте новое приложение, подключите модуль NetAPI в разделе uses. Добавьте по событию OnShow для главной формы код определения ОС и загрузки нужной библиотеки. Главное окно будущей программы (рис. 5.13) должно содержать четыре поля ввода типа TEdit:

5.8.2. Как открыть доступ к папке

Рис. 5.13. Окно будущей программы

• edSharePath - для указания пути к папке, доступ к которой надо открыть;
• edNetName - для указания сетевого имени, которое пользователь будет видеть в сетевом окружении для этой папки;
• edPass - пароль на доступ к папке;

• edComment - комментарий, который будет отображаться в сетевом окружении.

Расположите на форме кнопку Добавить. По ее нажатии нужно написать код из листинга 5.16.

Листинг 5.16. Код добавления открытого ресурса

procedure TForml.bnAddClick(Sender: TObject): var
Share9x: TShareInfo502; ShareNT: TShareInfo2;

wcPath. wcName. wcPass. wcComment: PWideChar: begin if bNT then begin // Далее идет код для NT-систем

@NetShareAddNT :- GetProcAddress(fHandleNT.'NetShareAdd'):
if @NetShareAddNT = nil then
exit.

// Конвертирование строк в Unicode GetMemCwcPath. WIDE_LENGTH):

StringToWideChar(edSharePath.Text. wcPath. WIDE_LENGTH): GetMem(wcName. WIDE_LENGTH).
StringToWideChar(edNetName.Text. wcName. WIDE_LENGTH): GetMem(wcPass. WIDE_LENGTH):
StringToWideChar(edPass.Text. wcPass. WIDE_LENGTH): GetMem(wcComment. WIDE_LENGTH);
StnngToWideChar(edComment.Text, wcComment. WIDE_LENGTH):

// Заполнение структуры ShareNT.shi2_path := wcPath. ShareNT.shi2_netname := wcName; ShareNT.shi2_passwd := wcPass. ShareNT.shi2_remark := wcComment: ShareNT.Shi2_type .= STYPE_DISKTREE. ShareNT.shi2_remark -= " ShareNT.shi2_permissions •= ACCESS_ALL: ShareNT.shi2_max_uses := DWORD(-l): ShareNT.shi2 current uses := 0.

// Добавление открытого ресурса NetShareAddNT(nil. 2. @ShareNT. nil):

продолжение &

Листинг 5.16 (продолжение) II Освобождение строк Unicode FreeMem (wcName); FreeMem (wcPath); FreeMem (wcPass): FreeMem (wcComment):

end else begin // Код для Windows 9x

@NetShareAdd := GetProcAddress(fHandle9x.'NetShareAdd1):
if @NetShareAdd = nil then
exit:
// Заполнение структуры FillChar(Share9x.shi502_netname. Size0f(Share9x shi502_netname). #0);
move(edNetName Text[l], Share9x.shi502_netname[0]. Length(edNetName Text)): Share9x.shi502_type := STYPE_DISKTREE;
Share9x.shi502_flags := ACCESS_ALL;
FillChar(Share9x shi502_remark. SizeOf(Share9x.shi502_remark). #0): FillChar(Share9x.shi502_path. SizeOf(Share9x.shi502_path). #0): Share9x.shi502_path := PAnsiChar(edSharePath.Text);
Fill Char(Share9x shi502_rw_password. Size0f(Share9x.shi502_rw_password).#0);
FillChar(Share9x shi502_ro_password, Size0f(Share9x shi502_ro_password).#0);
NetShareAdd (ml. 50. @Share9x. SizeOf (Share9x)). end:
end.

Весь код процедуры разбит на две части. В первой мы открываем доступ для Windows NT, а во второй - для Windows 9х. Принцип работы обеих частей одинаков п состоит из нескольких пунктов.

1. Определение адреса нужной процедуры.

2. Заполнение структуры типа TShareInfo2 или TShareInfo502 в зависимости от используемой ОС.

3. Вызов функции NetShareAddNT или NetShareAdd в зависимости от используемой ОС.

Рассмотрим случай с NT-системами (потому что он сложнее из-за необходимости преобразования строк в Unicode), а с Windows 9х разобраться будет проще.

Итак, добавление открытого ресурса происходит с помощью NetShareAdd, но она различна для NT- и Эх-систем. Так как нет возможности прописать это в заголовочном файле, работа осуществляется динамически. Для определения адреса функции в динамической библиотеке используется функция GetProcAddress. Ей передаются два параметра - указатель на загруженную библиотеку и имя функции, которую надо найти. Если нужная функция найдена, то результатом будет действительный указатель, иначе - нулевое значение. Ошибка может возникнуть, если случайно загрузилась другая библиотека вместо системной (возможно, пользовательская) с таким же именем.

После этого конвертируем текстовые переменные (содержимое всех прлей ввода) в формат Unicode. Для этого объявлены 4 переменные типа PWideChar для каждого поля ввода.

Тип PWideChar - это указатель на строку Unicode, а раз эго указатель, то такая переменная автоматически не инициализируется. Для нее нужно выделить память с помощью функции GetMem. Функция имеет два параметра - переменная-указатель, в которую будет записан указатель на выделенную память, и размер выделяемой памяти. В качестве размера используется константа WIDELENGTH, которая объявляется в заголовочном файле NetAPI следующим образом:

WIDE_LENGTH = S i zeOF(Wi deCha г)*256:

Здесь SizeOF(WideChar) - это размер одного символа Unicode. Известно, что он равен 2, но более правильно будет определять все размеры с помощью функции SizeOf. Получается, что константа WIDELENGTH равна 256x2, где 2 - это размер одного символа. Если посмотреть на эту константу с другой стороны, то она равна длине строки из 256 символов в формате Unicode.

Таким образом, с использованием функции GetMem выделяется память для хранения строк в формате Unicode не более чем из 256 символов. Для нашей программы этого вполне достаточно.

После преобразования строк заполняется структура TShareInfo2 в случае с Windows NT или TShareInfo502 в случае с Windows 9х. Обе структуры описаны в листинге 5.17.

Листинг 5.17. Структуры TShareInfo2 и TShareInfo502

TShareInfo2 = packed record >
shi2_netname: PWideChar: Shi2_type: DWORD: shi2_remark: PWideChar;
shi2_permissions: DWORD;
shi2_max_uses: DWORD ; shi2_current_uses: DWORD: shi2_path: PWideChar: shi2_passwd: PWideChar:
end:
PShareInfo2 = * TShareInfo2:
TShareInfo2Array = array [0..1024] of TShareInfo2:
PShareInfo2Array = * TShareInfo2Array;
type TShareInfo502 = packed record shi502_netname: array [0..12] of Char;
shi502_type: Byte: shi502_flags: Word;
shi502_remark: PChar;
shi5Q2_path: PChar;
shi502_rw_password: array [0..8] of Char"; shi502_ro_password: array [0..8] of Char:
end:

Структура TShareInfo2 имеет следующие параметры:

• shi2_netname - сетевое имя, которое будет отображаться в сетевом окружении;

• shi2_type - тип устройства, к которому открывается доступ. Здесь можно указывать одно из следующих значений:

О STYPE_DISKTREE - диск или папка;
О STYPE_PRINTQ - принтер;
О STYPE_DEVICE - устройство связи;
О STYPE_IPC - межпроцессорное взаимодействие (IPC или Inter Process Communication);
• shi2_remark - комментарий, который будет отображаться для данного ресурса в сетевом окружении;

• shi2_permissions - права доступа. Здесь может быть любое сочетание из следующих констант:

О ACCESS_READ - доступ на чтение;
О ACCESS_WRITE - доступ на запись;
О ACCESS_CREATE - доступ на создание;
О ACCESS_EXEC - доступ на выполнение;
О ACCESS_DELETE - доступ на удаление;
О ACCESS_ATRIB - доступ на изменение атрибутов;
О ACCESSPERM - доступ на изменение разрешений чтения, записи, создания, выполнения и удаления;
О ACCESS_ALL - полный доступ;
• shi2_max_uses - максимальное количество подключений. Если указать -1, то количество подключений неограниченно;
• shi2_current_uses - количество текущих подключений;
• shi2_path - путь к ресурсу (папке);

• shi 2_passwd - пароль.

После заполнения всех полей структуры вызывается функция NetShareAddNT, которая для NT-систем объявлена следующим образом:

function NetShareAddNT(
servername: PWideChar;
level: DWORD ;
buf: Pointer;
parm_err: LPDWORD ): DWORD;
stdcall:

В случае использования Windows 9x вызывается функция NetShareAdd:

function NetShareAddC pszServer: Pchar;
sLevel: Cardinal ;
pbBuffer :PChar;
cbBuffer: Word ): DWORD;
stdcall:

Рассмотрим параметры функций NetShareAdd и NetShareAddNT:

• имя сервера, на котором происходит открытие ресурса. Для локального компьютера можно указывать ni 1, а для удаленной системы нужно указать реальное имя, при наличии соответствующих прав на изменение параметров доступа;
• уровень. Имеет значения 2 или 502 для Windows NT и 50 для Windows 9х;
• указатель на заполненную структуру SHAREINF0;

• указатель на числовую переменную типа DWORD. В случае ошибки в ней будет указан параметр структуры, который не был распознан или указан неправильно. Если указать nil, то определить ошибочный параметр нельзя.

Попробуйте запустить пример и протестировать его работоспособность. После изменения прав доступа в значке папки должна появиться рука, но при программном изменении она появляется не сразу. Чтобы рука отобразилась, нужно перезагрузить компьютер или войти в свойства папки и выйти из них, нажав кнопку ОК. В свойствах папки на вкладке Доступ параметры, указанные программно, отображаются сразу и корректно (рис. 5.14).

5.8.2. Как открыть доступ к папке

Рис. 5.14. Диалоговое окно настройки общего доступа

ПРИМЕЧАНИЕ -

Исходный код рассмотренного здесь примера находится на компакт-диске в каталоге БоигсезХспОБММегАрк

5.8.1. Как загрузить нужную библиотеку || Оглавление || 5.8.3. Перечисление общих ресурсов


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Январь
    2022
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс