Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определить имя рабочей группы


Страницы:   1 2

DimaK ©   (2003-07-16 12:02:00) 

Может кто знает как определить имя рабочей группы?


Kolian   (2003-07-24 11:18:00) [1]

Спасиба меня тоже этот вопрос мучил.


DimaK   (2003-07-23 11:34:00) [2]

Спасибо ребята! разобрался. Просто раньше особо возможности небыло поппробывать на других компах.


Толик   (2003-07-23 11:28:00) [3]

А никак её не надо игнорировать. Скорее всего на этой машине сетка криво настроена. В самом-то деле, если на других машинах работает, а на этой нет, значит, наверное, дело всё-таки не в проге, а в машине? :)


DimaK   (2003-07-23 09:44:00) [4]

Ребята, всем спасибо, разобрался, оказалось это у меня на кривой XP дурачит, а на всех других моих (включая тоже с XP) машинах все прекрасно работает.

Огромное спасибо Толику!

И на последок последний вопрос :)
А как игнорировать ошибку, я пробовал ее обходить, результат тот же, пустой экран но только без предупреждения.


MegaVolt   (2003-07-21 15:45:00) [5]

Если выдазит ошибка попробуй её игнорировать и работать как будто её нету. У меня была та же фигня только вылазило сообщение что есть дополнительные данные пришлось считать ето сообщение отсутсвием ошибки


Толик   (2003-07-18 18:14:00) [6]

to DimaK © (18.07.03 16:42)
Короче, для WorkgroupRS задать точно такие же параметры, как в моём последнем примере.

with WorkgroupRS do begin
dwScope := RESOURCE_GLOBALNET;
dwType := RESOURCETYPE_ANY;
dwDisplayType := RESOURCEDISPLAYTYPE_DOMAIN or RESOURCEDISPLAYTYPE_GROUP;
dwUsage := $FFFFFFFF;
lpLocalName := nil;
lpRemoteName := "Сеть Microsoft Windows";
lpComment := nil;
lpProvider := "Сеть Microsoft Windows";
end;


Толик   (2003-07-18 18:11:00) [7]

список всех рабочих групп и доменов сети.

procedure TForm1.Button2Click(Sender: TObject);
var
hEnum: THandle;
Cnt, Size: longword;
BaseNetres: TNetResource;
NetRes: TNetRes;
i: longint;
begin
Size := System.SizeOf(TNetRes);
System.FillChar(NetRes, Size, 0);
BaseNetRes.dwScope := RESOURCE_GLOBALNET;
BaseNetRes.dwType := RESOURCETYPE_ANY;
BaseNetRes.dwDisplayType := RESOURCEDISPLAYTYPE_DOMAIN or RESOURCEDISPLAYTYPE_GROUP;
BaseNetRes.dwUsage := $FFFFFFFF;
BaseNetRes.lpLocalName := nil;
BaseNetRes.lpRemoteName := "Сеть Microsoft Windows";
BaseNetRes.lpComment := nil;
BaseNetRes.lpProvider := "Сеть Microsoft Windows";
if Windows.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @BaseNetRes, hEnum) <> NO_ERROR then
EXIT;
Cnt := $FFFFFFFF;
if Windows.WNetEnumResource(hEnum, Cnt, @NetRes, Size) <> NO_ERROR then
EXIT;
for i := 0 to Cnt - 1 do
( NetRes[i].lpRemoteName)

список всех рабочих групп и доменов сети.

