информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыАтака на InternetВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Phrack #70/0x46 
 Возможно, Facebook наступил на... 
 50 лет электронной почте 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Вывод всех компьютеров сети 17.11.05 18:08  Число просмотров: 2476
Автор: 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.
<programming> Поиск 
  • [C++] Вывод всех компьютеров сети - bacho_sun 17.11.05 18:08 [2476]








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


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