Entwickler-Ecke

Internet / Netzwerk - MAC und IP auslesen


mexx - Fr 11.04.08 10:57
Titel: MAC und IP auslesen
Hallo,

ich weiß, dass es schon einige Beiträge zu diesen Thema gibt, aber keiner behandelt beides zusammen. Ich habe nach langer Suche diesen Code gefunden und verwende diesen auch, um die MACs meiner aktiven Netzwerkkarten auszulesen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
...
uses NB30
...
function GetMacAddress(AdapterID : Integer) : String;
type
 TAdapterStatusA = record 
   Adapt : TAdapterStatus; 
   NameBuff : array[0..30of TNameBuffer; 
 end
var
  NCB           :TNCB;
  ReturnCode    :Char;
  AdapterStatus :TAdapterStatus; 
begin
 FillChar( NCB, SizeOf(NCB), 0 );

 NCB.ncb_command  := Char(NCBRESET); 
 NCB.ncb_lana_num := Char(AdapterID); 

 ReturnCode := NetBios(@NCB); 

 if ReturnCode <> #0 then
 begin
  Result:=Char(Ord(ReturnCode)*-1);
  Exit; 
 end;

 FillChar( NCB, SizeOf(NCB), 0 ); 

 NCB.ncb_command  := Char(NCBASTAT); 
 NCB.ncb_lana_num := Char(AdapterID); 
 NCB.ncb_buffer   := @AdapterStatus; 
 NCB.ncb_length   := SizeOf(AdapterStatus); 
 StrCopy(NCB.ncb_callname, '* ' ); 

 ReturnCode := Netbios( @NCB ); 

 if ReturnCode <> #0 then
 begin
  Result:=Char(Ord(ReturnCode)*-1); 
  Exit; 
 end;

 result:=Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x'
                [ORD(AdapterStatus.Adapter_address[0]), 
                 ORD(AdapterStatus.Adapter_address[1]), 
                 ORD(AdapterStatus.Adapter_address[2]), 
                 ORD(AdapterStatus.Adapter_address[3]), 
                 ORD(AdapterStatus.Adapter_address[4]), 
                 ORD(AdapterStatus.Adapter_address[5])]) 
end;

function GetAdapters: TLanaEnum;
var
  NCB        :TNCB;
  LanaEnum   :TLanaEnum;
  ReturnCode :Char;

begin
 FillChar(NCB, SizeOf(NCB), 0);
 FillChar(LanaEnum, SizeOf(TLanaEnum), 0);

 NCB.ncb_Command := CHAR(NCBENUM); 
 NCB.ncb_buffer  := @LanaEnum; 
 NCB.ncb_length  := Sizeof(LanaEnum); 

 ReturnCode := NetBios(@NCB); 

 if ReturnCode <> #0 then
 begin
  LanaEnum.Length  := CHAR(0); 
  LanaEnum.Lana[0] := ReturnCode; 
 end;

 Result := LanaEnum; 
end;

procedure TForm1.FormCreate(Sender: TObject);
var L_Enum :TLanaEnum;
    i      :INTEGER;