procedure TForm1.Button2Click(Sender: TObject);
var
hEnum: THandle;
Cnt, Size: longword;
BaseNetres: TNetResource;
NetRes: TNetRes;
i: longint;
begin
Size := System.SizeOf(TNetRes);
System.FillChar(NetRes, Size, 0);
BaseNetRes.dwScope := RESOURCE_GLOBALNET;
BaseNetRes.dwType := RESOURCETYPE_ANY;
BaseNetRes.dwDisplayType := RESOURCEDISPLAYTYPE_DOMAIN or RESOURCEDISPLAYTYPE_GROUP;
BaseNetRes.dwUsage := $FFFFFFFF;
BaseNetRes.lpLocalName := nil;
BaseNetRes.lpRemoteName := "Сеть Microsoft Windows";
BaseNetRes.lpComment := nil;
BaseNetRes.lpProvider := "Сеть Microsoft Windows";
if Windows.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @BaseNetRes, hEnum) <> NO_ERROR then
EXIT;
Cnt := $FFFFFFFF;
if Windows.WNetEnumResource(hEnum, Cnt, @NetRes, Size) <> NO_ERROR then
EXIT;
for i := 0 to Cnt - 1 do
ListBox1.Items.Add(NetRes[i].lpRemoteName);
end;


Это-то хоть работает? :)


DimaK   (2003-07-18 16:42:00) [8]

Не, ребята, я что-то совсем затормозил.

Вот текст который у меня работает, пожалуйста исправить или допишите что надо.


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ComCtrls, WinSock;

type
TForm1 = class(TForm)
Button1: TButton;
ListView1: TListView;
ProgressBar1: TProgressBar;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
//
Computer: Array[1..100] of String[25];
ComputerCount: Integer;

NetGrup: String;

implementation

{$R *.dfm}


procedure FindAllComputers(Workgroup: String);
var EnumHandle: THandle;
WorkgroupRS: TNetResource;
Buf: Array[1..500] of TNetResource;
BufSize: THandle;
Entries: THandle;
Result: Integer;
begin
ComputerCount:=0;
Workgroup:=Workgroup + #0;
FillChar(WorkgroupRS, SizeOf(WorkgroupRS), 0);
with WorkgroupRS do
begin
dwScope:=2;
dwType:=3;
dwDisplayType:=1;
dwUsage:=2;
lpRemoteName:=@Workgroup[1];
end;
WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,
@WorkgroupRS, EnumHandle);
repeat
Entries:=1;
BufSize:=SizeOf(Buf);
Result:=WNetEnumResource(EnumHandle, Entries, @Buf,BufSize );
If (Result = NO_ERROR) and (Entries = 1) then
begin
Inc(ComputerCount);
Computer[ComputerCount]:=StrPas(Buf[1].lpRemoteName);
end;
until
(Entries <> 1) or (Result <> NO_ERROR);
WNetCloseEnum(EnumHandle);
//
NetGrup:=Workgroup;
end;

function HostToIP(Name: string): string;
var WSData : TWSAData;
HostEnt : PHostEnt;
addr : pchar;
begin
WSAStartup($0101, wsdata);
try
hostEnt := gethostbyname(pchar(Name));
if Assigned(hostEnt) then
if Assigned(hostEnt^.h_addr_list) then begin
addr := HostEnt^.h_addr_list^;
if Assigned (addr) then begin
RESULT := Format("%d.%d.%d.%d", [byte(addr[0]), byte(addr[1]), byte(addr[2]), byte(addr[3])]);
end;
end;
finally
WSACleanup();
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
ListItem: TListItem;
begin
FindAllComputers("WORK"); // !! WORK - это моя группа, а мне надо автоматически
//
ProgressBar1.Position:=0;
ProgressBar1.Min:=0;
ProgressBar1.Max:=ComputerCount;
//
ListView1.Clear;
with ListView1 do
begin
for i:=1 to ComputerCount do
begin
ListItem:=Items.Add;
ListItem.Caption:=copy(Computer[i],3,25);
ListItem.SubItems.Add(HostToIP(ListItem.Caption));
//
( NetGrup)

Не, ребята, я что-то совсем затормозил.

Вот текст который у меня работает, пожалуйста исправить или допишите что надо.


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ComCtrls, WinSock;

type
TForm1 = class(TForm)
Button1: TButton;
ListView1: TListView;
ProgressBar1: TProgressBar;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
//
Computer: Array[1..100] of String[25];
ComputerCount: Integer;

