• ベストアンサー
  • すぐに回答を!

iphlpapiのGetAdaptersInfoでNICのMacアドレスを取りたいのですが...

こんにちは、 質問No.4996に関連して、VC++でiphlpapiのGetAdaptersInfoを使って、NICのMACアドレスを取得しようと考えています。WIN XP、WIN2000では、目的のアドレスが取得できるのですが、WIN98、WIN MEではNIC以外にPPP AdapterやAOL Adapterといった、ダイアルアップ用のアドレスも同時に取れてしまい、大変困っています。取得したものを見れば検討は付くのですがプログラム的により分ける方法が分かりません。確実にNICのMACアドレスだけを取得する方法はないでしょうか?NetBiosやiphlpapiの他の関数も検討しましたが、ネットワークが構築されていないPCから取得できるのはGetAdaptersInfoだけのようですので、出来ればこの関数を使って解決したいと考えています。どうか、よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数3127
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.3
  • z64423
  • ベストアンサー率53% (26/49)

Platform SDK をあさって (+ ipconfig.exe のバイナリダンプも漁って…) GetIfTable() というのが使えそうなので試してみました。 引数 MIB_IFTABLE 型の中のMIB_IFROW 型のメンバ   dwType = MIB_IF_TYPE_ETHERNET(6)   dwMtu = 1500 (byte)   dwSpeed = 10,000,000 (10Mbps), or 100,000,000 (100Mbps), ... なのが Ether だ、と断定できないでしょうか。 ※MAC アドレスは   dwPhysAddrLen = MAC address length   bPhysAddr[] = MAC address  に入ってきます。 モデム環境がないので、上記の方法で断言できるかはテスト出来ていません。 それと、WinXP で確認したのみです。 なにか参考になれば…

共感・感謝の気持ちを伝えよう!

質問者からのお礼

z64423 様 色々調べていただいて、ありがあとうございました。 GetIfTable()を使って、試してみました。dwMtuとdwSpeedの二つの変数を使って、識別できそうです。Windows98でも確認しました。Iphlpapi、私もあさってみました。色々あるんですね。ヘルプがないものもあり、苦しいながら勉強になりました。スピードは10Mbps、100Mbpsに加えて1GBpsも考慮しようかと思っていますが、勘違いしていないでしょうか?何しろネットワークのことも、知識が少ないもので... とりあえず、GetIfTable()をWindowsMeや2000も含めて色々な環境でテストしてみます。それで抜けてしまった場合にGetAdaptersInfo()を使う形でいこうと思います。

その他の回答 (3)

  • 回答No.4

likeacofee様 ANo.1の者です。 同じコンピュータで、Windows98, 2000で、 IP_ADAPTER_INFOのメンバ変数がどうなるか 調べてみました。結果は以下のとおりです。 なお、このコンピュータには、LANカードと MODEMカードが入っています。 [Windows98]---------------------------- Description[1] = PPP Adapter. AdapterName[1] = MAC Address[1] = 44:45:53:54:00:00 Type[1] = 6(MIB_IF_TYPE_ETHERNET) dwOperStatus[1]= MIB_IF_OPER_STATUS_UNREACHABLE Description[2] = Realtek 8139-series PCI NIC AdapterName[2] = MAC Address[2] = 00:01:80:22:5D:12 Type[2] = 6(MIB_IF_TYPE_ETHERNET) dwOperStatus[2]= MIB_IF_OPER_STATUS_UNREACHABLE [Windows2000]--------------------------- Description[1] = Realtek 8139-series PCI NIC AdapterName[1] = {2C2405DD-5B38-482A-B8B3-42CC7E008698} MAC Address[1] = 00:01:80:22:5D:12 Type[1] = 6(MIB_IF_TYPE_ETHERNET) dwOperStatus[1]= MIB_IF_OPER_STATUS_NON_OPERATIONAL Description[2] = WAN (PPP/SLIP) Interface AdapterName[2] = {C7CC2731-DD57-40B7-A373-65084E8EFD0B} MAC Address[2] = 00:53:45:00:00:00 Type[2] = 23(MIB_IF_TYPE_PPP) dwOperStatus[2]= MIB_IF_OPER_STATUS_CONNECTED Windows2000では、Typeメンバ変数で区別できますが、 Windows98では、おっしゃるとおり、区別できないようです。 ただし、Description変数には、PPPアダプターと書いてあるので、 そこで、区別できるようです。 もう1つは、MACアドレスの上位3バイトで区別できるかもしれません。 この3バイトは、NICのメーカーIDになっています。 http://www.atmarkit.co.jp/fwin2k/network/tcpip007/tcpip02.html お役に立てなかったようですね。すみません。

