|

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
|