MACアドレスの取得(NETBIOS)

解説

 ネットワークアダプタの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;
}


カテゴリー「VC++ TIPS」 のエントリー