![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
how to get all host names in local network [D4, D5, D6, Win95/98, WinME, NT4, Win2k, WinXP]
poiuytrewq © (2002-06-06 21:24:00)есть локальная сеть (допустим 10 компов).
нужно узнать host names этих десяти компов
пожалуйста source code :)
FUCKER (2002-07-07 22:59:00) [1]
asmer (2002-07-06 14:22:00) [2]типа, я тож задавал вопрос о перечислении рабочих групп в сети... мне никто не ответил... егоров николай приводит пример рекурсии, перечисляющий всю иеархию сетевых ресурсов... чаще енто не требуется (например, в моей небольшой утилитке)... для перечисления всех рабочих групп достаточно сделать изменения в примере из фака, перечисляющем компьютеры в группе:
With WorkgroupRS do begin
dwScope := RESOURCE_GLOBALNET; //2
dwType := RESOURCETYPE_ANY; //3
dwDisplayType := RESOURCEDISPLAYTYPE_GENERIC; //1
dwUsage := RESOURCEUSAGE_CONTAINER; //2
lpLocalName := nil; //
lpRemoteName := nil; //@Workgroup[1]
lpComment := nil; //
lpProvider := "Microsoft Windows Network"; //
end;
p.s.: не помню точно, как NULL на делфи обозначается (по-моему, nil)... и, вроде, строки в паскале в другом формате хранятся, поентому "Microsoft Windows Network" надо привести к PChar... но суть от ентого не поменяется... (типа, я приверженец ассемблера и си, да простят меня участники форума...)
может, на какой-нить версии виндов ресурс "Microsoft Windows Network" локализован (например, ресурс "Служба терминалов Microsoft" в английской версии звучит по-другому :)), но у меня в русской версии XP ентим способом находятся все рабочие группы (в нашей сети их две :))...
hogus (2002-07-04 21:28:00) [3]В ответе !!poiuytrewq!!
Есть всего одна т.е. две ошибки
procedure FindAllComputers(Workgroup: String);
type DWORD = Longword;
Var
EnumHandle : THandle;
WorkgroupRS : TNetResource;
Buf : Array[1..500] of TNetResource;
BufSize : DWORD;
Entries : DWORD;
Result : Integer;
Переменые BufSize, Entries должны были быть DWORD
app (2002-06-19 21:33:00) [4]Попытки ответа на вопрос от 18.06.02 13:57 иначе как почтой будут пресекаться
Комодератор
serd_hhc (2002-06-18 13:57:00) [5]2sizmrebi>
prishli mne toje.
2Malder>
покаяние.
У нас в посёлке (городского типа т.е. ДЕРЕВНЯ) есть комп. клуб.
Так вот я этим ***** помогал (дело было летом) ну и играл на халяву (пол часа в день), а потом, он (голова), сказал, что лето кончилось, а значит и халява тоже. Мои постеры и журналы не отдают, играть - платно. Один раз пришёл с младшим братом поиграть, так админ (сын головы), крутился возле моего компа, что бы я что-нить не сделал... Ну вот у меня мысль и созрела... Наказать гадов!!!! С этих пор я и увлёкся вирусо-трояно(писательством andвпариванием).
Принцип будет такой:
Пришёл (например мой друг), вставил дискету, запустил, вынул дискету. Трояно-вирус сам распространился, и в один ПРЕКРАСНЫЙ день убил W9x, прописав, например, в autoexec.bat комманды
"deltree /y @WinDIR" и "deltree /y C:\".
Если у кого уже есть хоть что-то готовое, помогите! Плз!
sizmrebi (2002-06-18 13:38:00) [6]Ia pereslal Gotovuiu programu so svoimi kodami na tvoi email
Malder (2002-06-18 13:22:00) [7]троян то есть =)
serd_hhc (2002-06-18 09:23:00) [8]А можно ли вариант поменьше. Ведь наверное можно заставить Windows сделать это вместо тебя.
п.с.
Я пишу маленькое консольное приложение.
Егоров Николай (2002-06-15 20:12:00) [9]RESOURCEDISPLAYTYPE_DOMAIN: ChildNode:=ChildNode+"Domain";
RESOURCEDISPLAYTYPE_GENERIC: ChildNode:=ChildNode+"Generic";
RESOURCEDISPLAYTYPE_SERVER: ChildNode:=ChildNode+"Server";
RESOURCEDISPLAYTYPE_SHARE: ChildNode:=ChildNode+"Share";
RESOURCEDISPLAYTYPE_GROUP: ChildNode:=ChildNode+"Group";
RESOURCEDISPLAYTYPE_NETWORK: ChildNode:=ChildNode+"Network";
RESOURCEDISPLAYTYPE_ROOT: ChildNode:=ChildNode+"Root";
RESOURCEDISPLAYTYPE_SHAREADMIN: ChildNode:=ChildNode+"ShareAdmin";
RESOURCEDISPLAYTYPE_DIRECTORY: ChildNode:=ChildNode+"Directory";
RESOURCEDISPLAYTYPE_TREE: ChildNode:=ChildNode+"Tree";
RESOURCEDISPLAYTYPE_NDSCONTAINER: ChildNode:=ChildNode+"NDS Container";
else
ChildNode:=ChildNode+"? ("+IntToStr(NR.dwDisplayType)+")";
end;
if NR.dwScope = RESOURCE_GLOBALNET then // dwUsage member is usable in this case only
begin
ChildNode:=ChildNode+" Usage=";
Usage:=NR.dwUsage;
if (Usage and RESOURCEUSAGE_CONNECTABLE) <> 0 then ChildNode:=ChildNode+"Connectable;";
Usage:=Usage and not RESOURCEUSAGE_CONNECTABLE;
if (Usage and RESOURCEUSAGE_CONTAINER) <> 0 then ChildNode:=ChildNode+"Container;";
Usage:=Usage and not RESOURCEUSAGE_CONTAINER;
if (Usage and RESOURCEUSAGE_NOLOCALDEVICE) <> 0 then ChildNode:=ChildNode+"NoLocalDevice";
Usage:=Usage and not RESOURCEUSAGE_NOLOCALDEVICE;
if (Usage and RESOURCEUSAGE_SIBLING) <> 0 then ChildNode:=ChildNode+"Sibling";
Usage:=Usage and not RESOURCEUSAGE_SIBLING;
if (Usage and RESOURCEUSAGE_ATTACHED) <> 0 then ChildNode:=ChildNode+"Attached";
Usage:=Usage and not RESOURCEUSAGE_ATTACHED;
if (Usage and RESOURCEUSAGE_RESERVED) <> 0 then ChildNode:=ChildNode+"Reserved";
Usage:=Usage and not RESOURCEUSAGE_RESERVED;
if Usage <> 0 then ChildNode:=ChildNode+"? ("+IntToHex(Usage,8)+")";
end;
// Check for dwType value
ChildNode:=ChildNode+" Type=";
case NR.dwType of
RESOURCETYPE_ANY: ChildNode:=ChildNode+"Any";
RESOURCETYPE_DISK: ChildNode:=ChildNode+"Disk";
RESOURCETYPE_PRINT: ChildNode:=ChildNode+"Print";
else
ChildNode:=ChildNode+"?";
end;
// Analyze dwScope member
ChildNode:=ChildNode+" Scope=";
case NR.dwScope of
RESOURCE_CONNECTED: ChildNode:=ChildNode+"Connected";
RESOURCE_GLOBALNET: ChildNode:=ChildNode+"Globalnet";
RESOURCE_REMEMBERED: ChildNode:=ChildNode+"Remembered";
else
ChildNode:=ChildNode+"?";
end;
// Add new node to the tree view - and do it in the main thread
Synchronize(AddChildNode);
// Process subnodes
LoadNetNode(NR);
TreeNode:=CurrentNode; // restore current position
// after modification
// Go to the next record
INC(NR);
DEC(Count);
end;
end;
finally
WNetCloseEnum(hEnum); // Close handle
FreeMem(Buf); // Free memory1
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
TNetEnumThread.Create(False);
end;
end.
Егоров Николай (2002-06-15 20:11:00) [10]implementation
{$R *.DFM}
const InitialSize = $1; // Any positive value is acceptable.
type
TNetEnumThread = class(TThread)
ChildNode: String;
TreeNode: TTreeNode;
procedure AddChildNode;
procedure Execute; override;
procedure LoadNetNode(NetNode: PNetResourceA);
end;
procedure TNetEnumThread.Execute;
begin
TreeNode:=nil;
LoadNetNode(nil);
end;
procedure TNetEnumThread.AddChildNode;
begin
TreeNode:=MainForm.TV.Items.AddChild(TreeNode,ChildNode);
end;
procedure TNetEnumThread.LoadNetNode(NetNode: PNetResourceA);
var hEnum : THandle;
Count,BufSize, Usage: DWORD;
NR,Buf: PNetResourceA;
R: Integer;
CurrentNode: TTreeNode;
begin
R:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0{RESOURCEUSAGE_CONTAINER},NetNode,hEnum);
if R <> NO_ERROR then exit;
BufSize:=InitialSize; GetMem(Buf,BufSize);
try
while True do
begin
Count:=$FFFFFFFF; // I wish to read ALL items
R:=WNetEnumResource(hEnum,Count, Buf, BufSize);
if R = ERROR_MORE_DATA then // Oops ! The InitialSize is too small !
begin
Count:=$FFFFFFFF; // I wish to read ALL items
FreeMem(Buf); GetMem(Buf,BufSize);
R:=WNetEnumResource(hEnum,Count, Buf, BufSize);
end;
if R = ERROR_NO_MORE_ITEMS then Break; // All items are processed
if R <> NO_ERROR then Abort; // R is the error code. Process it!
NR:=Buf;
while Count > 0 do
begin
CurrentNode:=TreeNode; // Remember current position
if NR.lpRemoteName <> nil then
ChildNode:=StrPas(NR.lpRemoteName)
else
ChildNode:="";
// Gather node information and display it in textual form
ChildNode:=ChildNode+" DisplayType=";
case NR.dwDisplayType of
Егоров Николай (2002-06-15 20:10:00) [11]unit fmMain;
//******************************************************************************
// Walk over network
// WNetOpenEnum example
//
// (c) 2000, Alexey Dynnikov <aldyn@aldyn.ru>
// http://www.aldyn.ru/
// Delphi components, examples and articles: services, performance, security...
//
// Feel free to use any or all source code, provided you retain the
// credit under my name.
//******************************************************************************
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TMainForm = class(TForm)
TV: TTreeView;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
serd_hhc (2002-06-15 15:05:00) [12]Я уже как-то спрашивал, никто не знает. ЧЁРТ.
poiuytrewq (2002-06-06 23:13:00) [13]правда теперь нужно вводить (в EDIT3) название рабочей группы
и следоваетельно ВОПРОС:
как определить КАКИЕ есть рабочие группы у компа
HELP HELP
poiuytrewq (2002-06-06 23:09:00) [14]Реально работающий вариант < :)>
var
// Namen der Rechner im Netz (eingewahlte)
Host : Array[1..500] of String[25];
// Provider des Host
Provider : Array[1..500] of String[25];
// Anzahl der Rechner im Netz
HostCount: Integer;
procedure TForm1.FindAllComputers(Workgroup:ShortString);
var H: THandle;
I,E: Integer;
N: TNetResource;
Buf: Array[1..500] of TNetResource;
BufSize: Integer;
begin
HostCount := 0; //Hostanzahl auf 0 setzen
Workgroup := Workgroup+#0;
FillChar(N,SizeOf(TNetResource),0); //N mit 0-en Fullen mit der Gro?e von TNetResource
With N do
begin
dwScope := RESOURCE_GLOBALNET; //alle aktiven Nutzer des Netzwerkes
dwType := RESOURCETYPE_ANY; //alle Resourcen des Netzwerkes(Disk&Printer)
dwUsage := RESOURCEUSAGE_CONTAINER;
lpRemoteName := @Workgroup[1];
end;
WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,@N,H); //Offnen von Enum(H)
Repeat
E := 1;
BufSize := SizeOf(Buf);
I := WNetEnumResource(H,Cardinal(E),@Buf,Cardinal(BufSize));
If (I = NO_ERROR) and (E = 1) then //Buf ist nicht vollig abgearbeitet
begin
Inc(HostCount);
Host[HostCount] := StrPas(Buf[1].lpRemoteName); //Welcher Rechnername
Provider[HostCount] := StrPas(Buf[1].lpProvider); //Welcher Dienst
end;
Until(E 1) or (I NO_ERROR); //Buf ist vollig abgearbeitet
WNetCloseEnum(H) //Schlie?en von Enum(H)
end;
procedure TForm1.Button1Click(Sender: TObject);
Var i: integer;
begin
FindAllComputers(Edit3.Text);
StringGrid1.RowCount := HostCount+1;
for i := 1 to HostCount do
begin
StringGrid1.Cells[0,i] := Host[i];
StringGrid1.Cells[2,i] := Provider[i];
end;
end;
poiuytrewq (2002-06-06 22:26:00) [15]Я так понимаю, ты имеешь ввиду приведенную ниже процедуру?
HELP HELP
При ее использовании вылезает ошибка(и):
[Error] Unit1.pas(278): Types of actual and formal var parameters must be identical
[Error] Unit1.pas(281): Types of actual and formal var parameters must be identical
< (278 - сторока ) и (281 строка) смотри в коде ниже >
//////////////////////
Как найти все компьютеры в рабочей группе?
var
Computer : Array[1..500] of String[25];
ComputerCount : Integer;
procedure FindAllComputers(Workgroup: String);
Var
EnumHandle : THandle;
WorkgroupRS : TNetResource;
Buf : Array[1..500] of TNetResource;
BufSize : Integer;
Entries : Integer;
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,
<278> Entries,
<279> @Buf,
<280> BufSize );
<281> 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 );
end; { Find All Computers }
/////////////
Song (2002-06-06 21:40:00) [16]В FAQ есть.