网络侦测问题求助(70分)

  • 主题发起人 主题发起人 LIUYECAI
  • 开始时间 开始时间
L

LIUYECAI

Unregistered / Unconfirmed
GUEST, unregistred user!
我要写这样一个程序,它要实现这样的功能:
1.每半小时扫描局域网,
2.扫描过程中记录每台电脑的状态包括是否开机,登录人
3.要求把扫描得到的这些信息在某时可以email给别人!
我是初学者, 谁有思路?? 谁有这方面的代码?? 帮帮我吧!!
 
装tcp/ip协议,先固定分配ip,并记录,依次ping每台机器,通了说明开机,但登录人就
没办法了,除非在每台机器上装客户端软件,取得登录人后,按固定时间送回收集信息
的服务器,email给别人可以用mmsmtp控件

 
如果不能用tcp/ip呢?因为在局域网中使用tcp/ip是比较慢的,使用netbios比较快。
 
听说DELPHI自带的FASTNET组件没有第三方组件ICS好用!! 是这样的吗?
 
在每个机器上安装一个客户端,控制机上用一个WINSOCKET,每隔半个小时查询一次,或者
在客户机上设置让它每隔一定时间就向控制机汇报一下情况(如果它关机了,控制机也就
得不到信息了),WINSOCKET可以不用TCP/IP协议。
 
能否不要装客户端和服务器,而只要在一台电脑里运行这个程序,就可以完成这项工作呢?
 
怎样装winsocket activex control ?我怎么找不到它.
 
有谁用过API函数getusername,它可以取得用户名吗?
 
下面代码调用icmp.dll实现Ping功能。
unit PingUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls,winsock;
type
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = packed record
TTL: Byte;
TOS: Byte;
Flags: Byte;
OptionsSize: Byte;
OptionsData: PChar;
end;

PIcmpEchoReply = ^TIcmpEchoReply;
TIcmpEchoReply = packed record
Address: DWORD;
Status: DWORD;
RTT: DWORD;
DataSize: Word;
Reserved: Word;
Data: Pointer;
Options: TIPOptionInformation;
end;
TIcmpCreateFile = function: THandle; stdcall;
TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall;
TIcmpSendEcho = function(IcmpHandle:THandle;
DestinationAddress: DWORD;
RequestData: Pointer;
RequestSize: Word;
RequestOptions: PIPOptionInformation;
ReplyBuffer: Pointer;
ReplySize: DWord;
Timeout: DWord
): DWord; stdcall;
TPingForm = class(TForm)
StatusShow: TMemo;
Panel1: TPanel;
pingedit: TEdit;
exebutton: TButton;
procedure FormCreate(Sender: TObject);
procedure exebuttonClick(Sender: TObject);
private
{ Private declarations }

hICMP: THANDLE;
IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle: TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
public
{ Public declarations }
end;

var
PingForm: TPingForm;

implementation

{$R *.DFM}

procedure TPingForm.FormCreate(Sender: TObject);
var
WSAData: TWSAData;
hICMPdll: HMODULE;
begin
wsastartup($101,wsadata);
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP := IcmpCreateFile;
StatusShow.Text := '';
statusshow.Align := alclient;
StatusShow.Lines.Add('目的IP地址 字节数 返回时间(毫秒)');
end;


procedure TPingForm.exebuttonClick(Sender: TObject);
var
IPOpt:TIPOptionInformation;// IP Options for packet to send
FIPAddress:DWORD;
pReqData,pRevData:PChar;
pIPE:PIcmpEchoReply;// ICMP Echo reply buffer
FSize: DWORD;
MyString:string;
FTimeOut:DWORD;
BufferSize:DWORD;
begin
if PingEdit.Text <> '' then
begin
FIPAddress := inet_addr(PChar(PingEdit.Text));
FSize := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
FillChar(pIPE^, SizeOf(pIPE^), 0);
pIPE^.Data := pRevData;
MyString := 'Hello,World';
pReqData := PChar(MyString);
FillChar(IPOpt, Sizeof(IPOpt), 0);
IPOpt.TTL := 64;
FTimeOut := 4000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString), @IPOpt, pIPE, BufferSize, FTimeOut);
try
if pReqData^ = pIPE^.Options.OptionsData^ then
begin
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
end;
except
messagedlg('没有找到该IP地址!',mtinformation,[mbok],0);
end;
FreeMem(pRevData);
FreeMem(pIPE);
end;
end;
end.
 
很感谢zw84611,可你的代码只能拼到电脑,而不能找出电脑名和用户名,还请指点!
下面的代码只可以找到本机的用户名,电脑名,以及IP:
//用到winsock activex controls 中的TCP组件
//用到api function: bool getusername(lptstr lpBuffer, lpdword nsize);
var
user: Pchar;
l : dword;
compuser: string;
------------------------------------
l:=1024;
user:=stralloc(succ(l));
if getusername(user,l) then
compuser:=strpas(user)
else
compuser:='?';
strdispose(user);

memo1.lines.add(compuser);
memo1.lines.add(tcp1.localIP);
memo1.lines.add(tcp1.localHostname);
//上面的代码可以检测到本机机用户名,电脑名, IP
**
现在请问大家怎样将上面的功能用到整个局域网,
急用!!请大家帮帮忙吧!!
 
大家出出主意啊!!
 
不装客户端好象只能PING,不能获取用户名。
 
大家踊跃发言啊!!!!
等下我再给这贴加100分!!!
发言吧!!!!
我这个急啊!!!!
 
可以参考冯志宏老师的“月光搜索”,您所说的功能它都可以实现。
 
hoke, 不知有没有源码的.大家出出注意啊!!
 
用 nbtstat -a 命令加IP号 可得到某ip的MAC地址,工作组名,机器名。但我不知道该命令
用的是什么原理,在Delphi中如何实现。请问有谁知道?
 
在我给的代码中添加如下内容可以得到某IP地址的机器名。
在 Var中添加:HostName:string;
在 TIcmpEchoReply = packed record 记录中添加成员变量 phe: pHostent;
在 TPingForm.exebuttonClick(Sender: TObject) 事件中添加如下代码:
pIPE^.Phe := GetHostByAddr(@FIPAddress, 4, AF_INET);
if pIPE^.Phe <> Nil then HostName:=pIPE^.Phe^.h_name;
Label1.Caption:='主机名:'+Hostname;
用以上方法可以解析出已知IP号的主机名,但解析速度比较慢,请耐心等候。
 
后退
顶部