NetGrup: String;

implementation

{$R *.dfm}


procedure FindAllComputers(Workgroup: String);
var EnumHandle: THandle;
WorkgroupRS: TNetResource;
Buf: Array[1..500] of TNetResource;
BufSize: THandle;
Entries: THandle;
Result: Integer;
begin
ComputerCount:=0;
Workgroup:=Workgroup + #0;
FillChar(WorkgroupRS, SizeOf(WorkgroupRS), 0);
with WorkgroupRS do
begin
dwScope:=2;
dwType:=3;
dwDisplayType:=1;
dwUsage:=2;
lpRemoteName:=@Workgroup[1];
end;
WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,
@WorkgroupRS, EnumHandle);
repeat
Entries:=1;
BufSize:=SizeOf(Buf);
Result:=WNetEnumResource(EnumHandle, Entries, @Buf,BufSize );
If (Result = NO_ERROR) and (Entries = 1) then
begin
Inc(ComputerCount);
Computer[ComputerCount]:=StrPas(Buf[1].lpRemoteName);
end;
until
(Entries <> 1) or (Result <> NO_ERROR);
WNetCloseEnum(EnumHandle);
//
NetGrup:=Workgroup;
end;

function HostToIP(Name: string): string;
var WSData : TWSAData;
HostEnt : PHostEnt;
addr : pchar;
begin
WSAStartup($0101, wsdata);
try
hostEnt := gethostbyname(pchar(Name));
if Assigned(hostEnt) then
if Assigned(hostEnt^.h_addr_list) then begin
addr := HostEnt^.h_addr_list^;
if Assigned (addr) then begin
RESULT := Format("%d.%d.%d.%d", [byte(addr[0]), byte(addr[1]), byte(addr[2]), byte(addr[3])]);
end;
end;
finally
WSACleanup();
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
ListItem: TListItem;
begin
FindAllComputers("WORK"); // !! WORK - это моя группа, а мне надо автоматически
//
ProgressBar1.Position:=0;
ProgressBar1.Min:=0;
ProgressBar1.Max:=ComputerCount;
//
ListView1.Clear;
with ListView1 do
begin
for i:=1 to ComputerCount do
begin
ListItem:=Items.Add;
ListItem.Caption:=copy(Computer[i],3,25);
ListItem.SubItems.Add(HostToIP(ListItem.Caption));
//
ListItem.SubItems.Add(NetGrup);
//
ProgressBar1.Position:=i;
end;
end;
end;


end.


G   (2003-07-18 16:21:00) [9]

function FindAllComputers(Workgroup: string):Integer;
var
EnumHandle : THandle;
WorkgroupRS : TNetResource;
BufSize : Cardinal;
Entries : Cardinal;
Rest : Cardinal;
begin
PcNetCount := 0;
Workgroup := Workgroup + #0;
FillChar(WorkgroupRS, SizeOf(WorkgroupRS) , 0);
with WorkgroupRS do begin
dwScope := RESOURCE_GLOBALNET;
dwType := RESOURCETYPE_ANY;
dwDisplayType := RESOURCEDISPLAYTYPE_DOMAIN;
dwUsage := RESOURCEUSAGE_CONTAINER;
lpRemoteName := @Workgroup[1];
end;
WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,@WorkgroupRS,EnumHandle );
Entries := 200;
BufSize:=SizeOf(Buf);
Rest:=WNetEnumResource(EnumHandle,Entries,@Buf[0],BufSize);
if (Rest = NO_ERROR) and (Entries > 0) then PcNetCount:=Entries;
WNetCloseEnum( EnumHandle );
end; { Find All Computers }

Использование:
PCNetCount:= FindAllComputers("");
в Buf вернет имена всех рабочих групп в сети

( buf[0].lpRemoteName)

