Форум: "Сети";
Текущий архив: 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