C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Вывод всех компьютеров сети
bacho_sun
  Отправлено: 17.11.2005, 18:04


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Вывод всех компьютеров сети

У меня возник вопрос по поводу вывода имен всех компьютеров всех рабочих групп нашей локальной сети
Вот код который был у меня ( Я пишу на Builder C++ 6)

Но он выводит только компьютеры моей локальной группы , можно ли его так изменить , чтобы он вывел все компьютеры без исключения — всех локальных групп ?
Кто знает пожалуйста покажите как.

void __fastcall TForm1::Button9Click(TObject *Sender)
{
int ln,wgc,j=0;
wchar_t * servername = NULL;
unsigned long level = 100;
SERVER_INFO_100 * bufptr;
unsigned long prefmaxlen =- 1;
unsigned long entriesread = 0;
unsigned long totalentries = 0;
unsigned long servertype = SV_TYPE_DOMAIN_ENUM; // тут я было вставил //SV_TYPE_WORKSTATION но программа застопорилась
wchar_t ** domine;
unsigned long resumehandle = 0;

NET_API_STATUS ret;

ret = NetServerEnum (servername,
level,
(unsigned char **)&bufptr,
prefmaxlen, &entriesread,
&totalentries,
servertype, NULL,
&resumehandle);
wgc = totalentries;
domine = new wchar_t*[wgc];

for (int k = 0; k < wgc; k++)
{
ln = wcslen(bufptr->sv100_name);
domine [k] = new wchar_t [ln+1];
for (int i = 0; i < ln; i++)
domine[k][i]=bufptr->sv100_name[i];
domine[k][ln]=NULL;
bufptr++;
}
servertype = SV_TYPE_NT;

for (int k = 0; k < wgc; k ++)
{
bool bl = true;
while (bl == true)
{
ret = NetServerEnum (servername,
level,
(unsigned char **)&bufptr,
prefmaxlen,
&entriesread,
&totalentries, servertype,
domine[k],&resumehandle);

for (j = 1; j <= totalentries; j++)
{

ListBox4->Items->Add(bufptr->sv100_name);

bufptr ++;
}

if (resumehandle == 0)
bl = false;
}
}

}

Дельфи я не знаю но всеже вот код который я нашол, может кто поможет мне

Получить список компьютеров, подключенных к сети.
________________________________________
Святослав Ушаков
дата публикации 15-05-2000 00:00
________________________________________
Версия для печати
unit NetUtils;
interface
uses Windows, Classes;
function GetContainerList(ListRoot:PNetResource):TList; Type
{$H+}
PNetRes = ^TNetRes;
TNetRes = Record
dwScope : Integer;
dwType : Integer;
dwDisplayType : Integer;
dwUsage : Integer;
LocalName : String;
RemoteName : String;
Comment : String;
Provider : String;
End;
{H-}

implementation
uses SysUtils;
type
PnetResourceArr = ^TNetResource; {TNetResource — это запись,
эквивалентная TNetRes, за исключением того, что
вместо типов string там типы PChar. }

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;
end.

Пример:

uses NetUtils;
var
List:TList;
begin
List:=TList.Create;
List:=GetContainerList(nil); // Получили список сетей.
// Как правило первая — сеть Microsoft
List:=GetContainerList(List[0]); //Получаем список доменов сети
for i:=0 to List.Count-1 do
if PNetRes(List[i])^.RemoteName='YourDomain' then
begin
List:=GetContainerList(List[i]);
Break;
end;
// теперь в List — список включённых компьютеров
// в домене/рабочей группе YourDomain. Каждый элемент списка имеет
// тип PNetRes. Само имя компьютера можно получить List[i])^.RemoteName
for i := 0 to List.Count-1 do
writeln(PNetRes(List[i])^.RemoteName);
end.

Gedeon
Отправлено: 18.11.2005, 11:27


Ветеран

Группа: Модератор
Сообщений: 1742



Было уже
https://rxlib.ru/forums/index.php?ac...b0920c5d12a71d4

Вернуться в Вопросы программирования в C++Builder