function FindAllComputers(Workgroup: string):Integer;
var
EnumHandle : THandle;
WorkgroupRS : TNetResource;
BufSize : Cardinal;
Entries : Cardinal;
Rest : Cardinal;
begin
PcNetCount := 0;
Workgroup := Workgroup + #0;
FillChar(WorkgroupRS, SizeOf(WorkgroupRS) , 0);
with WorkgroupRS do begin
dwScope := RESOURCE_GLOBALNET;
dwType := RESOURCETYPE_ANY;
dwDisplayType := RESOURCEDISPLAYTYPE_DOMAIN;
dwUsage := RESOURCEUSAGE_CONTAINER;
lpRemoteName := @Workgroup[1];
end;
WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,@WorkgroupRS,EnumHandle );
Entries := 200;
BufSize:=SizeOf(Buf);
Rest:=WNetEnumResource(EnumHandle,Entries,@Buf[0],BufSize);
if (Rest = NO_ERROR) and (Entries > 0) then PcNetCount:=Entries;
WNetCloseEnum( EnumHandle );
end; { Find All Computers }

Использование:
PCNetCount:= FindAllComputers("");
в Buf вернет имена всех рабочих групп в сети

PCNetCount:= FindAllComputers(buf[0].lpRemoteName);
в Buf вернет имена компов в сети


DimaK   (2003-07-18 16:02:00) [10]

А ты можешь мне выслать исходники по почте, попробую сам полазеть чтобы тебя не напрягать?

koop@online.bryansk.ru


Толик   (2003-07-18 15:58:00) [11]

Ну не знаю даже что и посоветовать.
Я сейчас специально вышел из домена, загнал себя в рабочую группу - всё работает.
А проводник-то корректно показывает сетевое окружение?


DimaK   (2003-07-18 14:52:00) [12]

Привет Толик!

Данный пример ведет себя точно также как и твой первый.
В принципе я из него взял функцию HostToIP и все заработало с моим примером, но у меня получился замкнутый круг, чтобы узнать IP адрес - надо знать имя машины, а чтобы узнать имя машины надо знать имя рабочей группы. Мой пример полностью работает, только имя группы я как писал руками, так и пишу. Нет способа автоматически его узнать? Блин, остался один шаг и то над чем бьюсь неделю будет готово.


DimaK   (2003-07-18 14:51:00) [13]

Привет Толик!

Данный пример ведет себя точно также как и твой первый.
В принципе я из него взял функцию HostToIP и все заработало с моим примером, но пу меня получился замкнутый круг, чтобы узнать IP адрес - надо знать имя машины, а чтобы узнать имя машины надо знать имя рабочей группы. Мой пример полностью работает, только имя группы я как писал руками, так и пишу. Нет способа автоматически его узнать? Блин, остался один шаг и то над чем бьюсь неделю будет готово.


Толик   (2003-07-18 11:17:00) [14]

Так, ещё раз и по порядку.
Вышеприведённый код, скопированный один в один без каких либо изменений работает?
Что говорит ф-я WNetGetLastError?
Проводник показываеи сетевое окружение?
Чудес-то не бывает, Explorer использует эти же самые ф-и для формирования дерева сетевого окружения.

P.S.
Конечно, в данном примере ещё неплохо было бы вызывать WNetCloseEnum.


DimaK   (2003-07-18 09:14:00) [15]

Блин, Толик результат тотже "Дополнительные данные отсутствуют"
именно на томже месте. Почему?


Толик   (2003-07-17 18:51:00) [16]


function HostToIP(Name: string): string;
var
WSData : TWSAData;
HostEnt : PHostEnt;
addr : pchar;
begin
WSAStartup($0101, wsdata);
try
hostEnt := gethostbyname(pchar(Name));
if Assigned(hostEnt) then
if Assigned(hostEnt^.h_addr_list) then begin
addr := HostEnt^.h_addr_list^;
if Assigned (addr) then begin
RESULT := Format("%d.%d.%d.%d", [byte(addr[0]), byte(addr[1]), byte(addr[2]), byte(addr[3])]);
end;
end;
finally
WSACleanup();
end
end;