参考URL:
http://www.atmarkit.co.jp/fwin2k/network/tcpip007/tcpip01.html

共感・感謝の気持ちを伝えよう!

質問者からのお礼

woody_poco 様 ありがとうございました。最初の質問からお付き合い頂き本当に感謝しています。GetIfTable()のdwMtuとdwSpeed、2つの変数を用いて判定しようと思います。その判定を抜けてしまった場合にGetAddptersInfo()で取得しようと考えています。NICの情報取得でこんなに苦労するとはおもいませんでした。

  • 回答No.2
  • z64423
  • ベストアンサー率53% (26/49)

Platform SDK をあさって (+ ipconfig.exe のバイナリダンプも漁って…) GetIfTable() というのが使えそうなので試してみました。 引数 MIB_IFTABLE 型の中のMIB_IFROW 型のメンバ   dwType = MIB_IF_TYPE_ETHERNET(6)   dwMtu = 1500 (byte)   dwSpeed = 10,000,000 (10Mbps), or 100,000,000 (100Mbps), ... なのが Ether だ、と断定できないでしょうか。 ※MAC アドレスは   dwPhysAddrLen = MAC address length   bPhysAddr[] = MAC address  に入ってきます。 モデム環境がないので、上記の方法で断言できるかはテスト出来ていません。 それと、WinXP で確認したのみです。 なにか参考になれば…

共感・感謝の気持ちを伝えよう!

  • 回答No.1

ikeacofee 様 GetAdaptersInfo関数で得られるIP_ADAPTER_INFO構造体に、 Typeという変数があり、NICならMIB_IF_TYPE_ETHERNET、 PPPならMIB_IF_TYPE_PPPになると思われます。 これで、区別してはいかがでしょうか。 すでに検討されていたらごめんなさい。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。 Typeは検討していましたが、ソフトウエア的なものらしく、ppp adapterなどはMIB_IF_TYPE_ETHERNETが返ってきてしまうようで、うまく使うことが出来ませんでした。現在は、Nextで一番最後に取得した、AddressがNICのアドレスと信じて、使っている状態で不安です。

質問者からの補足

