MACアドレス取得方法

解決


吉沢正太郎  2010-02-26 09:25:16  No: 37773

MACアドレスがうまく取れません、

コチラの方法では取れないPCも出現したりします、この方法は
環境によっての不安定さが無いと表記してあったものにはなるのですが

https://www.petitmonte.com/bbs/answers?question_id=6860

うまくMACアドレスを取得する方法を宜しくお願いします。


monaa  2010-02-26 09:59:26  No: 37774

リモートPCのmacアドレスですから当然、
相手PCがそれなりのプロトコルに対応してなければ取得は不可能です。
確実にmacアドレスを取得する方法なんてありませんョ。
http://homepage3.nifty.com/sugaku/Mac.htm


吉沢正太郎  2010-02-26 11:22:21  No: 37775

すいません、私が取得したいのは自分のMACアドレスなのですが、
すいません宜しくお願いします。


k  2010-02-26 20:17:51  No: 37776

https://www.petitmonte.com/bbs/answers?question_id=84
でどうでしょう。
MSDNへのリンクが切れていますが多分ここです。
[SDK32] イーサネット アダプタのMACアドレスを取得する 
http://support.microsoft.com/kb/118623/ja

またIPHELPERの
GetIfTable API
GetAdaptersInfo API
などでも取得できます。


吉沢正太郎  2010-02-27 02:33:41  No: 37777

k様ありがとうございます、
https://www.petitmonte.com/bbs/answers?question_id=84

コチラのほうも試みてみたのですがDelphi2010ではそのままでは動かず結局動かすことができませんでした。

もう少し手ほどきを宜しくお願いします。


monaa  2010-02-27 03:15:35  No: 37778

できれば掲示板のルール位は把握して頂きたいです。
こういうところでは動作しない場合、どんなエラーが出るのかまで書かないと対応できません。
というわけでにしのさんのソースを丸々コピーしてみました。
Button1.onClickだけ追加して以下のソースをコピペしてください。
動作確認はVista Delphi2009です。

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 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//https://www.petitmonte.com/bbs/answers?question_id=84
function GetMacAdress:string;
type
  PAstat = ^TAstat;
  TAstat = packed record
  adapt: TAdapterStatus;
  NameBuff: array [0 .. 29] of TNameBuffer;
  end;
var
  Adapter: TAstat;
  Ncb: TNCB;
  RetCode: Integer;
  lenum: TLanaEnum;
  i: integer;
begin
  Result := '';
  FillChar(Ncb, SizeOf(NCB), 0);
  Ncb.ncb_command := Char(NCBENUM);
  Ncb.ncb_buffer := @lenum;
  Ncb.ncb_length := SizeOf(lenum);
  RetCode := Integer(Netbios( @Ncb ));
  //Memo1.Lines.Add( 'The NCBENUM return code is: $' + IntToHex(RetCode, 2) );

  for i := 0 to integer(lenum.length)-1 do
  begin
    FillChar(Ncb, SizeOf(NCB), 0);
    Ncb.ncb_command := Char(NCBRESET);
    Ncb.ncb_lana_num := lenum.lana[i];
    RetCode := Integer(Netbios( @Ncb ));
    //Memo1.Lines.Add( 'The NCBRESET on LANA ' + IntToStr(Integer(lenum.lana[i]))
    //                +' return code is: $' + IntToHex(RetCode, 2) );
    FillChar(Ncb, SizeOf(NCB), 0);
    Ncb.ncb_command := Char(NCBASTAT);
    Ncb.ncb_lana_num := lenum.lana[i];
    Ncb.ncb_callname := '* ';
    Ncb.ncb_buffer := @Adapter;
    Ncb.ncb_length := SizeOf(Adapter);
    RetCode := Integer(Netbios( @Ncb ));
    //Memo1.Lines.Add( 'The NCBASTAT on LANA ' + IntToStr(Integer(lenum.lana[i]))
    //                +' return code is: $' + IntToHex(RetCode, 2) );
    if RetCode = 0 then
    begin
      Result := Result +
                   IntToHex(integer(Adapter.adapt.adapter_address[0]), 2)
           + '-' + IntToHex(integer(Adapter.adapt.adapter_address[1]), 2)
           + '-' + IntToHex(integer(Adapter.adapt.adapter_address[2]), 2)
           + '-' + IntToHex(integer(Adapter.adapt.adapter_address[3]), 2)
           + '-' + IntToHex(integer(Adapter.adapt.adapter_address[4]), 2)
           + '-' + IntToHex(integer(Adapter.adapt.adapter_address[5]), 2) + #$D#$A;
    end;
  end;
end;

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

end.


吉沢正太郎  2010-02-27 04:03:28  No: 37779

monaa様、完璧です、素晴らしい。

ほんとうにありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加