我用一段代码获得了计算机的网卡MAC地址,但是我用一个工具就可以随便更改MAC地址了,这样我获得的MAC就没有什么用了(不唯一了)。想问问高手们,是我获得MAC的计算机代码的方法不对呢,还是MAC的唯一性值得怀疑?急!谢谢 !

解决方案 »

  1.   

    我用一段代码获得了计算机的网卡MAC地址,但是我用一个工具就可以随便更改MAC地址了,这样我获得的MAC就没有什么用了(不唯一了)。想问问高手们,是我获得MAC的计算机代码的方法不对(那正确的代码应该怎么写呢?因为我怀疑有可能我的MAC地址获得的只是操作系统认为的,物理上并没有修改。而我的获得MAC的代码得到的只是操作系统认为的)呢,还是MAC的唯一性值得怀疑?急!谢谢 !
      

  2.   

    MAC地址是唯一的.你可以用IPCONFIG/ALL查看一下
      

  3.   

    可是我用一个修改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;
      

  4.   

    能的,软件http://lib.yctc.edu.cn/soft/list.asp?id=4139我用上面的代码就是可以读出改变了mac
      

  5.   

    但我还是相信是操作系统的信息变了,可是我应该怎样写代码才能读出真正的物理上的MAC呢,而不是基于操作系统表面的。
      

  6.   

    mac地址应该是可以修改的
    所以唯一标示一台计算机是很难的
      

  7.   


    // 取本机 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;
      

  8.   

    adapt: TASTAT  这个变量类型在哪个单元中???我要uses
      

  9.   

    大家还有好的编译过的代码吗?(要能获得物理意义上的MAC的)
      

  10.   

    unit Unit1;interfaceuses
      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;implementationfunction 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.
      

  11.   

    求能获得直接从物理层读到MAC地址的代码,上面的一但操作系统的MAC地址修改,计算机重启后,代码 得到的也就修改后的MAC了
      

  12.   

    MAC地址是可以被修改的,你的程序没有问题,读到的是真实的MAC