Re: MAC-Adresse zu einer IP Adresse ermitteln
Das ist die Funktion:
Code:
Weiterhin habe ich die Unit "IPHLPAPI.PAS" verwendet, die auch hier zu finden ist.
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; |
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:
versucht mir den Wert von AddrLen anzeigen zu lassen und er gibt mir immer 0 aus. Aber wieso?
ShowMessage(IntToStr(AddrLen));
|
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:
Im Programm lass ich mir die MAC-Adresse mit
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;
Delphi-Quellcode:
Wobei IPAdresse vom Typ String ist und eine IP-Adresse eines Remote-Hosts beinhaltet.
LabelBlaBla.Caption := GetMacAddr(IPAdresse);
Selbst ein LabelBlaBla.Caption := GetMacAddr(AnsiString(IPAdresse)); brachte nicht den gewünschten Erfolg. |
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 |
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!
|
Re: MAC-Adresse zu einer IP Adresse ermitteln
Zitat:
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 |
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 13:36 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