• 締切済み

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

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

みんなの回答

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.4

>試験を行っているPCで確認したところ18個取りにいっていました。 >・・・18ってどっから取ってるんだろう?w いまいち謎…ですね。 >ipconfigで確認できるのは確か5つぐらいだったので、ここで確認したもの以外にも取得しているテーブルが存在するということになりますが、確認方法ってあるのでしょうか? ネットで検索すると… MIB_IFTABLE構造体ののtable[].dwTypeとMIB_IFTABLE構造体ののtable[].dwOperStatusで判定している例がありますね。 http://drumken.blog8.fc2.com/blog-entry-185.html dwTypeがMIB_IF_TYPE_ETHERNETのもの…でしょうかね? # 無線LANだと別の値…なのかな? # http://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/0b58ec3a-58cb-44a7-a345-e9ada8399eae/ 派遣先のノートPC(XP Sp3)で下記のコード(VC++2010のWin32コンソールに必要なヘッダとライブラリを指定)を実行するとLoopbackとか出てきますね。 # MS TCP Loopback interface。 # 自宅のWindows7だとTunnel adapter isatap.{*****}がいくつも出てくるんでしょうなぁ。  PMIB_IFTABLE pMibIfTable;  ULONG ulSize = 0;  if (ERROR_INSUFFICIENT_BUFFER == GetIfTable(NULL, &ulSize, FALSE)) {   pMibIfTable = (PMIB_IFTABLE)new char[ulSize];   if (NO_ERROR == GetIfTable(pMibIfTable, &ulSize, FALSE)) {    PMIB_IFROW pMibIfRow = &pMibIfTable->table[0];    DWORD dwCnt;    for(dwCnt = 0;dwCnt < pMibIfTable->dwNumEntries;dwCnt++, pMibIfRow++) {     printf("%s:", pMibIfRow->bDescr);     if(pMibIfRow->dwPhysAddrLen != 0) {      DWORD dwPhysAddrCnt;      for(dwPhysAddrCnt = 0;dwPhysAddrCnt < pMibIfRow->dwPhysAddrLen;dwPhysAddrCnt++) {       _tprintf(_T("%02X"), pMibIfRow->bPhysAddr[dwPhysAddrCnt]);       if(dwPhysAddrCnt != (pMibIfRow->dwPhysAddrLen - 1))        _tprintf(_T("-"));       else        _tprintf(_T("\n"));      }     } else {      _tprintf(_T("none\n"));     }    }   }   delete[] pMibIfTable;  }

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

>ログ出せばいいじゃないかという結論に ファイルに落とすとか、OutputDebugString()で出力してデバッグモニタ系のソフトを使うとか…… まあ、いろいろありますね。 しかし…36個はちょっとびっくりでした。 内容、細かく確認はしていませんでしたが。 # というかGetIfTable()した後、ブレークしてウォッチで眺めただけなので。

be-komun
質問者

お礼

先日はありがとうございました。 試験を行っているPCで確認したところ18個取りにいっていました。 ・・・18ってどっから取ってるんだろう?w 特に何も入れていないですし、ほぼ新品の状態なのですが・・・。 ipconfigで確認できるのは確か5つぐらいだったので、ここで確認したもの以外にも取得しているテーブルが存在するということになりますが、確認方法ってあるのでしょうか?

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

MIB_IFTABLE構造体のdwNumEntriesはいくつになってます? ちなみに、ウチの環境(Windows7 Professional 64bit)では36に。 VMWarePlayerとVirtualBoxがインストールされてて、Bluetoothアダプタも付けてて……。 Tunnel adapter isatap.{}がいくつもあります。

be-komun
質問者

お礼

返事が遅れました、ご回答ありがとうございます。 XPでデバッグをかけて確認したところテーブル数に問題はなかったです。 7の方ではデバッグをかけれる環境は構築していない(というより現状できない)ため、確認が出来ないのですが、なんとか確認してみようとは思います。 多分変なところに値取にいってそうなので、テーブル数が合わない可能性があるかもですよね。 自分のPCではないので迂闊に環境構築できないのがネック、なんとかしたいなぁ・・・。

be-komun
質問者

補足

ログ出せばいいじゃないかという結論に、お礼してから気づきましたw やってみます。

  • chie65535
  • ベストアンサー率43% (8525/19381)
回答No.1

NICの情報はちゃんと確認してますか? Win7で仮想NICがインストールされている可能性があるので、MACアドレスを得る場合にNICの詳細情報を見ないで決め打ちで取得すると、仮想NICの情報を取得しちゃう可能性があります。 ちゃんと「NICが仮想か実体か」を確認する必要があります。

be-komun
質問者

お礼

早速の回答ありがとうございます。 現在試験を行っているPCですが、仮想NICはインストールされていません。 なので原因は別にあるかなとは思うのですが、中々見つけれずにいます。 一応可能性として、IPv6が設定されていたのでその辺りが悪さしているというか、関数の構造体自体が対応していないために変な値を取りにいってるのでは、と考えているのですがどう思われますか?

be-komun
質問者

補足

すいません、調べましたがIPv6は問題では無さそうですね(汗 変な質問してすいません。

関連するQ&A

  • .netでMACアドレスを取得

    System.Net.NetworkInformationの NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces(); をつかって、MACアドレスを取得しているのですが、CMDのipconfigと比べると明らかに取得数がすくなく、どうやら、取得した時点で使用しているMACアドレスしか取得できていないことがわかりました。 あと、ipconfigだと、ブルートゥースのアドレスなども取得していました。 .netの機能で、ipconfingと同じように、そのPCのすべてのMACアドレスを取得したいのですが、方法はないのでしょうか?CMDから取得する方法を現在はとっているのですが、遅すぎて困っています。 環境はVS2010のC#です。

  • バッチファイルでの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 お世話になります。 上記環境でバッチファイルを起動し、 MACアドレスを取得し、取得した値を元にファイル検索を行いたいです。 端末によってNICがいくつあるか不明なので、 取得したMACアドレス分検索し、検索結果によって処理を分岐させたいのですが・・・。 ちなみに、以下が現在のソースです。 for /f "tokens=2 delims=:" %%b in ('ipconfig /all ^| find "物理アドレス"') 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 以上です。

  • macアドレスについて

    はじめまして。 ifconfigやdmesgを使うと、NICのMACアドレスが表示できます。 現在、MACアドレスを取得するプログラムを作成したいのですが、ifconfigやdmesgはどこを参照してMACアドレスを取得しているのでしょうか?

  • MACアドレス

    タイトル通り、MACアドレスを取得したいので、取得の仕方を教えてください。 いろいろと調べてみましたが、結局わかりませんでした。 プログラムを作動させているパソコンのMACアドレスが分かればいいです。 よろしくお願いします。 2005.NETで作成しています。

  • 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だけのようですので、出来ればこの関数を使って解決したいと考えています。どうか、よろしくお願いします。

  • IPやMACアドレスをアプリケーションから変更することはできないですか?

    WindowsXPで言うとIPアドレスは「ローカルエリア接続のプロパティ」で変更できます。 MACアドレスもドライバのプロパティの[詳細設定]で変更できるものもあります。 しかしフリーソフトなどでIPやMACを変更できるものは見たことはありません。当方、若干Windowsプログラムもかじったことはあるのですが、IPやMACを変える関数などはなかったように思います。 恐らく、IPやMACの値はレジストリのどこかに保存されているとは思いますが、これらの値をアプリケーションから変更することはできないのでしょうか?

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

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

  • MACアドレスを取得する方法はありますか?

    クライアントのMACアドレスを取得する方法はありますか? ご存知の方見えましたら教えてください。