在軟體授權、裝置識別等場景中,常需取得本機網卡的 MAC 位址作為唯一識別碼。本文示範如何在 VC++ 6.0 中呼叫 NetApi32.dll 的 NetBIOS 介面(NCBENUM、NCBASTAT 命令),枚舉所有綁定 NetBEUI 協定的網卡並擷取其 MAC 位址。
NCBENUM 取得系統中所有邏輯網卡編號(LANA number)與數量。NCBRESET 初始化網卡。NCBASTAT 查詢網卡狀態,回傳結構 ADAPTER_STATUS 中包含 6 位元組的 adapter_address(即 MAC 位址)。注意:僅能偵測已啟用 NetBEUI 協定的網卡;現代 Windows 建議改用 GetAdaptersAddresses() (IP Helper API) 或 WMI 查詢。
#include <windows.h>
#include <nb30.h>
#include <stdio.h>
typedef struct _ASTAT_ {
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
} ASTAT, *PASTAT;
ASTAT Adapter;
void getmac_one(int lana_num) {
NCB ncb; UCHAR uRetCode;
memset(&ncb, 0, sizeof(ncb));
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = lana_num;
uRetCode = Netbios(&ncb);
printf("NCBRESET 返回: 0x%02X\n", uRetCode);
memset(&ncb, 0, sizeof(ncb));
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = lana_num;
strcpy((char*)ncb.ncb_callname, "*");
ncb.ncb_buffer = (UCHAR*)&Adapter;
ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios(&ncb);
printf("NCBASTAT 返回: 0x%02X\n", uRetCode);
if (uRetCode == 0) {
printf("網卡[%d] MAC: %02X%02X-%02X%02X-%02X%02X\n", lana_num,
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]);
}
}
int main() {
NCB ncb; UCHAR uRetCode; LANA_ENUM lana_enum;
memset(&ncb, 0, sizeof(ncb));
ncb.ncb_command = NCBENUM;
ncb.ncb_buffer = (UCHAR*)&lana_enum;
ncb.ncb_length = sizeof(lana_enum);
uRetCode = Netbios(&ncb);
printf("NCBENUM 返回: 0x%02X\n", uRetCode);
if (uRetCode == 0) {
printf("偵測到 %d 張網卡\n", lana_enum.length);
for (int i = 0; i < lana_enum.length; ++i)
getmac_one(lana_enum.lana[i]);
}
return 0;
}
netapi32.lib(通常預設已包含)。GetMacAddresses(std::vector<std::string>&) 函式,回傳 MAC 字串陣列。IPHLPAPI 的 GetAdaptersAddresses(),支援 IPv6、不依賴 NetBEUI、跨平台相容性更好。| 現象 | 原因 | 對策 |
|---|---|---|
| NCBENUM 返回非 0 | NetBEUI 未安裝/啟用 | 網卡屬性中安裝「NetBEUI 協定」 |
| NCBASTAT 返回 0x23 (NRC_BADDR) | LANA 號無效 | 檢查 lana_enum.lana[] 內容 |
| Win2000 以上 LANA 不連續 | 系統分配機制變更 | 務必使用 NCBENUM 取得的實際 LANA 號 |
本文提供基於 NetBIOS API 的 MAC 位址擷取完整範例,適合維護舊專案或特定環境。新專案建議採用 IP Helper API 或 WMI 以獲得更佳相容性與維護性。