Re: Найти компьютеры в сети

From
Gailit Vladimir ()
To
Yury Sinegubov ()
Date
2002-04-05T07:34:55Z
Area
RU.DELPHI
From: Gailit Vladimir <gailit@info.kurgan.ru>



Привет!

Yury Sinegubov wrote:

> Gailit Vladimir wrote:
>
> > при установленных клиенте NetWare полностью теряется
> > возможность просмотреть ресурсы сети Microsoft
> > Могу кинуть исходник как пытаюсь делать.
>
> NetResources^[I].lpProvider в исходнике участвует?

Да, конечно присутствует.. Он выдает Microsoft Provider for NetWare и
все.
Воткусок кода с функцией и пяснениями. Эту функцию я и использую:

 function GetContainerList(ListRoot:PNetResource):TList;

 {возвращает список сетевых имён с подуровня ListRoot, каждый
элемент списка TList - это PNetRes, где поле RemoteName определяет
соответственно сетевое имя элемента списка. Если ListRoot=nil, то
возвращается самый верхний уровень типа:
1. Microsoft Windows Network
2. Novell Netware Network
Чтобы получить список доменов/рабочих групп сети Microsoft, нужно
вызвать эту функцию второй раз, передав ей в качестве параметра,
соответствующий элемент списка, полученного при первом её вызове.
Чтобы получить список компьютеров домена - вызвать третий раз...}
{Единственное, я не знаю как узнать имя текущего домена.}

Var
              TempRec :PNetRes;
                  Buf :Pointer;
  Count, BufSize, Res :DWORD;
              lphEnum :THandle;
                    p :PNetResourceArr;
                    i :SmallInt;
          NetworkList :TList;

Begin
  NetworkList := TList.Create;
  Result:=nil;
  BufSize := 8192;
  GetMem(Buf, BufSize);
  Try
    Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER{0}, ListRoot,lphEnum);
    {в результате получаем ссылку lphEnum}

    If Res <> 0 Then Raise Exception(Res);
    Count := $FFFFFFFF; {требуем выдать столько записей в список,
сколько есть}

    Res := WNetEnumResource(lphEnum, Count, Buf, BufSize); {в буфере Buf
- списочек
                         в виде массива указателей на структуры типа
TNetResourceArr
                         а в Count - число этих структур}

    If Res = ERROR_NO_MORE_ITEMS Then Exit;
    If (Res <> 0) Then Raise Exception(Res);
    P := PNetResourceArr(Buf);
    For I := 0 To Count - 1 Do
    Begin                   //Требуется копирование из буфера, так как
он
      New(TempRec);         //действителен только до следующего  вызова
функций группы WNet
      TempRec^.dwScope := P^.dwScope;
      TempRec^.dwType := P^.dwType ;
      TempRec^.dwDisplayType := P^.dwDisplayType ;
      TempRec^.dwUsage := P^.dwUsage ;
      TempRec^.LocalName := StrPas(P^.lpLocalName);  {имеются  ввиду вот
эти указатели}
      TempRec^.RemoteName := StrPas(P^.lpRemoteName); {в смысле  -
строки PChar}
      TempRec^.Comment := StrPas(P^.lpComment);
      TempRec^.Provider := StrPas(P^.lpProvider);
      NetworkList.Add(TempRec);
      Inc(P);
    End;

    Res := WNetCloseEnum(lphEnum);
    {а следующий вызов - вот он!}
    If Res <> 0 Then Raise Exception(Res);
    Result:=NetWorkList;
    Finally
      FreeMem(Buf);
  End;
End;

Буду благодарен за пояснения.
С уважением, Владимир.

--- ifmail v.2.15dev5
 * Origin: ROSTELECOM TCMS-14 (2:5020/400)