解説
ネットワークアダプタのMACアドレス取得にはいくつかの方法がある。ここではNETBIOSコマンドを使用したMACアドレス取得方法を紹介する。 「VC ++TIPS」にはここのものとは異なる方法での取得を紹介しています。
サンプル
void Test()
{
int i;
CString strMessage;
CStringArray astrMacAddress;
if(GetMacAddress(astrMacAddress) == false)
{
AfxMessageBox("取得できませんでした");
return;
}
for(i = 0; i < astrMacAddress.GetSize(); i++)
{
strMessage += astrMacAddress[i];
strMessage += "\n";
}
AfxMessageBox(strMessage);
}
取得部分
#include "afxtempl.h"
#include "Nb30.h"
#pragma comment(lib,"Netapi32.lib")
//
// NETBIOS コマンドNCBASTAT によるMACアドレスの取得
//
// 認識・作動しているNICでないと取得できない?!
//
bool GetMacAddress(CStringArray& astrMacAddress)
{
struct ASTAT
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
};
int i;
NCB sNcb;
UCHAR uRetCode;
LANA_ENUM lenum;
ASTAT Adapter;
CString strBuff;
astrMacAddress.RemoveAll();
//////////////////////////////////////
// NIC数の取得
//
::ZeroMemory(&sNcb,sizeof(sNcb));
sNcb.ncb_command = NCBENUM;
sNcb.ncb_buffer = (UCHAR*)&lenum;
sNcb.ncb_length = sizeof(lenum);
uRetCode = Netbios(&sNcb);
ASSERT(uRetCode == 0); //取得失敗
if(uRetCode != 0)
return false;
for(i = 0; i < lenum.length; i++) //NICの数だけ繰り返し
{
//////////////////////////////////////
// NICのリセット
//
::ZeroMemory(&sNcb,sizeof(sNcb));
sNcb.ncb_command = NCBRESET; //NCBRESETコマンド
sNcb.ncb_lana_num = lenum.lana[i];
uRetCode = Netbios(&sNcb); //NetBios命令実行
ASSERT(uRetCode == 0); //リセット失敗(成功時はuRetCode==0)
//////////////////////////////////////
// MACアドレスの取得
//
::ZeroMemory(&sNcb,sizeof(sNcb));
sNcb.ncb_command = NCBASTAT; //NCBASTATコマンド
sNcb.ncb_lana_num = lenum.lana[i];
strcpy((char*)(sNcb.ncb_callname),"* " );
sNcb.ncb_buffer = (UCHAR*)&Adapter;
sNcb.ncb_length = sizeof(Adapter);
uRetCode = Netbios(&sNcb); //NetBios命令実行
ASSERT(uRetCode == 0); //情報取得失敗(成功時はuRetCode==0)
if(uRetCode == 0)
{
strBuff.Format("%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] );
astrMacAddress.Add(strBuff); //取得したNICのLAMAは lenum.lana[i] を参照
}
}
if(astrMacAddress.GetSize() > 0)
return true;
return false;
}







