Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Deel:
Meldingen
Alles wissen

[Opgelost] Lazarus - MacOS X - Vinden van he MAC Address van netwerk client in jouw netwerk

2 Berichten
1 Gebruikers
0 Reactions
1,326 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2864
Topic starter  

Deze functie probeert het MAC adres van een netwerk client (desktop, server, laptop, ipad, etc) in jouw network op basis van machine naam of IP adres.

Het MAC Adres is een string in het formaat 00:00:00:00:00:00 en de functie kan worden aangeroepen als 

GetMACAddress('machinenaam'); 

of 

GetMacAddres('192.168.1.1');

Als het MAC adres niet gevonden kan worden dan is het antwoord "00:00:00:00:00:00". 

Dit werkt overigens alleen onder MacOS X.
Voor Windows of Linux zul je de code moeten aanpassen (post het hier mocht je dat gedaan hebben zodat we een cross-platform functie kunnen bouwen).

Voeg de unti "process" aan de Uses clausule toe.

De "Ping" wordt overigens gebruikt om de zaak even wakker te maken (niet hetzelfde als Wake On Lan!).

function TForm1.Ping(Host:string):boolean;
var s : ansistring;
const PingCount = '1'; // number of pings
      PingTimeout = '2'; // timout for each ping
begin
  {$IFDEF Darwin}
    RunCommand('/sbin/ping',['-c '+PingCount,'-t '+PingTimeout,'-q',Host],s);
  {$ELSE}
    RunCommand('/bin/ping',['-c '+PingCount,'-w '+PingTimeout,'-q',Host],s);
  {$ENDIF}
  Result := (pos('100.0% packet loss',S)=0) and (pos('100% packet loss',S)=0);
end; 
function TForm1.GetMACAddress(Host:string):string;
var s : ansistring;
    MacAddress, MacNo:string;
    Counter:integer;
begin
  if ping(Host) then
    begin
      RunCommand('/usr/sbin/arp',[Host],s);
      if (pos(':',s)=0) or (pos('(incomplete)',s)>0) or (pos(' -- no entry',s)>0) then
        Result := '00:00:00:00:00:00'
      else
        begin
          s := copy(s,pos(' at ',s)+4,Length(s));
          s := copy(s,0,pos(' on ',s)-1);
          MacAddress:='';
          for Counter:=1 to 5 do
            begin
              MacNo:=Copy(S, 0, pos(':',S)-1);
              s:=Copy(s,pos(':',S)+1,Length(S));
              if Length(MacNo)=1 then MacNo:='0'+MacNo;
              MacAddress:=MacAddress+MacNo+':';
            end;
          MacAddress:=MacAddress+s;
          Result:=UpperCase(MacAddress);
        end;
    end
  else
    Result:='00:00:00:00:00:00';
end;

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2864
Topic starter  

Een versie voor Windows en MacOS X (getest met Windows 10 en El Capitan), Windows gebruikers zien helaas even kort een shell venster openen en weer verdwijnen.

function Ping(Host:string):boolean;
var s : ansistring;
const PingCount = '2'; // number of pings
      PingTimeout = '2'; // timout for each ping
begin
  s:='';
  {$IFDEF Darwin}
  RunCommand('/sbin/ping',['-c '+PingCount,'-t '+PingTimeout,'-q',Host],s);
  {$ENDIF}
  {$IFDEF Windows}
  RunCommand('ping.exe',['-n ',PingCount,'-w ',PingTimeout,Host],s);
  {$ENDIF}
  Result := (pos('100.0% packet loss',S)=0) and (pos('100% packet loss',S)=0) and (pos('100% loss',S)=0);
end;
function GetMACAddress(Host:string):string;
var s : ansistring;
    MacAddress, MacNo:string;
    Counter:integer;
    ArpExe:string;
begin
  if ping(Host) then
    begin
      s:='';
      {$IFDEF Darwin}
      RunCommand('/usr/sbin/arp',[Host],s);
      {$ENDIF}
      {$IFDEF Windows}
      RunCommand('arp.exe',['-a',Host],s);
      {$ENDIF}
      {$IFDEF Darwin}
      if (pos(':',s)=0) or (pos('(incomplete)',s)>0) or (pos(' -- no entry',s)>0) then
      {$ENDIF}
      {$IFDEF Windows}
      if (pos('Physical Address',s)=0) or (pos('No ARP Entries Found',s)>0) then
      {$ENDIF}
        Result := BlankMACAddress
      else
        begin
          {$IFDEF Darwin}
          s := copy(s,pos(' at ',s)+4,Length(s));
          s := copy(s,0,pos(' on ',s)-1);
          MacAddress:='';
          for Counter:=1 to 5 do
            begin
              MacNo:=Copy(S, 0, pos(':',S)-1);
              s:=Copy(s,pos(':',S)+1,Length(S));
              if Length(MacNo)=1 then MacNo:='0'+MacNo;
              MacAddress:=MacAddress+MacNo+':';
            end;
          MacAddress:=MacAddress+s;
          {$ENDIF}
          {$IFDEF Windows}
          // Windows stuff here
          s:=Copy(s,pos(Host,s)+Length(Host),Length(s));
          s:=trim(s);
          MacAddress:='';
          for Counter:=1 to 5 do
            begin
              MacNo:=Copy(S, 0, pos('-',S)-1);
              s:=Copy(s,pos('-',S)+1,Length(S));
              if Length(MacNo)=1 then MacNo:='0'+MacNo;
              MacAddress:=MacAddress+MacNo+':';
            end;
          MacAddress:=MacAddress+Copy(s,0,2);
          {$ENDIF}
          Result:=UpperCase(MacAddress);
        end;
    end
  else
    Result:=BlankMACAddress;
end;    

   
BeantwoordenCiteren
Deel: