Delphi

Xakep, номер #043, стр. 043-064-2


NetContainerToOpen.lpProvider - имя владельца ресурса. Если оно неизвестно, то нужно указать nil.

Открытие скана

После заполнения структуры нужно открыть процесс сканирования. Для этого существует функция WNetOpenEnum со следующими параметрами:

1. Область сканирования. Здесь снова указываем RESOURCE_GLOBALNET.

2. Тип сканируемых ресурсов. Снова указываем все подряд - RESOURCETYPE_ANY.

3. Здесь нужно указать, какие ресурсы надо перечислять. Если нужно все подряд, то просто укажи 0. Возможно также значения RESOURCEUSAGE_CONNECTABLE - подключаемые или RESOURCEUSAGE_CONTAINER - хранимые.

4. Структура, которую мы заполнили.

5. Переменная типа THandle, которая будет использоваться в дальнейшем.

Перечисление шар

После того как мы открыли перечисление, можно смело приступать к его реализации. Для этого я запускаю бесконечный цикл:

while TRUE do

begin

end;

Внутри цикла я постоянно вызываю функцию WNetEnumResource. Если она мне возвращает ошибку (результат не равен NO_ERROR), то я закрываю перечисление с помощью WnetCloseEnum и выхожу из процедуры.

У функции WnetEnumResource есть четыре параметра:

1. Здесь нужно указать ту же переменную, что мы указывали в последнем параметре при открытии перечисления WNetOpenEnum.

2. Здесь нужно указать переменную, в которой хранится число необходимых к возврату ресурсов. У меня это переменная EntriesToGet, в которой записано число 2000. После того как функция выполнится, в этой переменной будет не 2000, а количество реально открытых ресурсов.

3. Здесь должен быть массив структур TNetResource. Его длина должна быть достаточной для хранения возвращенной информации об открытых ресурсах. Я запрашиваю максимум 2000 ресурсов, значит массив должен состоять из 2000 структур (ResourceBuffer: array[1..2000] of TnetResource ;).

4. Размер массива, указанного в предыдущем параметре.

У функции WnetCloseEnum есть только один параметр, в котором мы должны указать ту же переменную, что мы указывали в последнем параметре при открытии перечисления WNetOpenEnum.

Вывод результата

Если перечисление прошло успешно, то мы можем вывести полученную информацию на экран. Для этого я запускаю цикл от 0 до количества возвращенных значений EntriesToGet:

for i := 1 to EntriesToGet do

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

Внутри цикла я добавляю в компонент Memo1 строку, содержащую имя ресурса. Имя полученного открытого ресурса можно прочитать в переменной lpRemoteName структуры ResourceBuffer[i]. Единственное, что тут надо помнить - ResourceBuffer[i].lpRemoteName это не строка, поэтому этот параметр надо превратить в строку. Для этого надо написать String() и в скобках указать то, что мы хотим превратить в строку:

String(ResourceBuffer[i].lpRemoteName).

Disconnect

Итак, сканер шаровых ресурсов готов, правда, он пока сканирует только одну указанную машину. Из-за этого использование этой проги в боевых условиях для поиска шар определенного прова нереально. Но никто же не мешает тебе дополнить прогу перебором, ведь это не так уж и сложно.

Назад на стр. 043-064-1  Содержание  Вперед на стр. 043-064-3