procedure TForm1.Button5Click(Sender: TObject);
type
TNetRes = array[0..255] of TNetResource;
var
hEnum: THandle;
Cnt, Size: longword;
NR: TNetRes;
i, j: longint;
Msg: pchar;
begin
try
Size := System.SizeOf(TNetRes);
System.FillChar(NR, Size, 0);

{"сеть Microsoft Windows"}
if Windows.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @NR, hEnum) <> NO_ERROR then
raise TObject.Create();
Cnt := $FFFFFFFF;
if Windows.WNetEnumResource(hEnum, Cnt, @NR, Size) <> NO_ERROR then
raise TObject.Create();

{список доменов}
if Windows.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @NR, hEnum) <> NO_ERROR then
raise TObject.Create();
Cnt := $FFFFFFFF;
if Windows.WNetEnumResource(hEnum, Cnt, @NR, Size) <> NO_ERROR then
raise TObject.Create();

for i := 0 to Cnt - 1 do begin
{список компов}
if Windows.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @NR[i], hEnum) <> NO_ERROR then
raise TObject.Create();
ListBox1.Items.Add(NR[i].lpRemoteName);
Cnt := $FFFFFFFF;
if Windows.WNetEnumResource(hEnum, Cnt, @NR, Size) <> NO_ERROR then
raise TObject.Create();
for j := 0 to Cnt - 1 do
ListBox1.Items.Add(" " + NR[j].lpRemoteName + " " + HostToIP(Copy(NR[j].lpRemoteName, 3, Length(NR[j].lpRemoteName))));
end;
except on E: TObject do
try
Windows.FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
nil, Windows.GetLastError(), LANG_NEUTRAL shl 16, pchar(@Msg), 0, nil);
Windows.MessageBox(Application.Handle, Msg, pchar(Application.Title), MB_OK);
finally
( longint(@Msg)


function HostToIP(Name: string): string;
var
WSData : TWSAData;
HostEnt : PHostEnt;
addr : pchar;
begin
WSAStartup($0101, wsdata);
try
hostEnt := gethostbyname(pchar(Name));
if Assigned(hostEnt) then
if Assigned(hostEnt^.h_addr_list) then begin
addr := HostEnt^.h_addr_list^;
if Assigned (addr) then begin
RESULT := Format("%d.%d.%d.%d", [byte(addr[0]), byte(addr[1]), byte(addr[2]), byte(addr[3])]);
end;
end;
finally
WSACleanup();
end
end;


procedure TForm1.Button5Click(Sender: TObject);
type
TNetRes = array[0..255] of TNetResource;
var
hEnum: THandle;
Cnt, Size: longword;
NR: TNetRes;
i, j: longint;
Msg: pchar;
begin
try
Size := System.SizeOf(TNetRes);
System.FillChar(NR, Size, 0);

{"сеть Microsoft Windows"}
if Windows.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @NR, hEnum) <> NO_ERROR then
raise TObject.Create();
Cnt := $FFFFFFFF;
if Windows.WNetEnumResource(hEnum, Cnt, @NR, Size) <> NO_ERROR then
raise TObject.Create();

{список доменов}
if Windows.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @NR, hEnum) <> NO_ERROR then
raise TObject.Create();
Cnt := $FFFFFFFF;
if Windows.WNetEnumResource(hEnum, Cnt, @NR, Size) <> NO_ERROR then
raise TObject.Create();

