Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Вниз

Определить имя рабочей группы   Найти похожие ветки 

 
DimaK   (2003-07-16 12:02) [0]

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


 
DimaK   (2003-07-17 10:54) [1]

Что никто не знает? Хоть дайте сылку на доку, а там сам разберусь.


 
Vlad Oshin   (2003-07-17 10:58) [2]

в реестре можно


 
DimaK   (2003-07-17 11:06) [3]

А если разная операционка? К примеру 9x b XP


 
Vlad Oshin   (2003-07-17 11:16) [4]

смотреть в разных местах :)


 
DimaK   (2003-07-17 12:16) [5]

Молодец :)

Дело в том, что мне надо всего навсего вывести сетевое окружение
(т.е. имена машин, рабочая группа и IP адрес машин)

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


 
DimaK   (2003-07-17 15:24) [6]

Ладно, а в реестре где, а то что-то с ходу не нашол.


 
Vlad Oshin   (2003-07-17 15:29) [7]

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer

у меня тут (2000)


 
DimaK   (2003-07-17 15:45) [8]

Ну, а где дальше, там же продолжение ветвей (у меня XP)


 
Vlad Oshin   (2003-07-17 16:12) [9]

Дальше собственно параметр, справа

ЗЫ
набери regedit ( или regedt32)
нажми F3
набери что надо, ок

:)


 
DimaK   (2003-07-17 16:16) [10]

Да в том-то и дело, я это еще вчера пробовал, по поиску ничего не находет (давал поиск имени моей рабочей группы)


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

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

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"е будет список всех рабочих групп в сети. Если непременно нужно свою, то в каждой из них ищи свой комп (аналогично примеру) и оставь только её.


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

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


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

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


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

дело в том,что я сам админ :(
сообщение выдается при втором проходе первого цикла и срабатывает условие
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 18:51) [15]


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-18 09:14) [16]

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


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

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

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


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

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

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


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

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

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


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

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


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

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

koop@online.bryansk.ru


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

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:42) [23]

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

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


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.


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

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

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;


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


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

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;


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

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


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

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

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

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


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

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


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

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


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

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



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.011 c
1-71731
Марат
2003-09-10 14:04
2003.09.22
Календарь


14-71936
TButton
2003-09-02 16:33
2003.09.22
2К и МЕ


6-71805
MegaVolt
2003-07-21 15:56
2003.09.22
Почему процедура перестала выдавать имя компутера?


3-71509
Eagle Owl
2003-08-30 00:28
2003.09.22
Добавление поля к таблице


6-71802
Jonni_M
2003-07-24 18:04
2003.09.22
IdPOP3 или NMPOP3 что лучше использовать





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский