Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi MAC-Adresse zu einer IP Adresse ermitteln (https://www.delphipraxis.net/142295-mac-adresse-zu-einer-ip-adresse-ermitteln.html)

CG2003 25. Okt 2009 18:23


MAC-Adresse zu einer IP Adresse ermitteln
 
Hallo,

die Suche hat leider nur Ergebnisse herausgegeben, anhand derer ich die EIGENE MAC-Adresse ermitteln kann.

Ich suche jedoch eine Funktion, mit der ich mit Delphi 2009 durch Übergabe einer IP-Adresse die MAC-Adresse der Netzwerkkarte zu dieser IP-Adresse ermitteln kann.

Gibt es sowas bereits in der Windows-API?

DeddyH 25. Okt 2009 18:28

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Nach kurzer Recherche bin ich auf MSDN-Library durchsuchenSendARP gestoßen. Hab ich selbst allerdings noch nie benutzt, da keine Notwendigkeit.

CG2003 25. Okt 2009 18:33

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Danke.

Hmm, wie benutze ich die denn nun? Hätte jemand evtl. einen Beispiel-Code?

Meflin 25. Okt 2009 18:34

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
http://www.tek-tips.com/viewthread.c...1103688&page=1
( via Bei Google suchenDelphi SendARP - es is schon schwer...)

Luckie 25. Okt 2009 18:35

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Guck mal hier: http://www.michael-puff.de/Developer/Delphi/Programme -> GetMAC.zip

DeddyH 25. Okt 2009 18:36

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Schau mal hier: http://www.delphipraxis.net/internal...ct.php?t=76729

[edit] :lol:, wenn die Auswahl nicht reicht, weiß ich es nicht. [/edit]

CG2003 25. Okt 2009 19:04

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Zitat:

Zitat von DeddyH
Schau mal hier: http://www.delphipraxis.net/internal...ct.php?t=76729

[edit] :lol:, wenn die Auswahl nicht reicht, weiß ich es nicht. [/edit]

Hallo,

bei mir sagt er an der Stelle:

Delphi-Quellcode:
  DestIP := inet_addr(PChar(IP));
"Inkompatible Typen: Char und AnsiChar"

wenn ich das PChar auf PAnsiChar ändere compiliert er den Code zwar, aber ich erhalte als Rückgabewert einen leeren String.

DeddyH 25. Okt 2009 19:11

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Das ist aber nicht Delphi 2006, sondern 2009/2010, hab ich Recht?

almdudler777 25. Okt 2009 19:23

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Zitat:

Zitat von DeddyH
Das ist aber nicht Delphi 2006, sondern 2009/2010, hab ich Recht?


nö ist Delphi 2009, steht zumindest im ersten Beitrag!

@CG2003:

als erstes mal, musst du alle vorkommen von String,PChar und Char durch AnsiString, PAnsiChar und AnsiChar ersetzen. Willkommen im Unicodezeitalter... ich habe derzeit auch meine Wehwehchen damit... in der Hilfe von Delphi 2009 steht aber einiges dazu! Auch wie man die Projekte portieren kann.

Das dein String leer ist, kann daran liegen, dass an irgendeiner stelle mit Move oder SetString gearbeitet wurde... in Unicode funktionieren die Funktionen nicht wie erwartet, wenn du alte Projekte compilieren möchtest...

Luckie 25. Okt 2009 19:28

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Hilfreich wäre es auch den ganzen Code zu sehen. Und irgendwelche Fehlermeldungen von der IDE oder von der Fehlerbehandlung.

CG2003 25. Okt 2009 20:40

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Das ist die Funktion:

Code:
uses IPHlpAPI, WinSock;


function IPToMAC(IP: String) : String;
var
  DestIP, SrcIP: Cardinal;
  pMacAddr: PULong;
  AddrLen: ULong;
  MacAddr: array[0..5] of byte;
  p: PByte;
  i: integer;
begin
  result := '';
  SrcIp := 0;
  DestIP := inet_addr(PChar(IP));
  pMacAddr := @MacAddr[0];
  AddrLen := SizeOf(MacAddr);
  SendARP(DestIP, SrcIP, pMacAddr, AddrLen);
  p := PByte(pMacAddr);
  if Assigned(p) and (AddrLen>0) then
  for i := 0 to AddrLen-1 do
  begin
    result := result + IntToHex(p^,2) + '-';
    Inc(p);
  end;
  SetLength(result, Length(result) - 1);
end;
Weiterhin habe ich die Unit "IPHLPAPI.PAS" verwendet, die auch hier zu finden ist.

CG2003 25. Okt 2009 21:31

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Sorry, für Doppelpost, aber kann es sein, dass AddrLen immer 0 ist und er deshalb nichts ausgibt?
Ich habe mir mal innerhalb der Funktion mittels

Delphi-Quellcode:
ShowMessage(IntToStr(AddrLen));
versucht mir den Wert von AddrLen anzeigen zu lassen und er gibt mir immer 0 aus. Aber wieso?

CG2003 26. Okt 2009 06:42

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
So, ich nutze jetzt folgende Funktion und hier bekomme ich den Fehler zurück, dass MacAddrLen 0 ist. Woran kann das liegen?

Delphi-Quellcode:
function SendARP(const DestIP, SrcIP: in_addr; pMacAddr: PULONG; var PhyAddrLen: ULONG): DWORD; stdcall; external 'IPHLPAPI.DLL' name 'SendARP';

function GetMacAddr(const IPv4: String): String;
  const
    SrcIP: in_addr = (S_addr: 0);
  var
    DestIP: in_addr;
    MacAddr: array[0..5] of Byte;
    MacAddrLen, RC: DWORD;
    i: Integer;
begin
  Result := '';
  DestIP.S_addr := inet_addr(PAnsiChar(AnsiString(IPv4)));
  MacAddrLen := Length(MacAddr);
  // msdn.microsoft.com/e...aa366358(VS.85).aspx
  RC := SendARP(DestIP,SrcIP,@MacAddr,MacAddrLen);
  case RC of
    NO_ERROR:
      begin
        if (MacAddrLen = 6) then
          for i := 0 to 5 do begin
            if (i > 0) then
              Result := Result +'-';
            Result := Result +IntToHex(MacAddr[i],2);
          end
        else
          Result := 'Error: MacAddrLen='+IntToStr(MacAddrLen);
      end;
    ERROR_GEN_FAILURE:
      Result := 'ERROR_GEN_FAILURE';
    ERROR_INVALID_PARAMETER:
      Result := 'ERROR_INVALID_PARAMETER';
    ERROR_INVALID_USER_BUFFER:
      Result := 'ERROR_INVALID_USER_BUFFER';
    ERROR_BAD_NET_NAME:
      Result := 'ERROR_BAD_NET_NAME';
    ERROR_BUFFER_OVERFLOW:
      Result := 'ERROR_BUFFER_OVERFLOW';
    else
      Result := 'Error: RC='+IntToStr(RC);
  end;
end;
Im Programm lass ich mir die MAC-Adresse mit

Delphi-Quellcode:
LabelBlaBla.Caption := GetMacAddr(IPAdresse);
Wobei IPAdresse vom Typ String ist und eine IP-Adresse eines Remote-Hosts beinhaltet.
Selbst ein LabelBlaBla.Caption := GetMacAddr(AnsiString(IPAdresse)); brachte nicht den gewünschten Erfolg.

fkerber 26. Okt 2009 07:19

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Hi!

Bitte vermeide für die Zukunft Doppel- oder gar Triple-Postings innerhalb von 24 Stunden. Während diesr Zeit kannst du immer noch Informationen an deinen bestehenden Beitrag anhängen (durch Editieren).

Es wäre auch schön, wenn du in deinem obigen Beitrag die Code-Tags durch Delphi-Tags ersetzen würdest, damit der Code besser lesbar wird.


Zum Thema:
Wo kommt dieser "Fehler" denn? Ich kann bei dir jetzt keine Fehlerausgabe finden, die diesen Text enthält.


Grüße, Frederic

generic 26. Okt 2009 08:28

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Die Mac Adresse kannst du nur ermitteln, wenn du lokale IP Adressen verwendest. Die Mac z.B. von einem entfernten Server kannst du nicht ermitteln!

mh166 26. Okt 2009 13:47

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Zitat:

Zitat von generic
Die Mac Adresse kannst du nur ermitteln, wenn du lokale IP Adressen verwendest. Die Mac z.B. von einem entfernten Server kannst du nicht ermitteln!

Das ist so nicht ganz richtig. Wenn der entfernte Rechner im gleichen Subnet ist, dann wäre es möglich. Hier mach ichs meistens so, dass ich die Ziel-IP anpinge und anschließend den ARP-Cache auslese. Im selben Subnetz wird ja bekanntlich nichts geroutet und der Rechner kümmert sich daher selbst um die Auflösung der IP-Adresse via ARP.

Sollte der entfernte Rechner allerdings in einem anderen Subnet stehen, dann läuft die ganze Geschichte natürlich über einen Router. Der löst dann für dich die IP (soweit bekannt) auf und du bekommst daher nix davon mit.

mfg, mh166

CG2003 26. Okt 2009 16:45

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Jupp, über die VPN-Verbindung hatte das bisher in Delphi 2007 und Windows Vista einwandfrei funktioniert. Nur in Delphi 2009 und Windows 7 nicht mehr. Warum weiß ich noch nicht.
Mache ich es allerdings in der Firma direkt im Netz geht's, über VPN nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz