Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
1-35785
ЮРИЙ_К
2002-08-30 11:40
2002.09.12
В Гриде определенные столбцы редактируемые


3-35603
avr555
2002-08-20 18:26
2002.09.12
Прерывание выполнения запроса


1-35674
Алексей Ким
2002-09-02 12:16
2002.09.12
дин. загрузка dll


1-35692
neg2001
2002-09-02 15:28
2002.09.12
Подскажите, где взять VCL компоненты для шифрования и хеш-функции


1-35679
7Up
2002-09-02 12:27
2002.09.12
INSTAPI в С. А в Delphi?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский