全分送出寻找一个扫描 计算机名 ip 和mac的程序 并把扫描到的数据放入数据库
程序只有一个服务端。没有客户端的那种。我看别的软件都可以实现。
高手们帮帮忙。
程序只有一个服务端。没有客户端的那种。我看别的软件都可以实现。
高手们帮帮忙。
解决方案 »
- 奇思异想编程序 Delphi篇
- 请问drivecommbobox和FileListBox控件在哪啊?
- 有个简单问题请各位帮忙看一下
- 强烈担心Borland的经营之道会断送其前景
- BDE 和ADO的主要区别是什么?什么情况下选择BDE,什么时候选择ADO?
- 一个错误代码is not a valid integer value?什么意思`?
- InstallSheld6.3如何使用LaunchAppAndWait()?
- 一个关于数据接受和发送的问题!提出好的架构就有分!!!!!!!!!!!!!!!
- 请问怎么在delphi程序中批处理的执行SQL语句
- 高分求救......
- 如何处理Twebbrowser里弹出的对话框
- 多线程中查询数据的问题
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,nb30, StdCtrls;type
PASTAT = ^TASTAT;
TASTAT = record
adapter : TAdapterStatus;
name_buf : TNameBuffer;
end; TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function Getmac:string;
function MacStr():String;
function PartitionString(StrV,PrtSymbol: string): TStringList;
end;var
Form1: TForm1;
implementation{$R *.dfm}function TForm1.Getmac:string;
var
ncb : TNCB;
s:string;
adapt :TASTAT;
lanaEnum : TLanaEnum;
i, j, m : integer;
strPart, strMac : string;
begin
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Char(NCBEnum);
ncb.ncb_buffer := PChar(@lanaEnum);
ncb.ncb_length := SizeOf(TLanaEnum);
s:=Netbios(@ncb);
for i := 0 to integer(lanaEnum.length)-1 do
begin
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Char(NCBReset);
ncb.ncb_lana_num := lanaEnum.lana[i];
Netbios(@ncb);
Netbios(@ncb);
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Chr(NCBAstat);
ncb.ncb_lana_num := lanaEnum.lana[i];
//ncb.ncb_callname := '* ';
StrCopy(ncb.ncb_callname,pchar('* '));
ncb.ncb_buffer := PChar(@adapt);
ncb.ncb_length := SizeOf(TASTAT);
m:=0;
if (Win32Platform = VER_PLATFORM_WIN32_NT) then
m:=1;
if m=1 then
begin
if Netbios(@ncb) = Chr(0) then
strMac := '';
for j := 0 to 5 do
begin
strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart + '-';
end;
SetLength(strMac, Length(strMac)-1);
end;
if m=0 then
if Netbios(@ncb) <> Chr(0) then
begin
strMac := '';
for j := 0 to 5 do
begin
strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart + '-';
end;
SetLength(strMac, Length(strMac)-1);
end;
end;
result:=strmac;
end;function TForm1.PartitionString(StrV,PrtSymbol: string): TStringList;
var
iTemp: integer;
begin
result := TStringList.Create;
iTemp := pos(PrtSymbol,StrV);
while iTemp>0 do begin
if iTemp>1 then result.Append(copy(StrV,1,iTemp-1));
delete(StrV,1,iTemp+length(PrtSymbol)-1);
iTemp := pos(PrtSymbol,StrV);
end;
if Strv<>'' then result.Append(StrV);
end;
function TForm1.MacStr():String;
var
Str:TStrings;
i:Integer;
MacStr:String;
begin
MacStr:='';
Str:=TStringList.Create;
Str:=PartitionString(Getmac,'-');
for i:=0 to Str.Count-1 do
MacStr:=MacStr+Str[i];
Result:=MacStr;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.text:=MacStr;//集成和非集成网卡
end;end.
至于计算机名得看其他计算机支持与否了。
还有个思路,设置IP段,用icmp探测机器是否开机,然后根据IP获得mac及计算机名
arp欺骗或者不想联网了。
另外给个参考http://www.delphibbs.com/keylife/iblog_show.asp?xid=28527
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TMacAddress = array[1..8] of byte;
PTMibIPNetRow = ^TMibIPNetRow;
TMibIPNetRow = packed record
dwIndex: DWord;
dwPhysAddrLen: DWord;
bPhysAddr: TMACAddress;
dwAddr: DWord;
dwType: DWord;
end;
//
PTMibIPNetTable = ^TMibIPNetTable;
TMibIPNetTable = packed record
dwNumEntries: DWORD;
Table: array [0..0] of TMibIPNetRow;
end; TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure Get_ARPTable( List: TStrings );
function MacAddr2Str( MacAddr: TMacAddress; size: integer ): string;
function IpAddr2Str( IPAddr: DWORD ): string;
function Str2IpAddr( IPStr: string ): DWORD;
function NextToken( var s: string; Separator: string ): string;
public
{ Public declarations }
end;const
ARPEntryType : array[1..4] of string = ( 'Other', 'Invalid', 'Dynamic', 'Static');
var
Form1: TForm1;implementation{$R *.dfm}
function GetRTTAndHopCount( DestIPAddress: DWORD; HopCount: PULONG; MaxHops: ULONG; RTT: PULONG ): BOOL; stdCall; external 'IPHLPAPI.DLL';
function GetIpNetTable( pIpNetTable: PTMibIPNetTable; pdwSize: PULONG; bOrder: BOOL ): DWORD; stdcall; external 'IPHLPAPI.DLL';procedure TForm1.Get_ARPTable( List: TStrings );
var
IPNetRow : TMibIPNetRow;
TableSize : DWORD;
NumEntries : DWORD;
ErrorCode : DWORD;
i : integer;
pBuf : PChar;
begin
NumEntries := 0;
if not Assigned( List ) then EXIT;
List.Clear;
//首先取得列表所需内存的大小
TableSize := 0;
pBuf := nil;
ErrorCode := GetIPNetTable( PTMIBIpNetTable( pBuf ), @TableSize, false );
if ErrorCode = ERROR_NO_DATA then
begin
List.Add( ' ARP-cache empty.' );
EXIT;
end;
//取得列表
GetMem( pBuf, TableSize );
ErrorCode := GetIpNetTable( PTMIBIPNetTable( pBuf ), @TableSize, false );
if ErrorCode = NO_ERROR then
begin
NumEntries := PTMIBIPNetTable( pBuf )^.dwNumEntries;
if NumEntries > 0 then
begin
inc( pBuf, SizeOf( DWORD ) );
for i := 1 to NumEntries do
begin
IPNetRow := PTMIBIPNetRow( PBuf )^;
with IPNetRow do
List.Add( Format( '%8x | %12s | %16s| %10s',
[dwIndex, MacAddr2Str( bPhysAddr, dwPhysAddrLen ),
IPAddr2Str( dwAddr ), ARPEntryType[dwType]]));
inc( pBuf, SizeOf( IPNetRow ) );
end;
end
else
List.Add( ' ARP-cache empty.' );
end
else
List.Add( SysErrorMessage( ErrorCode ) );
dec( pBuf, SizeOf( DWORD ) + NumEntries * SizeOf( IPNetRow ) );
FreeMem( pBuf );
end;function TForm1.MacAddr2Str( MacAddr: TMacAddress; size: integer ): string;
var
i : integer;
begin
if Size = 0 then
begin
Result := '00-00-00-00-00-00';
EXIT;
end
else Result := '';
//
for i := 1 to Size do
Result := Result + IntToHex( MacAddr[i], 2 ) + '-';
Delete( Result, Length( Result ), 1 );
end;
// -----------------------------------------------------------------------------
function TForm1.IpAddr2Str( IPAddr: DWORD ): string;
var
i : integer;
begin
Result := '';
for i := 1 to 4 do
begin
Result := Result + Format( '%3d.', [IPAddr and $FF] );
IPAddr := IPAddr shr 8;
end;
Delete( Result, Length( Result ), 1 );
end;procedure TForm1.Button1Click(Sender: TObject);
var
IPadr : Int64;
Rtt, HopCount : longint;
begin
TButton(Sender).Enabled := False;
Rtt := 0;
HopCount := 0;
IPadr := Str2IpAddr( Trim(Edit1.Text) ); // inet_addr 函数
if GetRTTAndHopCount( IPadr, @HopCount, 3, @RTT ) then
Get_ARPTable(Memo1.Lines)
else
Memo1.Lines.Add('超时')
TButton(Sender).Enabled := True;
end;function TForm1.Str2IpAddr( IPStr: string ): DWORD;
var
i : integer;
Num : DWORD;
intRec : Integer;
begin
Result := 0;
for i := 1 to 4 do
try
intRec := StrToInt( NextToken( IPStr, '.') );
Num := DWORD((intRec) shl 24);
Result := DWORD( Result shr 8 ) or Num;
except
Result := 0;
end;
end;function TForm1.NextToken( var s: string; Separator: string ): string;
var
Sep_Pos : Integer;
begin
Result := '';
if length( s ) > 0 then begin
Sep_Pos := pos( Separator, s );
if Sep_Pos > 0 then begin
Result := copy( s, 1, Pred( Sep_Pos ) );
Delete( s, 1, Sep_Pos );
end
else begin
Result := s;
s := '';
end;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text := '192.168.1.1';
end;end.
[email protected]
给我一个吧 谢谢了!