for i := 0 to Cnt - 1 do begin
{список компов}
if Windows.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @NR[i], hEnum) <> NO_ERROR then
raise TObject.Create();
ListBox1.Items.Add(NR[i].lpRemoteName);
Cnt := $FFFFFFFF;
if Windows.WNetEnumResource(hEnum, Cnt, @NR, Size) <> NO_ERROR then
raise TObject.Create();
for j := 0 to Cnt - 1 do
ListBox1.Items.Add(" " + NR[j].lpRemoteName + " " + HostToIP(Copy(NR[j].lpRemoteName, 3, Length(NR[j].lpRemoteName))));
end;
except on E: TObject do
try
Windows.FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
nil, Windows.GetLastError(), LANG_NEUTRAL shl 16, pchar(@Msg), 0, nil);
Windows.MessageBox(Application.Handle, Msg, pchar(Application.Title), MB_OK);
finally
Windows.LocalFree(longint(@Msg));
end;
end;
end;

в Uses добавить WinSock. Ну а как сделать всё то же самое не для всех доменов, а для конкретного - надеюсь труда не составит.


DimaK   (2003-07-17 17:58:00) [17]

дело в том,что я сам админ :(
сообщение выдается при втором проходе первого цикла и срабатывает условие
except on E: TObject do
а там уже на строке
Windows.MessageBox(Application.Handle, Msg, pchar
(Application.Title), MB_OK);
винда выдает сообщение.


В принципе я писал что ты говориш, а именно:

var
Computer: Array[1..100] of String[25];
ComputerCount: Integer;

procedure FindAllComputers(Workgroup: String);
var EnumHandle: THandle;
WorkgroupRS: TNetResource;
Buf: Array[1..500] of TNetResource;
BufSize: THandle;
Entries: THandle;
Result: Integer;
begin
ComputerCount:=0;
Workgroup:=Workgroup + #0;
FillChar(WorkgroupRS, SizeOf(WorkgroupRS), 0);
with WorkgroupRS do
begin
dwScope:=2;
dwType:=3;
dwDisplayType:=1;
dwUsage:=2;
lpRemoteName:=@Workgroup[1];
end;
WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,
@WorkgroupRS, EnumHandle);
repeat
Entries:=1;
BufSize:=SizeOf(Buf);
Result:=WNetEnumResource(EnumHandle, Entries, @Buf,BufSize );
If (Result = NO_ERROR) and (Entries = 1) then
begin
Inc(ComputerCount);
Computer[ComputerCount]:=StrPas(Buf[1].lpRemoteName);
end;
until
(Entries <> 1) or (Result <> NO_ERROR);
WNetCloseEnum(EnumHandle);



А в кнопке:
( "WORK")

дело в том,что я сам админ :(
сообщение выдается при втором проходе первого цикла и срабатывает условие
except on E: TObject do
а там уже на строке
Windows.MessageBox(Application.Handle, Msg, pchar
(Application.Title), MB_OK);
винда выдает сообщение.


В принципе я писал что ты говориш, а именно:

var
Computer: Array[1..100] of String[25];
ComputerCount: Integer;

procedure FindAllComputers(Workgroup: String);
var EnumHandle: THandle;
WorkgroupRS: TNetResource;
Buf: Array[1..500] of TNetResource;
BufSize: THandle;
Entries: THandle;
Result: Integer;
begin
ComputerCount:=0;
Workgroup:=Workgroup + #0;
FillChar(WorkgroupRS, SizeOf(WorkgroupRS), 0);
with WorkgroupRS do
begin
dwScope:=2;
dwType:=3;
dwDisplayType:=1;
dwUsage:=2;
lpRemoteName:=@Workgroup[1];
end;
WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,
@WorkgroupRS, EnumHandle);
repeat
Entries:=1;
BufSize:=SizeOf(Buf);
Result:=WNetEnumResource(EnumHandle, Entries, @Buf,BufSize );
If (Result = NO_ERROR) and (Entries = 1) then
begin
Inc(ComputerCount);
Computer[ComputerCount]:=StrPas(Buf[1].lpRemoteName);
end;
until
(Entries <> 1) or (Result <> NO_ERROR);
WNetCloseEnum(EnumHandle);



А в кнопке:
FindAllComputers("WORK");

!!! WORK - это имя моей рабочей группы.