ソースコードを追記しておきます。 bool GetMacAddress_(char* pMacAddress) { ULONG ulOutBufLen; DWORD dwRet; BYTE* pBuff; PIP_ADAPTER_INFO pAdapterInfo; ulOutBufLen = 0; // 必要バッファサイズ取得 ::GetAdaptersInfo(NULL, &ulOutBufLen); // 必要なバッファサイズで取得用の構造体を用意する。 pBuff = new BYTE[ulOutBufLen]; pAdapterInfo = (PIP_ADAPTER_INFO)pBuff; // 実際にネットワークアダプタの情報を取得する。 dwRet = ::GetAdaptersInfo(pAdapterInfo, &ulOutBufLen); // ネットワークアダプターの情報取得をチェック if(dwRet == ERROR_SUCCESS) { // 取得が成功したら最後のアダプタ情報を採用 while (1) { // 現状NICの正しいMacアドレスを割り出すことが出来ない。 // 最後に取得されたアダプタを採用。必ずしもNICのMacアドレスとは限らない! if (pAdapterInfo->Next == NULL) {// MIB_IF_TYPE_ETHERNETでは判定不可! char buffer[13]; sprintf(buffer, "%02x%02x%02x%02x%02x%02x", pAdapterInfo->Address[0], pAdapterInfo->Address[1], pAdapterInfo->Address[2], pAdapterInfo->Address[3], pAdapterInfo->Address[4], pAdapterInfo->Address[5]); strcpy(pMacAddress, buffer); delete pBuff; return true; } pAdapterInfo = pAdapterInfo->Next; } } delete pBuff; return false; }

関連するQ&A

  • GetAdapterInfoによりマックアドレスを取得したい。

    はじめまして、sandayu999と申します。 ネットワークアダプタの情報を取得するために GetAdapterInfo関数を使用しているのですが 返り値がエラーとなってしまいます。 環境はWindowsXPでCコンパイラは borlandのbcc32.exeを使用しております。 コンパイルは正常に行えました。 [mac.c] --------------------------------------- IP_ADAPTER_INFO adapterInfo; DWORD aiSize; GetAdaptersInfo(NULL,&aiSize); //サイズ取得 print("%d\n",GetAdaptersInfo( &adapterInfo, &aiSize )); 出力してみたところ、値が87(ERROR_INVALID_PARAMETER) となってしまいました。 どのような対処をしたら良いのかわからない状態です、どなたかアドバイスをよろしくお願いいたします。

  • モデムにはMACアドレスがあるのでしょうか?

    ネットワークに接続されたPCから、MACアドレスを取得したいと考えているのですが、モデムでPPP接続された場合がどうなるかよくわかりません。 ネットワークのカードにはユニークなMACアドレスがありますが、普通のダイアルアップ用のモデムにもユニークなMACアドレスがあるのでしょうか? winipcfgなどで確認するとpppアダプタとしてMACアドレスが表示されます。しかし以前Microsoftのサイトでランダム生成すると書いてあった気がするのですが...そうなると他のOSでは別のやり方なのかとか、悩み出したらきりがないです。どうかお助けください。 お願いします。

  • PPP Adapterがでてしまう

    win98Fで外付けLANカードです。 通信はできるのですが、起動時、IPがとれず 毎回winipcfgでPPP Adapterが選択されています。 それで外付けNICを選択後、問題なく通信できます。 でも、起動時に毎回、やるのは面倒です。 どうして記憶されないのでしょうか? デバイスマネでは問題ある表示はありません。

  • Macアドレスの取得方法

    こんにちは、 Macアドレスの取得方法で悩んでいます。 現在NetBiosを使った方法で取得する方法までは出来たのですが、ネットワークに接続していない環境も想定しているため、ネットワークカードが稼動していない場合取得が出来ないようです。色々調べて見ましたがこの方法しか見つかりませんでした。 どなたか、ネットワークに接続されていない(LANケーブルがつながっていない)PCのMacアドレスの取得方法をご存知の方いらしましたら、ご教授願います。 //NetBiosを使った取得のソースコードを以下に示します。 #include "stdafx.h" #include "Nb30.h" typedef struct _ASTAT_ {  ADAPTER_STATUS adapt; NAME_BUFFER NameBuff[30]; }ASTAT, * PASTAT; ASTAT Adapter; bool GetMacAddress(char* pMacAddress) { NCB Ncb; UCHAR uRetCode; // reset memset( &Ncb, 0, sizeof(Ncb) ); Ncb.ncb_command = NCBRESET; Ncb.ncb_lana_num = 0; uRetCode = Netbios( &Ncb ); // get memset( &Ncb, 0, sizeof (Ncb) ); Ncb.ncb_command = NCBASTAT; Ncb.ncb_lana_num = 0; strcpy( (char*)Ncb.ncb_callname, "*" ); Ncb.ncb_buffer = (UCHAR*)&Adapter; Ncb.ncb_length = sizeof(Adapter); uRetCode = Netbios( &Ncb ); if ( uRetCode == 0 ) { char strBuffer[12]; sprintf(strBuffer, "%02x%02x%02x%02x%02x%02x", Adapter.adapt.adapter_address[0], Adapter.adapt.adapter_address[1], Adapter.adapt.adapter_address[2], Adapter.adapt.adapter_address[3], Adapter.adapt.adapter_address[4], Adapter.adapt.adapter_address[5] ); strcpy(pMacAddress, strBuffer); return true; } return false; }

  • ローカルエリア接続用イーサネットアダプタのMACアドレスを取得したい

    コマンドプロンプトで ipconfig /all を実行すると出てくる情報の中で,「イーサネット アダプタ ローカル エリア接続:」というタイトルで表示されるアダプタのMACアドレスを取得するプログラムを書きたいのです。 MACアドレスを取得する方法として,(1)NetBIOSを使う方法,(2)IP Helper APIのGetIfTable関数を使う方法,(3)IP Helper APIのGetAdaptersInfo関数を使う方法 を試しましたが,(1)はアダプタの種類は判別できず,(2)と(3)はイーサネットアダプタだけを選び出すことはできますが,複数のイーサネットアダプタが存在する場合(例えばBluetoothデバイス装着時),それらの中から「Bluetooth接続」のアダプタなどを除外して「ローカル エリア接続」のアダプタ『だけ』を選び出すための情報は得られないようです。 できれば,LANに接続していない状態(ケーブルを外した状態)で取得したいのですが,どなたかお知恵をお貸し下さい。 なお,「説明」の内容を使う方法,例えば GetAdaptersInfo関数のTIP_ADAPTER_INFO構造体のDescriptionメンバの文字列に「Bluetooth」が入っているものを除外するというような方法は使いたくありません。 よろしくお願い致します。

  • MACアドレス取得が上手くいかない

    getiftable関数を使用してMACアドレスを取得しようと思っているのですが、ipconfigで確認したMACアドレスとは違う値が返ってきて困っています。 ちなみにXPで作成したプログラムを動かすと正しいアドレスが返ってくるのですが、7で動かした場合に違う値が返ってきます。 ネットで同様の事例が無いか探しているのですが中々発見できず、質問に至った次第です。 OSの違いで何か不具合が起こったりしているのでしょうか、分かる方至急回答の方を宜しくお願いします。

  • macアドレスが認識できない

    今使っているソフトでMACアドレスを調べて起動するソフトがあるのですが、 最近ハードディスクを交換したので、ソフトを全部入れなおしたのですが、このソフトが立ち上げようとすると MACアドレスが取得できないというエラーがでて起動できません。 ipconfig/allで調べるとちゃんとアドレスは表示されているのですが、何が原因かわかりません。 いろいろ弄くったので、何が原因しているか見当もつきません。 イーサネットアダプタについては詳しくないので 何か調べ方、あるいは設定の仕方について、アドバイスいただければ幸いです。 OSはwin2000です。

  • バッチファイルでのMACアドレス取得について

    【環境】 Windows7 professional 32bit sp1 お世話になります。 上記環境でバッチファイルを起動し、 1.MACアドレスを取得 2.複数NICがある場合は全てのMACアドレスを取得 という処理を行いたいのですが、 echoで取得結果を確認すると値が入っていません。 バッチに関して理解不足で申し訳ありませんが、是非ご教授お願い致します。 以下、現在作成しているコマンドです。 for /f "tokens=11 delims=: " %%b in ('ipconfig /all ^| find "Physical Address"') do set MAC=%%b 以上です。

  • バッチファイルでのMACアドレス取得について

    【環境】 Windows7 professional 32bit sp1 お世話になります。 上記環境でバッチファイルを起動し、 1.MACアドレスを取得 2.複数NICがある場合は全てのMACアドレスを取得 という処理を行いたいのですが、 echoで取得結果を確認すると値が入っていません。 バッチに関して理解不足で申し訳ありませんが、是非ご教授お願い致します。 以下、現在作成しているコマンドです。 for /f "tokens=11 delims=: " %%b in ('ipconfig /all ^| find "Physical Address"') do set MAC=%%b 以上です。

  • VBA Windows8 MACアドレス取得

    Windows7(32bit)の場合、次のコードでMACアドレスを取得できたのですが、 Windows8(64bit)の場合は失敗…ご教授宜しくお願い致します。 'マックアドレス:最初の1個だけ調べる。 Sub MacAddress() Dim oNetwork As Object Dim wNetworkSql As String wNetworkSql = "Select * From Win32_NetworkAdapter Where MACAddress Is Not Null" For Each oNetwork In GetObject("winmgmts:").ExecQuery(wNetworkSql) MsgBox oNetwork.MacAddress Exit For Next End Sub