2008-10-21 2 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이 필요 연결된 –

답변

2

WMIService을 사용할 수 있습니까? 비스타 이전에 컴퓨터의 MAC 주소를 얻는데 사용했습니다.

+0

감사합니다. 이건 내 문제에 대한 가장 깨끗한 해결책 인 것 같습니다. – Laur

0

GetAdaptersInfo()는 공식적인 방법으로 연결이 끊어진 어댑터를 포함하여 모든 어댑터를 열거합니다.
이 예제 코드 codeguru

+0

올바르지 않습니다. GetAdaptersInfo()는 비활성화 된 어댑터를 열거 할 수 없습니다. 심지어 코드 전문가는이 사실까지도 언급합니다 : "NIC가 유효한 네트워크에 연결되어 있지 않은 경우 (예 : 전선이 연결되지 않은 경우)에도 작동하지만 NIC는 Windows에서"사용 가능 "해야합니다." – 0xC0DEFACE

+0

또한 TCP/IP 프로토콜을 사용하지 않는 카드는 GetAdaptersInfo()에 의해 감지되지 않습니다. –

+0

GetAdaptersInfo가 비활성화 된 어댑터를 열거하지 않습니다. –

17

컴퓨터의 모든 MAC 주소 목록을 제공합니다. 그것은뿐만 아니라 윈도우의 모든 버전에서 작동 :

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

안녕하세요 Brian, 감사합니다. 그동안 나는이 링크를 발견했다. 나는 이것을 위해 또는 WMI 해결책을 위해 갈 것이라고 생각한다. http://msdn.microsoft.com/en-us/library/aa365915(VS.85).aspx – Laur

+0

우리는 몇 년 동안 우리의 주요 제품에서 위의 방법을 사용했습니다. Vista, 2008, 2003, XP, 2000, ...에서 잘 작동합니다. –

+0

업데이트 : and win7 :) –

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"; 
} 
+0

이 문제를 해결하는 방법에 대해 설명해주십시오. – Phani

관련 문제