2008-10-21 55 views
10

我們目前正在使用NetBios method,它在XP下正常工作。在Vista下的初步測試表明它也可以工作,但有一些警告 - 例如NetBIOS必須存在,從我讀到的內容來看,適配器的順序必然會改變。我們的替代方法 - 與SNMPExtensionQuery - 似乎在Vista下被破壞。C++:獲取Vista上的網絡適配器的MAC地址?

現在的問題是:你知道一個可靠的方式來獲得一個Vista機器上的本地MAC地址列表?向後兼容XP是一個加號(我寧願有一個單一的方法比很多醜陋的#ifdef)。謝謝!

+0

http://stackoverflow.com/questions/823553/how-to-get-hardware-mac-address-on-windows這些都需要被鏈接 – 2012-11-30 14:00:31

回答

2

你可以使用WMIService?儘管如此,我用它在Vista之前獲得了一臺機器的mac地址。

0

GetAdaptersInfo()是官方方法,它枚舉所有適配器,即使是斷開的適配器。
看到這篇文章,例如代碼codeguru

+0

不正確。 GetAdaptersInfo()無法枚舉被禁用的適配器。代碼大師的文章甚至說明了這一事實: 「最後,如果你的網卡沒有連接到有效的網絡(例如,連線甚至沒有連接),但NIC必須在Windows」啓用「 – 0xC0DEFACE 2010-08-17 05:31:52

+0

此外,禁用TCP/IP協議的卡將不會被GetAdaptersInfo()檢測到。 – 2011-09-21 13:17:24

+0

GetAdaptersInfo不枚舉禁用的適配器 – 2011-12-15 19:00:09

17

這將爲您提供計算機上所有MAC地址的列表。它將與所有的Windows版本以及工作:

void getdMacAddresses(std::vector<std::string> &vMacAddresses;) 
{ 
    vMacAddresses.clear(); 
    IP_ADAPTER_INFO AdapterInfo[32];  // Allocate information for up to 32 NICs 
    DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer 
    DWORD dwStatus = GetAdaptersInfo(  // Call GetAdapterInfo 
    AdapterInfo,     // [out] buffer to receive data 
    &dwBufLen);     // [in] size of receive data buffer 

    //No network card? Other error? 
    if(dwStatus != ERROR_SUCCESS) 
     return; 

    PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; 
    char szBuffer[512]; 
    while(pAdapterInfo) 
    { 
     if(pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) 
     { 
      sprintf_s(szBuffer, sizeof(szBuffer), "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x" 
       , pAdapterInfo->Address[0] 
       , pAdapterInfo->Address[1] 
       , pAdapterInfo->Address[2] 
       , pAdapterInfo->Address[3] 
       , pAdapterInfo->Address[4] 
       , pAdapterInfo->Address[5] 
       ); 
      vMacAddresses.push_back(szBuffer); 
     } 
     pAdapterInfo = pAdapterInfo->Next; 

    } 
} 
0
#define _CRT_SECURE_NO_WARNINGS 
#include <iostream> 
#include <stdio.h> 
#include <vector> 
#include <Windows.h> 
#include <Iphlpapi.h> 
#include <Assert.h> 
#include <string> 
#pragma comment(lib, "iphlpapi.lib") 


char* getdMacAddresses() 
{ 

    IP_ADAPTER_INFO AdapterInfo[32];  // Allocate information for up to 32 NICs 
    DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer 
    DWORD dwStatus = GetAdaptersInfo(  // Call GetAdapterInfo 
     AdapterInfo,     // [out] buffer to receive data 
     &dwBufLen);     // [in] size of receive data buffer 

    //Exit When Error 
    if (dwStatus != ERROR_SUCCESS) 
     return "ERROR"; 

    PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; 
    char szBuffer[512]; 
    while (pAdapterInfo) 
    { 
     if (pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) 
     { 

      sprintf_s(szBuffer, sizeof(szBuffer), "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x" 
       , pAdapterInfo->Address[0] 
       , pAdapterInfo->Address[1] 
       , pAdapterInfo->Address[2] 
       , pAdapterInfo->Address[3] 
       , pAdapterInfo->Address[4] 
       , pAdapterInfo->Address[5] 
       ); 

      return szBuffer; 

     } 


     pAdapterInfo = pAdapterInfo->Next; 

    } 

    return "ERROR"; 
} 
相關問題