Форум: "Сети";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Внизhow to get all host names in local network Найти похожие ветки
← →
poiuytrewq (2002-06-06 21:24) [0]есть локальная сеть (допустим 10 компов).
нужно узнать host names этих десяти компов
пожалуйста source code :)
← →
Song (2002-06-06 21:40) [1]В FAQ есть.
← →
poiuytrewq (2002-06-06 22:26) [2]Я так понимаю, ты имеешь ввиду приведенную ниже процедуру?
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 }
/////////////
← →
poiuytrewq (2002-06-06 23:09) [3]Реально работающий вариант < :)>
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 23:13) [4]правда теперь нужно вводить (в EDIT3) название рабочей группы
и следоваетельно ВОПРОС:
как определить КАКИЕ есть рабочие группы у компа
HELP HELP
← →
serd_hhc (2002-06-15 15:05) [5]Я уже как-то спрашивал, никто не знает. ЧЁРТ.
← →
Егоров Николай (2002-06-15 20:10) [6]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;
← →
Егоров Николай (2002-06-15 20:11) [7]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:12) [8]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.
← →
serd_hhc (2002-06-18 09:23) [9]А можно ли вариант поменьше. Ведь наверное можно заставить Windows сделать это вместо тебя.
п.с.
Я пишу маленькое консольное приложение.
← →
Malder (2002-06-18 13:22) [10]троян то есть =)
← →
sizmrebi (2002-06-18 13:38) [11]Ia pereslal Gotovuiu programu so svoimi kodami na tvoi email
← →
serd_hhc (2002-06-18 13:57) [12]2sizmrebi>
prishli mne toje.
2Malder>
покаяние.
У нас в посёлке (городского типа т.е. ДЕРЕВНЯ) есть комп. клуб.
Так вот я этим ***** помогал (дело было летом) ну и играл на халяву (пол часа в день), а потом, он (голова), сказал, что лето кончилось, а значит и халява тоже. Мои постеры и журналы не отдают, играть - платно. Один раз пришёл с младшим братом поиграть, так админ (сын головы), крутился возле моего компа, что бы я что-нить не сделал... Ну вот у меня мысль и созрела... Наказать гадов!!!! С этих пор я и увлёкся вирусо-трояно(писательством and впариванием).
Принцип будет такой:
Пришёл (например мой друг), вставил дискету, запустил, вынул дискету. Трояно-вирус сам распространился, и в один ПРЕКРАСНЫЙ день убил W9x, прописав, например, в autoexec.bat комманды
"deltree /y @WinDIR" и "deltree /y C:\".
Если у кого уже есть хоть что-то готовое, помогите! Плз!
← →
app (2002-06-19 21:33) [13]Попытки ответа на вопрос от 18.06.02 13:57 иначе как почтой будут пресекаться
Комодератор
← →
hogus (2002-07-04 21:28) [14]В ответе !!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
← →
asmer (2002-07-06 14:22) [15]типа, я тож задавал вопрос о перечислении рабочих групп в сети... мне никто не ответил... егоров николай приводит пример рекурсии, перечисляющий всю иеархию сетевых ресурсов... чаще енто не требуется (например, в моей небольшой утилитке)... для перечисления всех рабочих групп достаточно сделать изменения в примере из фака, перечисляющем компьютеры в группе:
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 ентим способом находятся все рабочие группы (в нашей сети их две :))...
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c