取得网卡的物理地址(100分)

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

lixuejian

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何取得网卡的物理地址? 用API函数还是其他方法,多谢!
 
这些:

只能得到网络适配器的Mac地址,但是并不一定是硬件本身的,也可以是注册表中设置的。

修改注册表的方法:
HKEY_LOCAL_MACHINE/system/Currentcontrolset/services/classes/net,在下面找到一项叫params的,
在里面加一项NetworkAddress的主键,默认写你要设的mac地址,要连续的写,如004040404040
然后再到params主键下,添一个字符串,名字为NetworkAddress,值还设为你要设的mac,也连续写。
关闭注册表,重新启动,你的网卡地址已改。打开网络邻居的属性,双击网卡会发现有一个高级设置,
实际就是你在注册表中加的新项NetworkAddress,

const
sNetBiosError = 'NetBIOS错误%d';

type
TMACAddress = packed array[0..5] of Byte;
ENetBiosError = class(Exception);
TAStat = record Adapt: TAdapterStatus;
NameBuff: array[0..30] of TNameBuffer;
end;

function GetMacAddress(AdapterNum: Integer): TMACAddress;
var
Ncb: TNCB;
uRetCode: Char;
J: Integer;
Adapter: TAStat;
begin
FillChar(NCB, SizeOf(NCB), 0);
with NCB do
begin
ncb_command := Char(NCBRESET);
ncb_lana_num := Char(AdapterNum);
end;
uRetCode := Netbios(@Ncb);
if uRetCode <> #0 then raise Exception.CreateFmt(sNetBIOSError, [Ord(uRetCode)]);
FillChar(NCB, SizeOf(NCB), 0);
with NCB do
begin
ncb_command := Char(NCBASTAT);
ncb_lana_num := Char(AdapterNum);
StrCopy(ncb_callname, '*');
ncb_buffer := @Adapter;
ncb_length := sizeof(Adapter);
end;
uRetCode := Netbios(@Ncb);
if uRetCode <> #0 then raise Exception.CreateFmt(sNetBIOSError, [Ord(uRetCode)]);
for J := 0 to 5 do
Result[J] := Ord(Adapter.Adapt.Adapter_address[J]);
end;


方法2:

uses nb30;

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
Result := '';

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

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

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

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


ZeroMemory(@NCB, SizeOf(NCB)); // Get adapter address
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);

strTemp := ''; // Convert it to string
for intIdx := 0 to 5 do
strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]), 2);
Result := strTemp;
finally
end;
end;
 
用这个函数就行了。
...
uses nb30
...

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[intIdx]), 2);
Result := strTemp;
finally
end;
end;
 
iwalk: 谢谢! 用NBGetAdapterAddress函数可以正确得出网卡物理地址,但在WIN2000和WinXP中,
如果拔开网线(即断开网络连接),则取出的结果为空(用 'ipconfig /all' dos命令却可以)。
 
这个到没有试验过,你尝试使用我给你提供的第一个方法实验一下。
后一个方法是使用了NetBios的,当然需要存在网络,而在2000/xp下拔掉网线就没有了ip等。
 
yzhshi: 很感谢! 拔下网线还是不行!
 
这就真的不好办了[:(]
 
有意思,关注
 
拔掉网线就没有ip乐?谁说的?
 
在windows2000下,除非你更改注册表呀。
否则使用ipconfig会出现cable not connected之类的话,ip也ping不同,就是说ping不同自己
 
包装Dos命令,nbtstat -A 然后分析返回值就行了。
2000下网卡号是可以改的。
 
利用NetBios 你得装了相关的协议
 
comfan2001:
没错,我忘了说了,不过一般的机子都装。
 
谢谢各位!
 
后退
顶部