Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi MAC-Adresse einlesen plus Bezeichnung des LAN-Adapters (https://www.delphipraxis.net/138850-mac-adresse-einlesen-plus-bezeichnung-des-lan-adapters.html)

Frettchenstall 18. Aug 2009 15:44


MAC-Adresse einlesen plus Bezeichnung des LAN-Adapters
 
Hallo zusammen,

ich möchte meine MAC-Adressen einlesen. Zur Zeit habe ich 2 LAN-Karten in meinem Rechner installiert. Mit diesem unten angegebenen Code, der im Internet herumspuckt, werden mir auch alle MAC-Adressen angezeigt. Jedoch bringt mir die reine MAC-Adresse nicht sonderlich viel, da der Benutzer von der MAC-Adresse nicht sofort auf die LAN-Karte zurück schließen kann. Ziel ist es somit eine Combobox oder Listbox mit den gefundenen MAC-Adressen SOWIE der Netzwerkartenbezeichnung zufüllen, um dem Benutzer die Möglichkeit zu geben die gewünschte MAC-Adresse auswählen.

z.B:
gefundene MAC-Adressen:
1. 00-70-1A-xx-xx-xx - Cisco-Linksys, LLC
2. 00-30-05-xx-xx-xx - Fujitsu Siemens Computers



Oder bieten die verwendeten TLanaEnum und TNCB Datentypen, bereits eine Variable in der der Titel des aktuell angewählten LAN-Adapters zwischen gespeichert wird?


Vergebliches Suchen in diversen Delphi-Foren sowie Google brachte keine Antwort. Ich würde mich über eine hilfreiche Antwort freuen.

Gruß
Frettchenstall


Delphi-Quellcode:
// Pleace notice, I called the Lan Adapters within a function Lana
// Outside a function I named them Adapter
FUNCTION GetMacAddress(AdapterID : Integer) : String;
TYPE
 TAdapterStatusA = record
   Adapt : TAdapterStatus;
   NameBuff : array[0..30] of TNameBuffer;
 end;
VAR
  NCB          :TNCB;                  //Network Control Block
  ReturnCode   :Char;                  //Retun Code
  AdapterStatus :TAdapterStatus;
BEGIN
 //Clear NCB Structure
 FillChar( NCB, SizeOf(NCB), 0 );

 //Programm NBC to fulfill a reset. It doublecheck if the Lana is present.
 //Can be removed, when used with GetAdapters.
 NCB.ncb_command := Char(NCBRESET);
 NCB.ncb_lana_num := Char(AdapterID);

 //Process NCB to NetBios
 ReturnCode := NetBios(@NCB);

 //Check if query was successfull, if returnCode = #0
 IF ReturnCode <> #0 THEN
 BEGIN
  // Return the negative returncode
  // Error check would be "if ReturnCode[0]='-' Then..."
  Result:=Char(Ord(ReturnCode)*-1);
  Exit;
 END;

 //Clear NCB Structure
 FillChar( NCB, SizeOf(NCB), 0 );

 //Programm NBC to ask for the MAC associated with the LanaID
 NCB.ncb_command := Char(NCBASTAT);
 NCB.ncb_lana_num := Char(AdapterID);
 NCB.ncb_buffer  := @AdapterStatus;
 NCB.ncb_length  := SizeOf(AdapterStatus);
 StrCopy(NCB.ncb_callname, '* ' );

 //Process NCB to NetBios
 ReturnCode := Netbios( @NCB );

 //Check if query was successfull, if returnCode = #0
 IF ReturnCode <> #0 THEN
 BEGIN
  // Return the negative returncode
  Result:=Char(Ord(ReturnCode)*-1);
  Exit;
 END;

 //Return formated MAC
 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 GetAdapter
//=================
//
// This function will return the the total nummber of all lana's istalled
// and a unique the id of each lana.
// E.g. on a system containing lana's 0, 2 and 3, a structure with
// length =3, lana[0]=0, lana[1]=2 and lana[2]=3 will be returned.
FUNCTION GetAdapters: TLanaEnum;
VAR
  NCB       :TNCB;                  //Network Control Block
  LanaEnum  :TLanaEnum;             //Enumeration of Lan Adapters
  ReturnCode :Char;                  //Retun Code
BEGIN
 //Clear NCB Structure
 FillChar(NCB, SizeOf(NCB), 0);
 //Clear LanaEnum Stucture
 FillChar(LanaEnum, SizeOf(TLanaEnum), 0);

 //Programm NBC to ask for the number of Lana's
 NCB.ncb_Command := CHAR(NCBENUM);
 NCB.ncb_buffer := @LanaEnum;
 NCB.ncb_length := Sizeof(LanaEnum);

 //Ask NetBios
 ReturnCode := NetBios(@NCB);

 //Check if query was successfull, if returnCode = #0
 IF ReturnCode <> #0 THEN
 BEGIN
  LanaEnum.Length := CHAR(0);
  LanaEnum.Lana[0] := ReturnCode;
 END;

 // Return valid LanaEnum Structure
 Result := LanaEnum;
END;


PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR
 L_Enum :TLanaEnum;
 i     :INTEGER;
BEGIN
 L_Enum := GetAdapters;                       { enumerate lanas for WIN NT }
 IF L_Enum.Length = '0' THEN
 BEGIN
  Exit;
 END;

 FOR i:= 0 TO (BYTE(L_Enum.Length) - 1) DO
 BEGIN
  ListBox1.Items.Add(getMACaddress(BYTE(L_Enum.Lana[i])));
 END;
END;

Der.Kaktus 18. Aug 2009 17:12

Re: MAC-Adresse einlesen plus Bezeichnung des LAN-Adapters
 
Schau mal bei den Schweizern..die ham sowas ;-) Mac-Adresse
[Edit] Schw+e+izern[/EDIT]

Frettchenstall 19. Aug 2009 10:24

Re: MAC-Adresse einlesen plus Bezeichnung des LAN-Adapters
 
Auf welche Variable muss ich denn zugreifen, damit ich die LAN-Adapterbezeichnung erhalte?
Und wie genau mache ich das?

Frettchenstall 20. Aug 2009 08:19

Re: MAC-Adresse einlesen plus Bezeichnung des LAN-Adapters
 
Vielen Dank, das Problem hat sich soweit gelöst.

HeikoAdams 20. Aug 2009 08:45

Re: MAC-Adresse einlesen plus Bezeichnung des LAN-Adapters
 
Zitat:

Zitat von Frettchenstall
Vielen Dank, das Problem hat sich soweit gelöst.

Verrate uns doch bitte, wie es sich gelöst hat - oder sollen wir etwa unwissend sterben? 8)

Frettchenstall 21. Aug 2009 08:34

Re: MAC-Adresse einlesen plus Bezeichnung des LAN-Adapters
 
Nein, es soll ja niemand unwissend sterben müssen! :zwinker:

Da die Unterstützung von Delphi zum Zugriff auf das Windows System sehr dürftig ist, habe ich die WMI (Windows Management Instrumentation) benutzt. Dort ließen sich mittels der Klasse Win32_NetworkAdapter alle benötigten Informationen auslesen. Also die von mir benötigte MAC-Adresse genauso wie der ProductName (also der LAN-Adapterbezeichnung des Herstellers).

Win32_NetworkAdapter


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:46 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