Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.22;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.016 c
3-71487
Vadim
2003-08-31 23:01
2003.09.22
Проблема с сохранением БД


14-71895
Developerr
2003-09-02 18:37
2003.09.22
Кто-нибудь использует F1Book версии 6.0 и выше?


3-71516
Петр
2003-09-01 05:12
2003.09.22
Создание отчетов в RAVE


8-71767
landy
2003-05-22 13:59
2003.09.22
text-to-speech engine


3-71532
Relaxxx
2003-08-29 10:30
2003.09.22
Footer у DBGridEh