MAC - Adresse der Netzwerkkarte aus der Hardware auslesen?



  • Hallo,

    ist es möglich, die Netzwerkkarten MAC-Adresse direkt von der Karte auszulesen, oder geht das nur wie in den FAQs beschrieben aus der Registry (die ja leicht veränderbar ist)? Ist das vielleicht über den Kartentreiber möglich?

    Danke für Eure Mühen.

    Bernhard



  • Die IMHO richtige Lösung ist:

    WMI SDK mit Win32_NetworkAdapter
    http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_networkadapter.asp
    oder
    http://support.microsoft.com/kb/118623/en-us
    bzw.

    CString GetMACAddress(int adapternumber) 
    { 
     int nAdapterCount = 0; 
     ULONG ip; 
     ULONG buflen; 
     PIP_ADAPTER_INFO pAdInfo = NULL; 
     PIP_ADAPTER_INFO pAdInfo_c = NULL; 
    
     buflen = 0; 
     GetAdaptersInfo(pAdInfo, &buflen); //since buflen=0, buffer is 
        // too small. function returns required buffersize in buflen. 
     pAdInfo = (struct _IP_ADAPTER_INFO *)new UCHAR[buflen+1]; 
     pAdInfo_c = pAdInfo; 
     if (GetAdaptersInfo(pAdInfo, &buflen) == ERROR_SUCCESS) 
     { 
      do 
      { 
       ip = inet_addr(pAdInfo->IpAddressList.IpAddress.String); 
       if ((ip != 0)&&(ip != 0x7f000001)) 
       { 
        nAdapterCount++; 
        if ((nAdapterCount == adapternumber)||(adapternumber == 0)) 
        { 
         if (pAdInfo->AddressLength != 0) 
         { 
          CString macstr; 
          for (int i = 0; i < (int)pAdInfo->AddressLength; i++) 
          { 
           CString temp; 
           temp.Format(_T(" %02X"), pAdInfo->Address[i]); 
           macstr += temp; 
          } 
          delete pAdInfo; 
          return macstr; 
         } 
        } 
       } 
      } while ((pAdInfo->Next != NULL)&&((pAdInfo = pAdInfo->Next) != 
    pAdInfo)); 
     } 
     delete pAdInfo_c; 
     return _T(""); 
    
    }
    


  • Danke für die aufwändige Antwort! Superb!

    Gruß Bernhard



  • soweit ich nach einer Nacht WinAPI durchblicke sind die genutzten Funktionen und Datentypen in der cimwin32.dll zu finden. ('tschuldigung, API ist nicht so mein Ding...)
    Wenn ich diese zur Laufzeit einbinde (soweit mir dies gelungen ist...war das erste mal..) bekomme ich trotzdem beim Compilieren Fehlermeldungen ( z.B. über PIP_ADAPTER_INFO).
    Muß die dll bereits zum Compilieren eingebunden werden? Wenn ja, wie??
    Das Programm soll unter BCB3 geschrieben werden.

    Vielen Dank für die Geduld.

    Gruß Bernhard



  • Also ich sag jetzt mal grob. Die libs bindest du ein weil dort die Funktionen sind. Wenn der Compiler ne Konstante, ne struktur oder weis ich was nicht kennt dann liegt das daran das du wohl ne header nicht eingebunden hast. Ich glaube das ist <Iphlpapi.h> aber weis es nicht genau.
    Ansonsten nochmal in der MSDN suchen.

    MfG schirrmie



  • Danke für den Tip - da war ich wohl eine Nacht im Nirvana....
    Nötig waren die Winsock2.h und wie Du richtig vorgeschlagen hast die iphlpapi.h" incl. gleichnamiger lib.
    War alles auf der Server3 PSDK.

    Vielen Dank für Eure Mühe.



  • Hallo,

    nun hat mein Linker ein Problem mit der iphlpapi.lib. Er nervt mich mit folgender Fehlermeldung:
    [LinkerFehler] 'C:\PROGRAMME\MICROSOFT SDK\LIB\IPHLPAPI.LIB' contains invalid OMF record, type 0x21.
    Ein Verändern der Reihenfolge der Headerdeklarationen hat leider keine Besserung gebracht.
    Ist dies ein Problem mit dem BCB3, oder bin ich wiedermal im falschen Film?

    Vielen Dank für Eure Mühe

    Gruß Bernhard



  • (Gabs da nicht nen Lib-Konverter Tool oder so?)

    Weniger gute Lösungen gibts auch noch in der WinSock FAQ:
    http://tangentsoft.net/wskfaq/advanced.html#macaddr


Log in to reply