如何得到网络上机器(根据计算机名或IP)的网卡的MAC地址? (50分)

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

lastgood

Unregistered / Unconfirmed
GUEST, unregistred user!

如何用DELPHI得到网络上机器(根据计算机名或IP)的网卡的MAC地址?

附加信息(补充)

首先说声:谢谢。
但是,我要的不是本机网卡MAC地址,是在A机上运行程式,去取得B机的网卡MAC地址。

 
应该不能,除非网上有专门的机器存贮了这些信息。
 
快帮帮我啊,网络为局域网。
 
Function CreateUniqueClassID: string;
var GUID: TGUID;
WCLID: array[0..127] of WideChar;
begin
OleCheck(CoCreateGUID(GUID));
StringFromGuid2(GUID,WCLID,SizeOf(WCLID) div 2);
Result:=WideCharToString(WCLID)
end;

Function RetNetID:String;
var
S:String;
begin
S:=CreateUniqueClassID;
Result:=Copy(S,26,12);
end;

 
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;
Netbios(@ncb);
Netbios(@ncb);
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Chr(NCBAstat);
ncb.ncb_lana_num := lanaEnum.lana;
ncb.ncb_callname := '* ';
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;
 
你说的是网卡的MAC地址吧 现成例子,给你贴一下:

Function NBGetAdapterAddress(a:integer) : String;
Implementation

{$R *.DFM}

Procedure TForm1.Button1Click(Sender : TObject);
Begin
label1.Caption:=NBGetAdapterAddress(StrtoInt(Edit1.Text));
End;

Function NBGetAdapterAddress(a:Integer) : String;
Var

NCB : TNCB; // Netbios control block //NetBios控制块
ADAPTER : TADAPTERSTATUS; // Netbios adapter status//取网卡状态
LANAENUM : TLANAENUM; // Netbios lana
intIdx : Integer; // Temporary work value//临时变量
cRC : Char; // Netbios return code//NetBios返回值
strTemp : String; // Temporary string//临时变量

Begin
// Initialize
Result := '';

Try
// Zero control blocl
ZeroMemory(@NCB, SizeOf(NCB));

// Issue enum command
NCB.ncb_command := Chr(NCBENUM);
cRC := NetBios(@NCB);

// Reissue enum command
NCB.ncb_buffer := @LANAENUM;
NCB.ncb_length := SizeOf(LANAENUM);
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit;

// Reset adapter
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[a];
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit;

// Get adapter address
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBASTAT);
NCB.ncb_lana_num := LANAENUM.lana[a];
StrPCopy(NCB.ncb_callname, '*');
NCB.ncb_buffer := @ADAPTER;
NCB.ncb_length := SizeOf(ADAPTER);
cRC := NetBios(@NCB);

// Convert it to string
strTemp := '';
For intIdx := 0 To 5 Do
strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[in
tIdx]),2);
Result := strTemp;
Finally
End;
End;


End.
 
首先说声:谢谢。
但是,我要的不是本机网卡MAC地址,是在A机上运行程式,去取得B机的网卡MAC地址。
 
应该是可以的,我看见有软件实现此功能,但我不会.
 
我这里有个,
留个email吧。
 
一种比较简单的方法就是在程序中调用DOS SHELL命令:
方法如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,filectrl, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
StaticText1: TStaticText;
Panel1: TPanel;
Bevel1: TBevel;
RadioGroup1: TRadioGroup;
StaticText2: TStaticText;
StaticText3: TStaticText;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
var
temp:string;
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
command:string;
begin
memo1.Lines.Clear ;
if fileexists(temp) then
deletefile(temp);
//每次查询前将前次结果清除,上面三个清空或删除语句保证了多次查询时每次得到的都是最新查询的结果。

case radiogroup1.ItemIndex of
0: command:='command.com /C nbtstat '+'-a '+edit1.text+' > '+temp;
1: command:='command.com /C nbtstat '+'-A '+edit2.text+' > '+temp;
2: command:='command.com /C nbtstat '+'-n > '+temp;
end;
winexec(pchar(command),sw_hide);
while not fileexists(temp) do
sleep(3000);
//为了临时文件的建立等待3秒种,根据网络速度,可以适当增加此值

try
memo1.lines.loadfromfile(temp);
except
//此处不写任何代码,即关闭任何异常。
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.lines.Clear;
temp:='c:/nbtstat.txt';
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if fileexists(temp) then
deletefile(temp);
//程序退出时删掉临时文件
end;

end.
 

谢谢!能否不用外部程式来实现,这样怪怪的,问题也多。

cbdiy,我的邮件是: lastgood@163.com
 

楼上的(arp -a)什么意思?
 
在这里:用delphi写的nbtstat,绝对不是通过调用DOS命令实现的。
http://www.playicq.com/dispdoc.php?t=27&amp;id=433
 
接受答案了.
 
顶部