Прежде чем научиться закрывать ресурсы, давайте изучим, как можно определить все, что открыто на компьютере. В книге "Программирование в Delphi глазами хакера" я приводил способ перечисления ресурсов всей сети (и для отдельного компьютера), применяющий функцию WNetEnumResource. Корпорация Microsoft рекомендует использовать именно этот способ. Но сейчас мы рассмотрим функцию NetShareEnum пакета NetAPI.

Функция NetShareEnum уже немного устарела, и ее описания нет в файле помощи Win API. Вместо этого указана ссылка на функцию WNetEnumResource и дана рекомендация применять именно ее. Не будем следовать рекомендациям, а воспользуемся более простым вариантом.

Итак, добавим в предыдущий пример (см. раздел 5.8.2 данной главы) одну кнопку, по нажатии которой будет запускаться перечисление и компонент TL1 stBox - для отображения открытых сетевых ресурсов. Обновленную форму вы можете увидеть на рис. 5.15.

5.8.3. Перечисление общих ресурсов

Рис. 5.15. Обновленная форма программы

По нажатии кнопки Посмотреть нужно написать код из листинга 5.18.

Листинг 5.18. Определение открытых ресурсов procedure TForml.dnListSharesClickCSender: TObject): var
i- Integer;

ShareNT: PShareInfo2Array; Share9x: array [0..1024] of TShareInfo502: iCount. iTotal: Integer; begin 1bSharesLi st.Items.CI ear; if bNT then begin // Далее код для NT-систем

@NetShareEnumNT •:= GetProcAddressCfHandleNT. 'NetShareEnum'):
if @NetShareEnumNT = nil then
exit.
// Определяем открытые ресурсы ShareNT := nil;
i f NetShareEnumNTC m 1,2.(?ShareNT. DWOPTX -1).
@iCount.@iTotal.nil) <> 0 then
exit;

// Выводим в список

if iCount > 0 then
for i := 0 to iCount-1 do
1 bSharesList. Items.Add(Strmg(ShareNT"[i].shi2_netname)).

end else begin // Далее код для 9х-систем

^NetShareEnum := GetProcAddress(fHandle9x. 'NetShareEnum'):
if ^NetShareEnum = nil then
exit;

// Определяем открытые ресурсы

if NetShareEnumCnil. 50. @Share9x. SizeOf(Share9x).
@iCount. @iTotal)<> 0 then
exit:

// Выводим в список

if iCount > 0 then
for i := 0 to iCount-1 do
1bSharesLi st.Items.AddCString(Share9x[i].shi 502_netname)).
end:
end;

Как и при добавлении ресурсов, функция NetShareEnum имеет два варианта для разных ОС. Из-за этого весь код приходится разбивать на две части - для NT-систем и Windows 9х. В данном случае используются функции из разных библиотек и структуры с параметрами другого типа.

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

После этого запускается функция NetShareEnumNT для NT-систем или NetShareEnum для Windows 9х. Для NT-систем функция описывается следующим образом:

function NetSessionEnumNT( servername UncClientName. username: PWideChar.
level: DWORD: bufptr: Pointer: prefmaxlen: DWORD: entriesread. total entries, resumejiandle: LPDWORD ): DWORD: stdcall;

Для Windows 9x нужно использовать функцию такого вида:

NetSessionEnum: function(
pszServer: PChar:
sLevel: DWORD:
pbBuffer: Pointer:
cbBuffer: DWORD:
pcEntriesRead.
pcTotalAvial. Pointer ): integer;
stdcall:

Рассмотрим параметры функции NetShareEnumNT, для NetShareEnum они имеют аналогичное значение:

• ServerName - имя сервера, на котором надо искать открытые ресурсы. Если указать нулевое значение, то поиск будет происходить на локальном компьютере;
• Level - уровень, может быть 0,1,2,50,502. От уровня зависит структура, которую нужно будет передать, и ее параметры;
• BufPtr - указатель на буфер, через который будет возвращена информация. Для NT-систем это указатель, через который будет возвращен массив, а для Эх-систем нужно указывать массив, который должен быть заполнен. Теоретически, для Windows NT можно указать уровень (параметр sLevel) 50 и массив структур для заполнения, как для Эх-систем. Но это теоретически, а практически в Windows 2003 в этом случае возникает ошибка;
• prefmaxlen - максимальное количество возвращаемых записей. Если указать -1, то будут возвращены все записи;
• EntriesRead - через этот параметр нам будет возвращено количество действительно прочитанных ресурсов;
• Total Entries - через этот параметр мы получим общее количество записей в системе;

• Resume_Handle - если вы запросили не все записи и увидели, что параметр Total -Entries больше EntriesRead, то есть прочитаны не все записи, то в данном параметре можно указать запись, с которой нужно начать перечисление, чтобы получить оставшиеся записи.

После этого просто перечисляем все полученные данные и выводим их в список.

ПРИМЕЧАНИЕ -

Исходный код рассмотренного здесь примера находится на компакт-диске в каталоге Sources\ch05\NetApi2.

5.8.2. Как открыть доступ к папке || Оглавление || 5.8.4. Закрытие общих ресурсов


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



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

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31