网卡MAC的问题

seeder 2003-05-19 03:33:08
我用一段代码获得了计算机的网卡MAC地址,但是我用一个工具就可以随便更改MAC地址了,这样我获得的MAC就没有什么用了(不唯一了)。想问问高手们,是我获得MAC的计算机代码的方法不对呢,还是MAC的唯一性值得怀疑?急!谢谢 !
...全文
8 点赞 收藏 20
写回复
20 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Randy_Lynd 2003-07-01
MAC地址是可以被修改的,你的程序没有问题,读到的是真实的MAC
回复
seeder 2003-05-21
求能获得直接从物理层读到MAC地址的代码,上面的一但操作系统的MAC地址修改,计算机重启后,代码 得到的也就修改后的MAC了
回复
seeder 2003-05-20
这段代码也不行,看来是没用了,还有高手吗?
回复
wjlsmail 2003-05-20
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,nb30;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function Getmac: string;
public
{ Public declarations }
end;

type
PASTAT = ^TASTAT;
TASTAT = record
adapter: TAdapterStatus;
name_buf: TNameBuffer;
end;

var
Form1: TForm1;

implementation

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

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Getmac) ;
end;

end.

回复
wjlsmail 2003-05-20
uses nb30 ;
回复
seeder 2003-05-19
大家up一下呀
回复
888888888888 2003-05-19
关注
回复
seeder 2003-05-19
自己up,大家来帮忙啊!
回复
seeder 2003-05-19
我用一段代码获得了计算机的网卡MAC地址,但是我用一个工具就可以随便更改MAC地址了,这样我获得的MAC就没有什么用了(不唯一了)。想问问高手们,是我获得MAC的计算机代码的方法不对(那正确的代码应该怎么写呢?因为我怀疑有可能我的MAC地址获得的只是操作系统认为的,物理上并没有修改。而我的获得MAC的代码得到的只是操作系统认为的)呢,还是MAC的唯一性值得怀疑?急!谢谢 !
回复
seeder 2003-05-19
大家还有好的编译过的代码吗?(要能获得物理意义上的MAC的)
回复
seeder 2003-05-19
adapt: TASTAT 这个变量类型在哪个单元中???我要uses
回复
wjlsmail 2003-05-19

// 取本机 Mac
// 硬盘上的,也忘记了从哪来的:)

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

回复
mingyeh 2003-05-19
mac地址应该是可以修改的
所以唯一标示一台计算机是很难的
回复
seeder 2003-05-19
但我还是相信是操作系统的信息变了,可是我应该怎样写代码才能读出真正的物理上的MAC呢,而不是基于操作系统表面的。
回复
seeder 2003-05-19
当然修改后要重启计算机才会有效果
回复
seeder 2003-05-19
能的,软件http://lib.yctc.edu.cn/soft/list.asp?id=4139

我用上面的代码就是可以读出改变了mac
回复
lif2000 2003-05-19
不可能会修改吧
回复
seeder 2003-05-19
可是我用一个修改mac的软件修改后,我的程序就真的变成我修改的地址了。代码如下:是不是我的代码有问题呢?
Function GetAdapterMac(ANo:Integer):String;
var
Ncb:TNcb;
Adapter:TAdapterStatus;
Lanaenum:TLanaenum;
IntIdx:Integer; //
cRc:Char;
StrTemp:String;
begin
Result:='';
Try
ZeroMemory(@Ncb,SizeOf(Ncb));
Ncb.ncb_command:=Chr(NCbenum);
NetBios(@NCb);
Ncb.ncb_buffer:=@Lanaenum; //再处理enum命令
Ncb.ncb_length:=SizeOf(Lanaenum);
cRc:=NetBios(@Ncb);
if Ord(cRc)<>0 then
exit;
ZeroMemory(@Ncb,SizeOf(Ncb)); //适配器清零
Ncb.ncb_command:=Chr(NcbReset);
Ncb.ncb_lana_num:=Lanaenum.lana[aNo];
cRc:=NetBios(@Ncb);
if Ord(cRc)<>0 then
exit;
//得到适配器状态
ZeroMemory(@Ncb,SizeOf(Ncb));
Ncb.ncb_command:=Chr(NcbAstat);
Ncb.ncb_lana_num:=Lanaenum.lana[aNo];
StrPcopy(Ncb.ncb_callname,'*');
Ncb.ncb_buffer:=@Adapter;
Ncb.ncb_length:=SizeOf(Adapter);
NetBios(@Ncb);

//将mac地址转换成字符串输出
StrTemp:='';
For IntIdx:=0 to 5 do
StrTemp:=StrTemp+IntToHex(Integer(Adapter.adapter_address[intIdx]),2);
Result:=StrTemp;
Finally
end;
end;
回复
easyboot 2003-05-19
MAC地址是唯一的.

你可以用IPCONFIG/ALL查看一下
回复
seeder 2003-05-19
有没有人知道呀,wu.........
回复
相关推荐
发帖
网络通信/分布式开发
创建于2007-08-02

1572

社区成员

Delphi 网络通信/分布式开发
申请成为版主
帖子事件
创建了帖子
2003-05-19 03:33
社区公告
暂无公告