2008-10-21 40 views
10

Actualmente estamos usando el NetBios method, y funciona bien en XP. Las pruebas preliminares en Vista muestran que también funciona, pero hay advertencias: NetBIOS tiene que estar presente, por ejemplo, y por lo que he estado leyendo, el orden de los adaptadores está destinado a cambiar. Nuestro método alternativo - con SNMPExtensionQuery - parece estar roto bajo Vista.C++: ¿Obtener la dirección MAC de los adaptadores de red en Vista?

La pregunta es: ¿conoces una manera confiable de obtener una lista de las direcciones MAC locales en una máquina Vista? La compatibilidad con XP es una ventaja (prefiero tener un solo método que muchos feos # ifdef). ¡Gracias!

+0

http://stackoverflow.com/questions/823553/how-to-get-hardware-mac-address-on-windows estos deben estar vinculado –

Respuesta

2

¿Podría usar el WMIService? Sin embargo, lo usé para obtener la mac dirección de una máquina en días previos a la Vista.

+0

Gracias, esta parece ser la solución más limpia para mi problema. – Laur

0

GetAdaptersInfo() es el método oficial, enumera todos los adaptadores incluso los que están desconectados.
Consulte esta publicación para ver el código de ejemplo codeguru

+0

Incorrecto. GetAdaptersInfo() no puede enumerar los adaptadores que están deshabilitados. El artículo del gurú del código incluso afirma este hecho: "Finalmente también funciona si sus NIC no están conectadas a redes válidas (por ejemplo, los cables ni siquiera están conectados), pero las NIC deben estar" habilitadas "en Windows" – 0xC0DEFACE

+0

Además, una tarjeta con el protocolo TCP/IP deshabilitado no será detectada por GetAdaptersInfo(). –

+0

GetAdaptersInfo no enumera adaptadores deshabilitados –

17

Esto le dará una lista de todas las direcciones MAC en su computadora. Se trabajará con todas las versiones de Windows, así:

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

Hola Brian, Gracias por el aviso; mientras tanto encontré este enlace (para XP y posterior); Supongo que iré por esto o por la solución de WMI. http://msdn.microsoft.com/en-us/library/aa365915(VS.85).aspx – Laur

+0

Hemos utilizado este método anteriormente en nuestros principales productos durante varios años. Funciona bien en Vista, 2008, 2003, XP, 2000, .... –

+0

Actualización: y 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

¿Puede explicar cómo va a solucionar el problema? – Phani

Cuestiones relacionadas