#include <nb30.h>
#pragma comment(lib, "Netapi32.lib")
//网卡结构
typedef struct tagASTAT
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
}ASTAT, *LPASTAT;
//存储网卡的MAC地址的结构
typedef struct tagMAC_ADDRESS
{
UCHAR b1, b2, b3, b4, b5, b6;
}MAC_ADDRESS, *LPMAC_ADDRESS;
string GetComputerMac()
{
NCB ncb; //网络控制块
LANA_ENUM lana_enum; //该结构包含网卡数目及其索引
memset(&ncb, 0, sizeof(ncb)); //NCB结构清零
ncb.ncb_command = NCBENUM;
//向网卡发送 NCBENUM 命令,以获取当前计算机的网卡信息,
//如有多少个网卡,每张网卡的编号等
ncb.ncb_buffer = (unsigned char *)&lana_enum;
ncb.ncb_length = sizeof(lana_enum);
UCHAR uRetCode = Netbios(&ncb);
int num; //标识网卡个数
MAC_ADDRESS mac_addr[5];//假设最多有5个网卡
if (uRetCode != 0)
return "";
num = lana_enum.length;
//对每一张网卡,以其网卡编号为输入编号,获取其 MAC 地址
for (int i = 0; i < num; i++)
{
memset(&ncb, 0, sizeof(ncb)); //NCB结构重新清零
ASTAT Adapter;
//对选定的网卡发送一个 NCBRESET 命令,以便进行初始化
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = lana_enum.lana[i];
uRetCode = Netbios(&ncb);
//指定返回的信息存放的变量
memset(&ncb, 0, sizeof(ncb));
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = lana_enum.lana[i]; //指定网卡号
strcpy_s((char *)ncb.ncb_callname, 2, "*");
ncb.ncb_buffer = (unsigned char *)&Adapter;
//指定返回的信息存放的变量 Adapter
ncb.ncb_length = sizeof(Adapter);
//接着,发送 NCBASTAT 命令以获取网卡的信息
uRetCode = Netbios(&ncb);
mac_addr[i].b1 = Adapter.adapt.adapter_address[0];
mac_addr[i].b2 = Adapter.adapt.adapter_address[1];
mac_addr[i].b3 = Adapter.adapt.adapter_address[2];
mac_addr[i].b4 = Adapter.adapt.adapter_address[3];
mac_addr[i].b5 = Adapter.adapt.adapter_address[4];
mac_addr[i].b6 = Adapter.adapt.adapter_address[5];
CString strMac;
strMac.Format(TEXT("%02X-%02X-%02X-%02X-%02X-%02X"),
mac_addr[i].b1, mac_addr[i].b2,
mac_addr[i].b3, mac_addr[i].b4,
mac_addr[i].b5, mac_addr[i].b6);
return LGTools::CStringToString(strMac);
}
return "";
}
获取电脑的MAC地址
最新推荐文章于 2021-07-29 12:24:35 发布