информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеСтрашный баг в WindowsПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Вывод всех компьютеров сети 17.11.05 18:08  
Автор: bacho_sun Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Вывод всех компьютеров сети

У меня возник вопрос по поводу вывода имен всех компьютеров всех рабочих групп нашей локальной сети
Вот код который был у меня ( Я пишу на 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.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach