#pragma comment(lib,"netapi32.lib") #include <windows.h> #include <Nb30.h> #include <string> std::string GetMAC() { char mac[MAX_PATH] = {0}; NCB ncb = {0}; typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER NameBuff [30]; } ASTAT, * PASTAT; ASTAT Adapter = {0}; typedef struct _LANA_ENUM { // le UCHAR length; UCHAR lana[MAX_LANA]; } LANA_ENUM ; LANA_ENUM lana_enum = {0}; UCHAR uRetCode = 0; memset(&ncb, 0, sizeof(ncb)); memset(&lana_enum, 0, sizeof(lana_enum)); ncb.ncb_command = NCBENUM; ncb.ncb_buffer = (unsigned char *)&lana_enum; ncb.ncb_length = sizeof(LANA_ENUM); uRetCode = Netbios(&ncb); if(uRetCode != NRC_GOODRET) { return std::string(mac); } for(int lana=0; lana<lana_enum.length; lana++) { ncb.ncb_command = NCBRESET; ncb.ncb_lana_num = lana_enum.lana[lana]; uRetCode = Netbios(&ncb); if(uRetCode == NRC_GOODRET) { break; } } if(uRetCode != NRC_GOODRET) { return std::string(mac); } memset(&ncb, 0, sizeof(ncb)); ncb.ncb_command = NCBASTAT; ncb.ncb_lana_num = lana_enum.lana[0]; strcpy((char*)ncb.ncb_callname, "*"); ncb.ncb_buffer = (unsigned char *)&Adapter; ncb.ncb_length = sizeof(Adapter); uRetCode = Netbios(&ncb); if(uRetCode != NRC_GOODRET) { return std::string(mac); } sprintf(mac,"%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]); return std::string(mac); } int main() { printf("MAC: %s", GetMAC().c_str()); return 0; }
//测试运行结果为:MAC: B8-AC-6F-1A-6A-46
//如果网线拔掉,或禁用网卡,该方法将无法获取到MAC地址。
用Netbios()获取本机的MAC地址
最新推荐文章于 2024-02-19 19:00:58 发布