Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Mac Adresse mit IP herausfinden... Habe code, wie anpassen? (https://www.delphipraxis.net/161982-mac-adresse-mit-ip-herausfinden-habe-code-wie-anpassen.html)

hedie 31. Jul 2011 16:24

Mac Adresse mit IP herausfinden... Habe code, wie anpassen?
 
Hallo zusammen...

Es ist schon ein weilchen her, seit ich wirklich aktiv Delphi Programmiert habe...

Deshalb hier diese "anfänger" fragen..

Ich habe diesen Code gefunden http://www.delphi3000.com/articles/article_3867.asp?SK=

Delphi-Quellcode:
Function to return the MAC address of a remote or local machine in the format 'XX-XX-XX-XX-XX-XX'

The returned MAC address is a Unique ID that can be used in various ways. One way is as a parameter to my Wake On Lan function.(See article "http://www.delphi3000.com/articles/article_3847.asp")

Example :

ShowMessage(GetMacAddress('\\MHEYDON');

Output = '00-02-08-E7-99-6B'
Answer:



// ======================================================================
// Return the MAC address of Machine identified by AServerName
// Format of AServerName is '\\ServerName' or 'ServerName'
// If AServerName is a Null String then local machine MAC address
// is returned.
// Return string is in format 'XX-XX-XX-XX-XX-XX'
// ======================================================================

function GetMacAddress(const AServerName : string) : string;
type
     TNetTransportEnum = function(pszServer : PWideChar;
                                  Level : DWORD;
                                  var pbBuffer : pointer;
                                  PrefMaxLen : LongInt;
                                  var EntriesRead : DWORD;
                                  var TotalEntries : DWORD;
                                  var ResumeHandle : DWORD) : DWORD; stdcall;

     TNetApiBufferFree = function(Buffer : pointer) : DWORD; stdcall;

     PTransportInfo = ^TTransportInfo;
     TTransportInfo = record
                       quality_of_service : DWORD;
                       number_of_vcs : DWORD;
                       transport_name : PWChar;
                       transport_address : PWChar;
                       wan_ish : boolean;
                     end;

var E,ResumeHandle,
    EntriesRead,
    TotalEntries : DWORD;
    FLibHandle : THandle;
    sMachineName,
    sMacAddr,
    Retvar : string;
    pBuffer : pointer;
    pInfo : PTransportInfo;
    FNetTransportEnum : TNetTransportEnum;
    FNetApiBufferFree : TNetApiBufferFree;
    pszServer : array[0..128] of WideChar;
    i,ii,iIdx : integer;
begin
  sMachineName := trim(AServerName);
  Retvar := '00-00-00-00-00-00';

  // Add leading \\ if missing
  if (sMachineName <> '') and (length(sMachineName) >= 2) then begin
    if copy(sMachineName,1,2) <> '\\' then
      sMachineName := '\\' + sMachineName
  end;

  // Setup and load from DLL
  pBuffer := nil;
  ResumeHandle := 0;
  FLibHandle := LoadLibrary('NETAPI32.DLL');

  // Execute the external function
  if FLibHandle <> 0 then begin
    @FNetTransportEnum := GetProcAddress(FLibHandle,'NetWkstaTransportEnum');
    @FNetApiBufferFree := GetProcAddress(FLibHandle,'NetApiBufferFree');
    E := FNetTransportEnum(StringToWideChar(sMachineName,pszServer,129),0,
                           pBuffer,-1,EntriesRead,TotalEntries,Resumehandle);

    if E = 0 then begin
      pInfo := pBuffer;

      // Enumerate all protocols - look for TCPIP
      for i := 1 to EntriesRead do begin
        if pos('TCPIP',UpperCase(pInfo^.transport_name)) <> 0 then begin
          // Got It - now format result 'xx-xx-xx-xx-xx-xx'
          iIdx := 1;
          sMacAddr := pInfo^.transport_address;

          for ii := 1 to 12 do begin
            Retvar[iIdx] := sMacAddr[ii];
            inc(iIdx);
            if iIdx in [3,6,9,12,15] then inc(iIdx);
          end;
        end;

        inc(pInfo);
      end;
      if pBuffer <> nil then FNetApiBufferFree(pBuffer);
    end;

    try
      FreeLibrary(FLibHandle);
    except
      // Silent Error
    end;
  end;

  Result := Retvar;
end;
Mit diesem ist es möglich von einem Computernamen auf eine MAC zu kommen... das funktioniert soweit einwandfrei...

doch ich möchte gerne von einer IP zur Mac kommen... Gibt es eine möglichkeit den code anzupassen?

Danke schonmal

s.h.a.r.k 31. Jul 2011 16:35

AW: Mac Adresse mit IP herausfinden... Habe code, wie anpassen?
 
Schon mal versucht
Delphi-Quellcode:
ShowMessage('\\192.168.x.x');
aufzurufen? Windows müsste damit eigentlich schon entsprechend umgehen können. (natürlich die x durch passende Werte der IP-Adresse ersetzen)

mkinzler 31. Jul 2011 17:05

AW: Mac Adresse mit IP herausfinden... Habe code, wie anpassen?
 
Aber was bringt dir das? wenn der Zielrechner sich nicht im gleichen Netzwerksegment befindet, kannst du ihn nicht per MAC (Netzwerkebene/Level 2) erreichen.

hedie 31. Jul 2011 17:33

AW: Mac Adresse mit IP herausfinden... Habe code, wie anpassen?
 
ich möchte nicht damit kommunizieren... ich brauche einfach nur die mac :)

Doch leider funktioniert dieser Code nicht wirklich... Nur mit dem eigenen Computer namen gehts... mit einem anderen welcher sich im netz befindet gehts nicht...

Doch der ARP wird korrekt abgearbeitet (sehe ich in wireshark...) also das iphone antwortet korrekt...
aber es kommt nur 00-00-00-00-00-00 zurück...

kennt jemand vielleicht noch einen code?

Klaus01 31. Jul 2011 17:45

AW: Mac Adresse mit IP herausfinden... Habe code, wie anpassen?
 
Hallo,

wenn die Zieladresse nicht in Deinem Netzwerksegment liegt,
ist die MAC-Adresse die Du im Wireshark siehst die Deines nächsten Hops.
In der Regel Dein Defaulrouter.

Grüße
Klaus

mkinzler 31. Jul 2011 17:57

AW: Mac Adresse mit IP herausfinden... Habe code, wie anpassen?
 
Du solltest dich wirklich mal mit den Grundlagen von Netzwerken beschäftigen.

SirTwist 1. Aug 2011 22:18

AW: Mac Adresse mit IP herausfinden... Habe code, wie anpassen?
 
ohne mich jetzt groß in die Doku der verwendeten System-Calls eingelesen zu haben, habe ich den Verdacht, dass hier Windows-eigene Funktionen genutzt werden... sowas wie NetTransportEnum finde ich schon recht verdächtig. Und das wird natürlich mit einem Eipfone nicht funktionieren.

Einfacher geht folgendes: erstmal die IP-Adresse anpingen, und dann die lokale ARP-Tabelle auslesen. An der Kommandozeile wäre das ein "ping 192.168.25.1" und danach ein "arp -a", da kommt dann sowas bei rum:
Code:
C:\Users\benutzer>arp -a

Schnittstelle: 192.168.25.10 --- 0xa
  Internetadresse      Physische Adresse    Typ
  192.168.25.1          00-0c-4d-35-82-d0     dynamisch
  192.168.25.5          00-0c-d6-13-7e-dd    dynamisch
  192.168.25.255        ff-ff-ff-ff-ff-ff    statisch
Ich weiß, dass ich das auch mal mit Indy-Komponenten programmiert habe, aber ich komm an den Quellcode nicht mehr ran.

zeras 11. Aug 2013 12:49

AW: Mac Adresse mit IP herausfinden... Habe code, wie anpassen?
 
Zitat:

Zitat von SirTwist (Beitrag 1114561)
ohne mich jetzt groß in die Doku der verwendeten System-Calls eingelesen zu haben, habe ich den Verdacht, dass hier Windows-eigene Funktionen genutzt werden... sowas wie NetTransportEnum finde ich schon recht verdächtig. Und das wird natürlich mit einem Eipfone nicht funktionieren.

Einfacher geht folgendes: erstmal die IP-Adresse anpingen, und dann die lokale ARP-Tabelle auslesen. An der Kommandozeile wäre das ein "ping 192.168.25.1" und danach ein "arp -a", da kommt dann sowas bei rum:
Code:
C:\Users\benutzer>arp -a

Schnittstelle: 192.168.25.10 --- 0xa
  Internetadresse      Physische Adresse    Typ
  192.168.25.1          00-0c-4d-35-82-d0     dynamisch
  192.168.25.5          00-0c-d6-13-7e-dd    dynamisch
  192.168.25.255        ff-ff-ff-ff-ff-ff    statisch
Ich weiß, dass ich das auch mal mit Indy-Komponenten programmiert habe, aber ich komm an den Quellcode nicht mehr ran.


Thema ist schon wieder lange her, aber ich komme auch nicht weiter, wie ich mit einer bekannten IP auf die MAC eines Rechners schliessen kann, wenn diese im selben Subnetz liegt. Der Code weiter oben bringt mir auch nur '00-00-00-00-00-00' und
ShowMessage('\\192.168.x.x') bring auch nur denselben String zurück.
Mit arp -a geht es im CMD, aber da müsste ich erst eine Routine rundrum bauen, im die Ergebnisse umzuleiten.

zeras 13. Aug 2013 19:34

AW: Mac Adresse mit IP herausfinden... Habe code, wie anpassen?
 
push

Aviator 13. Aug 2013 20:28

AW: Mac Adresse mit IP herausfinden... Habe code, wie anpassen?
 
Hi,

also ich mache das Ganze mit der folgenden Funktion:

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);                                                                            
  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 := 'MAC-Adresse konnte nicht ermittelt werden. Fehler:' + #13#10 + 'ERROR_GEN_FAILURE';        
    ERROR_INVALID_PARAMETER:                                                                                
      Result := 'MAC-Adresse konnte nicht ermittelt werden. Fehler:' + #13#10 + 'ERROR_INVALID_PARAMETER';  
    ERROR_INVALID_USER_BUFFER:                                                                              
      Result := 'MAC-Adresse konnte nicht ermittelt werden. Fehler:' + #13#10 + 'ERROR_INVALID_USER_BUFFER';
    ERROR_BAD_NET_NAME:                                                                                    
      Result := 'MAC-Adresse konnte nicht ermittelt werden. Fehler:' + #13#10 + 'ERROR_BAD_NET_NAME';      
    ERROR_BUFFER_OVERFLOW:                                                                                  
      Result := 'MAC-Adresse konnte nicht ermittelt werden. Fehler:' + #13#10 + 'ERROR_BUFFER_OVERFLOW';    
    else                                                                                                    
      Result := 'Error: RC='+IntToStr(RC);                                                                  
  end;                                                                                                      
end;
Klappt bei mir hervorragend.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr.
Seite 1 von 2  1 2      

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