こんにちは、
質問No.4996に関連して、VC++でiphlpapiのGetAdaptersInfoを使って、NICのMACアドレスを取得しようと考えています。WIN XP、WIN2000では、目的のアドレスが取得できるのですが、WIN98、WIN MEではNIC以外にPPP AdapterやAOL Adapterといった、ダイアルアップ用のアドレスも同時に取れてしまい、大変困っています。取得したものを見れば検討は付くのですがプログラム的により分ける方法が分かりません。確実にNICのMACアドレスだけを取得する方法はないでしょうか?NetBiosやiphlpapiの他の関数も検討しましたが、ネットワークが構築されていないPCから取得できるのはGetAdaptersInfoだけのようですので、出来ればこの関数を使って解決したいと考えています。どうか、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
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()を使う形でいこうと思います。
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/tcpip00 …
お役に立てなかったようですね。すみません。
参考URL:http://www.atmarkit.co.jp/fwin2k/network/tcpip00 …
woody_poco 様
ありがとうございました。最初の質問からお付き合い頂き本当に感謝しています。GetIfTable()のdwMtuとdwSpeed、2つの変数を用いて判定しようと思います。その判定を抜けてしまった場合にGetAddptersInfo()で取得しようと考えています。NICの情報取得でこんなに苦労するとはおもいませんでした。
No.2
- 回答日時:
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になると思われます。
これで、区別してはいかがでしょうか。
すでに検討されていたらごめんなさい。
この回答への補足
ソースコードを追記しておきます。
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;
}
ありがとうございます。
Typeは検討していましたが、ソフトウエア的なものらしく、ppp adapterなどはMIB_IF_TYPE_ETHERNETが返ってきてしまうようで、うまく使うことが出来ませんでした。現在は、Nextで一番最後に取得した、AddressがNICのアドレスと信じて、使っている状態で不安です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux Rasberry pi のオンボードNICのMacアドレスが変わってしまう 3 2023/03/08 22:34
- デスクトップパソコン 古ーいパソコン/Atheros AR2181 PCIe Gigabit LAN コントローラー 7 2022/09/07 12:58
- その他(コンピューター・テクノロジー) batファイルでPCの設定内容やプロパティーを取得したいのですが、コマンド1個で1ファイルとなるのを 2 2022/04/27 15:27
- 固定IP MACアドレスはLAN内で相手を特定するアドレスですか? PCから監視カメラを閲覧するときに、セグメ 3 2022/07/23 09:04
- Windows 10 インストールしたてのVirtualBoxの仮想マシンにDHCPで割り振られるIPアドレスにつきまして 1 2023/05/03 14:46
- その他(セキュリティ) 写真のMACアドレスは何でしょうか? LINEアンチウイルスをAndroidスマホへインストールし、 2 2022/09/20 21:16
- マウス・キーボード ブルートゥースキーボードの互換性 7 2022/12/11 11:12
- その他(インターネット接続・インフラ) ホームページのログイン認証の際、PCから相手方サーバーに対し送信されるMACアドレスについて 1 2022/10/17 14:14
- Mac OS mac使いの無線事情 3 2023/05/26 02:30
- CAD・DTP vectorworks、winとmacでデータを共有する場合 1 2023/02/20 16:41
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ps3で久しぶりにCDの音楽情報取...
-
「取得先」という表現について
-
Yahoo! JAPAN IDを新規取得でき...
-
EXCEL、マクロ-改ページ行番号...
-
PDOを使った総レコード数(行数...
-
グローバルIPの取得方法を教え...
-
Excel VBA:特定の文字列以降(...
-
【VBA】EXCELブックを開かずに...
-
グローバルIPの取得方法
-
ファイル作成者名の取得
-
VBAでPDFのアクティブページ番...
-
iphlpapiのGetAdaptersInfoでNI...
-
VB2005でXMLデータから複数ある...
-
モジュールからルート名前空間...
-
Powershellを使ってパソコンが...
-
ASP(.netではありません)でのUs...
-
VBで他アプリの「syslistview32...
-
(Win32)ファイルパスから物理ド...
-
IPアドレスとMACアドレスを取得...
-
auの個体識別情報を取得したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「取得先」という表現について
-
Yahoo! JAPAN IDを新規取得でき...
-
ps3で久しぶりにCDの音楽情報取...
-
IPアドレスとMACアドレスを取得...
-
format関数について
-
Excel VBA:特定の文字列以降(...
-
【VBA】EXCELブックを開かずに...
-
EXCEL、マクロ-改ページ行番号...
-
ローカルのコンピュータ名を取...
-
【C#】FindWindowExの使い方を...
-
VBAでPDFのアクティブページ番...
-
ミュージックのアートワークを...
-
VBS「開いているページ」のURL...
-
VB or VBScriptでPCの製造番号...
-
VBAでPDFファイルの文書のプロ...
-
表示している画面サイズの取得方法
-
積立投資してます。現在平均取...
-
アクセスの度にIPアドレスを変...
-
各クライアントマシンのログイ...
-
VB.NETでボリュームを取得・設...
おすすめ情報