Autor Beitrag
mexx
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Fr 11.04.08 10:57 
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.

ausblenden volle Höhe 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!

_________________
Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 16.04.08 15:20 
Müsste der Vergleich in Zeile 84 nicht auf #0 statt '0' prüfen???

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 17.04.08 12:14 
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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Ricster
Hält's aus hier
Beiträge: 14

Windows XP
Delphi 2007
BeitragVerfasst: Do 17.04.08 12:20 
Hallo, dass wird dir sicher helfen :roll:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 17.04.08 12:44 
Moin!

user profile iconRicster hat folgendes geschrieben:
ausblenden 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. ;)

user profile iconRicster hat folgendes geschrieben:
ausblenden 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Ricster
Hält's aus hier
Beiträge: 14

Windows XP
Delphi 2007
BeitragVerfasst: 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