Вся эта прелесть работает, но имя надо писать руками, если ставлю пустое место или другие символы - пишет про сеть MicroSoft Windows и так далее в этом роде.

Мне же надо чтобы при нажатии на кнопку в ListBox"е появились имена компов в сети, их IP адрес и имя рабочей группы где они находятся.



Толик   (2003-07-17 17:29:00) [18]

А в какой момент вылезает эта ошибка?
Идея здесь в следующем: при первом проходе цикла д.б. выдано "сеть MicroSoft Windows", на втором - список всех доменов/рабочих групп, на третьем - список всех компов данного домена, на четвёртом - список всех расшаренных ресурсов данного компа ну и т.д. Т.е. таким образом формируется дерево, аналогичное тому, что мы видим в сетевом окружении.
Начинать надо всегда постепенно - сделать цикл for i := 0 to 0,
если в ListBox"е появиться "сеть MicroSoft Windows", то идти дальше, если нет, то читать Help"ы по WNetOpenEnum или поговорить с админом насчёт прав...


DimaK   (2003-07-17 16:47:00) [19]

Спасибо за подключение к диалогу, вот только у меня винда выдает "Дополнительные данные отсутствуют" и естественно ListBox пустой. Что может быть?


Толик   (2003-07-17 16:22:00) [20]

вчера был вопрос про поиск серверов.
Сегодня вопрос про рабочие группы. Ладно, поменяем одну цифру

procedure TForm1.Button5Click(Sender: TObject);
type
TNetRes = array[0..255] of TNetResource;
PNetRes = ^TNetRes;
var
hEnum: THandle;
Cnt, Size: longword;
NR: TNetRes;
i: longint;
Msg: pchar;
begin
try
Size := System.SizeOf(TNetRes);
System.FillChar(NR, Size, 0);
for i := 0 to 1 do begin
if Windows.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @NR[0], hEnum) <> NO_ERROR then
raise TObject.Create();
Cnt := $FFFFFFFF;
if Windows.WNetEnumResource(hEnum, Cnt, @NR, Size) <> NO_ERROR then
raise TObject.Create();
end;
for i := 0 to Cnt - 1 do
ListBox1.Items.Add(NR[i].lpRemoteName);
except on E: TObject do
try
Windows.FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
nil, Windows.GetLastError(), LANG_NEUTRAL shl 16, pchar(@Msg), 0, nil);
Windows.MessageBox(Application.Handle, Msg, pchar(Application.Title), MB_OK);
finally
Windows.LocalFree(longint(@Msg));
( аналогично примеру)

вчера был вопрос про поиск серверов.
Сегодня вопрос про рабочие группы. Ладно, поменяем одну цифру

procedure TForm1.Button5Click(Sender: TObject);
type
TNetRes = array[0..255] of TNetResource;
PNetRes = ^TNetRes;
var
hEnum: THandle;
Cnt, Size: longword;
NR: TNetRes;
i: longint;
Msg: pchar;
begin
try
Size := System.SizeOf(TNetRes);
System.FillChar(NR, Size, 0);
for i := 0 to 1 do begin
if Windows.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @NR[0], hEnum) <> NO_ERROR then
raise TObject.Create();
Cnt := $FFFFFFFF;
if Windows.WNetEnumResource(hEnum, Cnt, @NR, Size) <> NO_ERROR then
raise TObject.Create();
end;
for i := 0 to Cnt - 1 do
ListBox1.Items.Add(NR[i].lpRemoteName);
except on E: TObject do
try
Windows.FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
nil, Windows.GetLastError(), LANG_NEUTRAL shl 16, pchar(@Msg), 0, nil);
Windows.MessageBox(Application.Handle, Msg, pchar(Application.Title), MB_OK);
finally
Windows.LocalFree(longint(@Msg));
end;
end;
end;

в ListBox"е будет список всех рабочих групп в сети. Если непременно нужно свою, то в каждой из них ищи свой комп (аналогично примеру) и оставь только её.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо