首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 透過 NetBIOS API 取得網卡 MAC 位址完整範例

     編輯:關於VC++

在軟體授權、裝置識別等場景中,常需取得本機網卡的 MAC 位址作為唯一識別碼。本文示範如何在 VC++ 6.0 中呼叫 NetApi32.dll 的 NetBIOS 介面(NCBENUM、NCBASTAT 命令),枚舉所有綁定 NetBEUI 協定的網卡並擷取其 MAC 位址。

一、核心原理

  1. 發送 NCBENUM 取得系統中所有邏輯網卡編號(LANA number)與數量。
  2. 對每個 LANA 號,先發送 NCBRESET 初始化網卡。
  3. 發送 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;
}

三、建置與執行

  1. 建立 Win32 Console Application 專案。
  2. 貼上上述程式碼,確保專案連結 netapi32.lib(通常預設已包含)。
  3. F7 編譯,F5 執行,主控台將輸出所有網卡 MAC 位址。

四、封裝建議

  • 將核心邏輯封裝為 GetMacAddresses(std::vector<std::string>&) 函式,回傳 MAC 字串陣列。
  • 可進一步打包為 DLL 或 COM 元件,供 VB、C#、Delphi 等語言呼叫。
  • 現代專案建議改用 IPHLPAPI 的 GetAdaptersAddresses(),支援 IPv6、不依賴 NetBEUI、跨平台相容性更好。

五、常見問題

現象原因對策
NCBENUM 返回非 0NetBEUI 未安裝/啟用網卡屬性中安裝「NetBEUI 協定」
NCBASTAT 返回 0x23 (NRC_BADDR)LANA 號無效檢查 lana_enum.lana[] 內容
Win2000 以上 LANA 不連續系統分配機制變更務必使用 NCBENUM 取得的實際 LANA 號

六、總結

本文提供基於 NetBIOS API 的 MAC 位址擷取完整範例,適合維護舊專案或特定環境。新專案建議採用 IP Helper API 或 WMI 以獲得更佳相容性與維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved