アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (4件)

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 で確認したのみです。


なにか参考になれば…
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/26 20:39

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/tcpip00 …
お役に立てなかったようですね。すみません。

参考URL:http://www.atmarkit.co.jp/fwin2k/network/tcpip00 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/26 20:45

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 で確認したのみです。


なにか参考になれば…
    • good
    • 0

ikeacofee 様



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

すでに検討されていたらごめんなさい。

この回答への補足

ソースコードを追記しておきます。
bool GetMacAddress_(char* pMacAddress)
{
ULONGulOutBufLen;
DWORDdwRet;
BYTE*pBuff;
PIP_ADAPTER_INFOpAdapterInfo;

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);
deletepBuff;
returntrue;
}
pAdapterInfo = pAdapterInfo->Next;
}
}
deletepBuff;
returnfalse;
}

補足日時:2005/04/20 11:08
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/20 10:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!