begin
 L_Enum := GetAdapters;

 if L_Enum.Length = '0' then
 begin
  Exit;
 end;


 for i:= 0 to (BYTE(L_Enum.Length) - 1do
 begin
  ListBox1.Items.Add(getMACaddress(BYTE(L_Enum.Lana[i])));
 end;
end;


Ich muss an der Stelle aber auch sagen, dass ich mit der Unit NB30 und der TLanaEnum nicht viel anfangen kann, bin aber der Ansicht, dass man mit diesen Code auch ganz einfach die IP-Adresse zu den gefunden Adapter rausfinden kann. Weiss jemand wie oder kennt jemand Links, wo ich mir das anlesen kann?

Danke für eure Hilfe!


BenBE - Mi 16.04.08 15:20

Müsste der Vergleich in Zeile 84 nicht auf #0 statt '0' prüfen???


Narses - Do 17.04.08 12:14
Titel: Re: MAC und IP auslesen
Moin!

user profile iconmexx hat folgendes geschrieben:
Weiss jemand wie oder kennt jemand Links, wo ich mir das anlesen kann?
Suche im MSDN IPHLPAPI

cu
Narses


Ricster - Do 17.04.08 12:20

Hallo, dass wird dir sicher helfen :roll:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
uses
  NB30, WinSock, IdHTTP;

[...]

function GetMACAddress(): string;
function GetAdapterInfo(Lana: Char): string;
var
  AdapterStatus: TAdapterStatus;
  NCB: TNCB;
begin
  FillChar(NCB, SizeOf(NCB), 0);
  NCB.NCB_COMMAND := Char(NCBRESET);
  NCB.NCB_LANA_NUM := Lana;
  if NetBios(@NCB) <> Char(NRC_GOODRET) then
  begin
    Result := '- MAC not found -';
    Exit;
  end;

  FillChar(NCB, SizeOf(NCB), 0);
  NCB.NCB_COMMAND := Char(NCBASTAT);
  NCB.NCB_LANA_NUM := Lana;
  NCB.ncb_callname := '*';

  FillChar(AdapterStatus, SizeOf(AdapterStatus), 0);
  NCB.ncb_buffer := @AdapterStatus;
  NCB.ncb_length := SizeOf(AdapterStatus);
  
  if NetBios(@NCB) <> Char(NRC_GOODRET) then
  begin
    Result := '- MAC not found -';
    Exit;
  end;

  Result := IntToHex(Byte(AdapterStatus.Adapter_Address[0]), 2) + '-' + IntToHex(Byte(AdapterStatus.Adapter_Address[1]), 2) + '-' + IntToHex(Byte(AdapterStatus.Adapter_Address[2]), 2) + '-' + IntToHex(Byte(AdapterStatus.Adapter_Address[3]), 2) + '-' + IntToHex(Byte(AdapterStatus.Adapter_Address[4]), 2) + '-' +  IntToHex(Byte(AdapterStatus.Adapter_Address[5]), 2);
end;

var
  AdapterList: TLanaEnum;
  NCB: TNCB;
begin
  Result := '';

  FillChar(NCB, SizeOf(NCB), 0);
  NCB.ncb_command := Char(NCBENUM);
  NCB.ncb_buffer := @AdapterList;
  NCB.ncb_length := SizeOf(AdapterList);
  Netbios(@NCB);
  if Byte(AdapterList.length) > 0 then Result := GetAdapterInfo(AdapterList.lana[0])
  else Result := '- MAC not found -';
end;

function GetInternetIP(): string;
var
  Temp: string;
begin
  Result := '';
  Temp := IdHTTP1.Get('http://checkip.dyndns.org');
  Result := Copy(Temp, Pos(':', Temp) + 2, Pos('</bo', Temp) - Pos(':', Temp) - 2);
end;

function GetNetworkIP(): string;
var
  WSA: TWSAData;
  Len: Integer;
  PHost: PChar;
  HostEnt: PHostEnt;
begin
  Result := '';

  WSAStartup($0101, WSA);
  Len := $FF;
  PHost := StrAlloc(Len);
  GetHostName(PHost, Len);
  HostEnt := GetHostByName(PHost);

  with HostEnt^ do
    Result := Format('%d.%d.%d.%d', [Ord(H_Addr^[0]), Ord(H_Addr^[1]), Ord(H_Addr^[2]), Ord(H_Addr^[3])]);

  StrDispose(PHost);
  WSACleanup;
end;


Narses - Do 17.04.08 12:44

Moin!

user profile iconRicster hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
function GetInternetIP(): string;
//...
  Temp := IdHTTP1.Get('http://checkip.dyndns.org');
  Result := Copy(Temp, Pos(':', Temp) + 2, Pos('</bo', Temp) - Pos(':', Temp) - 2);
Fixe Positionen zu verwenden ist sicher keine gute Idee. Schau mal hier [http://www.delphi-library.de/topic_Internet+IP+ueber+Internetseite+herausfinden_74581.html]. ;)

user profile iconRicster hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
function GetNetworkIP(): string;
//...
  HostEnt := GetHostByName(PHost);
Das liefert aber nur die IPs; nicht, welcher Schnittstelle diese zugeordnet sind. :idea: ;)

user profile iconRicster hat folgendes geschrieben:
dass wird dir sicher helfen :roll:
;)

cu
Narses


Ricster - Do 17.04.08 14:53

Ich kenn mich mit Netzwerk und Internet eben nicht so aus :) Gut das es immer jemand gibt der es besser weiß :D