Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi MAC Adresse aller Netzwerk Karten ermitteln (https://www.delphipraxis.net/65923-mac-adresse-aller-netzwerk-karten-ermitteln.html)

renekr 22. Mär 2006 12:20


MAC Adresse aller Netzwerk Karten ermitteln
 
Hi,
Ich weiß zwar das dasThema MAC Adressen schon oft in der DP erwähnt worden ist,aber ich habe noch niergends etwas passendes gefunden wo mir die Mac Adressen genau ausliest wenn mehrere Karten eingebaut sind.

Habe dann keinen Bezug zum Name oder zur IP.
Hat da jemand was n Peto?

Danke.

mkinzler 22. Mär 2006 12:23

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
In der movisuellen JCL ( Jedi Component Library) gibt es eine Unit JclSysInfo. Darin ist eine Funktion
Delphi-Quellcode:
 GetMacAddresses
.

Klaus01 22. Mär 2006 12:29

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
hier ist es auch beschrieben
-> http://www.infojet.cz/program/delphi/tips/tip0023.html

Grüße
Klaus

Christian Seehase 22. Mär 2006 20:49

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Moin Rene,

Du kannst auch mal nach Hier im Forum suchenGetAdaptersInfo bzw. Hier im Forum suchenGetPerAdapterInfo suchen.

SirThornberry 22. Mär 2006 21:57

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
ich benutze dafür folgende funktionen:
Delphi-Quellcode:
uses
  [...], nb30, [...]

function GetAdapterInfo(Lana: Char): String;
var
  Adapter: 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(Adapter, SizeOf(Adapter), 0);
  NCB.ncb_buffer := @Adapter;
  NCB.ncb_length := SizeOf(Adapter);
  if Netbios(@NCB) <> Char(NRC_GOODRET) then
  begin
    Result := 'mac not found';
    Exit;
  end;
  Result :=
    IntToHex(Byte(Adapter.adapter_address[0]), 2) + '-' + 
    IntToHex(Byte(Adapter.adapter_address[1]), 2) + '-' + 
    IntToHex(Byte(Adapter.adapter_address[2]), 2) + '-' + 
    IntToHex(Byte(Adapter.adapter_address[3]), 2) + '-' + 
    IntToHex(Byte(Adapter.adapter_address[4]), 2) + '-' + 
    IntToHex(Byte(Adapter.adapter_address[5]), 2);
end;

{==============================================================================}

function GetMacAddressCount: Byte;
var AdapterList: ^TLanaEnum;
    NCB: TNCB;
begin
  new(AdapterList);
  FillChar(NCB, SizeOf(NCB), 0);
  NCB.ncb_command := Char(NCBENUM);
  NCB.ncb_buffer := PChar(AdapterList);
  NCB.ncb_length := SizeOf(AdapterList^);
  Netbios(@NCB);
  Result := Byte(AdapterList.length);
  dispose(AdapterList);
end;

function GetMACAddress(ANewworkcardIndex: Byte = 0): string;
var AdapterList: TLanaEnum;
  NCB: TNCB;
begin
  FillChar(NCB, SizeOf(NCB), 0);
  AdapterList.length := char(0);
  NCB.ncb_command := Char(NCBENUM);
  NCB.ncb_buffer := @AdapterList;
  NCB.ncb_length := SizeOf(AdapterList);
  Netbios(@NCB);
  if Byte(AdapterList.length) > ANewworkcardIndex then
    Result := GetAdapterInfo(AdapterList.lana[ANewworkcardIndex])
  else
    Result := 'mac not found';
end;

runger 23. Mär 2006 05:22

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Hallo,

was ist das?
Zitat:

movisuellen JCL
Hallo Thornberry,
es wäre nett wenn du die uses .... Zeile mitkopieren könntest.

Danke Rainer

mkinzler 23. Mär 2006 05:43

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Zitat:

was ist das?
Zitat:
movisuellen JCL
DIE Jcl besteht zum Unterschied zur JVCL nnicht aus installierbaren Komponenten, sondern nur aus Hilfsklassen oder -Proceduren/-Funktionen.

SirThornberry 23. Mär 2006 06:03

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
@runger: Hab die Uses ergänzt.

renekr 23. Mär 2006 08:35

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Hi,
vielen Dank.
Aber ich glaube ich stelle mich grad ein bisschen dumm an.
Delphi-Quellcode:
function GetMacAddresses(const Machine: string; const Addresses: TStrings): Integer;
Wie rufe ich die auf.
Ich will im Prinzip für jeden Lan Adapter die MAc Adresse und ev sogar die IP dazu. ( ev. noch die Bezeichnung )


Danke.

mkinzler 23. Mär 2006 08:39

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Delphi-Quellcode:
var
    macs: TString;
    IPAdr: String;
...
  macs := TStringList.Create;
  GetMacAddresses( GetLocalComputerName, macs);  
  IPAdr := GetIPAddress( GetLocalComputerName);

renekr 23. Mär 2006 08:50

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Cool .
Danke.

Habs grad getestet aber ich bekomme nur 1 MAC ( obwohl 3 Adapter drin sind ) raus oder 2 mal die gleiche an einem anderen PC.

danke

renekr 29. Mär 2006 10:46

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Hi,

Also i habs nun hinbekommen das ich alle Mac Adressse herausekomme ,aber nur die wo auch connected sind?
ist das normal?

Die Procedure GetIPAdresses in den JCL kann i nicht aufrufen?

mfg

mkinzler 29. Mär 2006 10:48

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Zitat:

Die Procedure GetIPAdresses in den JCL kann i nicht aufrufen?
Die gibts auch nur unter Linux.

renekr 29. Mär 2006 14:46

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Oh Danke.

Habe nun die GetIPs genommen.
Eigene (Internet)IP rausfinden

Aber wie gesagt da bekomme ich auch nur die IP heraus von den Adaptern wo aktiv sind also Connect haben.
Bei IP ist es ja gut aber bei MACs nicht,da könnte oder will ich alle MAcs wo im System sind.
Danke

renekr 3. Apr 2006 08:50

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Hi,
hat den niemand eine Idee.
Bin am verzweifeln hier.

Wie gesagt die Funktionen erkennen nur die Karten wenn diese connected sind.

danke

Klaus01 3. Apr 2006 09:28

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Delphi-Quellcode:
unit MACAddress;

interface

uses SysUtils;

type
  TMACAddress = packed array[0..5] of Byte;
 
  ENetBiosError = class(Exception);

function LanAdapterCount : Integer;

function GetMacAddress(AdapterNum: Integer):TMACAddress;


implementation

uses NB30, Windows;

resourcestring
  sNetBiosError = 'NetBIOS error %d';

type
  TAStat = record
    Adapt   : TAdapterStatus;
    NameBuff : array[0..30] of TNameBuffer;
  end;

function LanAdapterCount : Integer;
var
  Ncb : TNCB;
  uRetCode : Char;
  lEnum : TLanaEnum;
begin
  FillChar( NCB, SizeOf(NCB), 0 );
  with NCB do begin
    ncb_command := Char( NCBENUM );
    ncb_buffer := @lEnum;
    ncb_length := SizeOf(lEnum);
  end;
  uRetCode := Netbios( @Ncb );
  if uRetCode <> #0 then
   raise Exception.CreateFmt( sNetBIOSError,
                                      [Ord(uRetCode)]);
  Result := Ord(lenum.length);
end;

function GetMacAddress(AdapterNum:Integer):TMACAddress;
var
  Ncb : TNCB;
  uRetCode : Char;
  J : Integer;
  Adapter : TAStat;
begin
  FillChar( NCB, SizeOf(NCB), 0 );
  with NCB do begin
    ncb_command := Char(NCBRESET);
    ncb_lana_num := Char( AdapterNum );
  end;
  uRetCode := Netbios( @Ncb );
  if uRetCode <> #0 then
   raise Exception.CreateFmt(sNetBIOSError,
                                     [Ord(uRetCode)]);
  FillChar( NCB, SizeOf(NCB), 0 );
  with NCB do begin
    ncb_command := Char(NCBASTAT);
    ncb_lana_num := Char( AdapterNum );
    StrCopy( ncb_callname, '*                ' );
    ncb_buffer := @Adapter;
    ncb_length := sizeof(Adapter);
  end;
  uRetCode := Netbios( @Ncb );
  if uRetCode <> #0 then
   raise Exception.CreateFmt(sNetBIOSError,
                                     [Ord(uRetCode)]);
  for J := 0 to 5 do
   Result[J] := Ord( Adapter.Adapt.Adapter_address[J]);
end;
Was gibt Dir denn LanAdaptorCount zurück, nur die Interfaces die "online" sind oder alle.

Wenn es funktioniert, der Hinweis wurde schon mal weiter oben gepostet.

Grüße
Klaus

renekr 3. Apr 2006 09:39

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Hi,
Erstmal Dank.

Habe ja schon das gesamt Forum bgesucht und alles getestet.

Leider bekomme ich nur Lan Count 1 raus.

Wenn ich meine Wlan aktiviere das er connected ist habe ich 2.

Will aber immer alle auslesen ( Soll so ein Inventory Tool geben ) .

Die Adapter sind alle Enabled nur nicht connectd.


PS: Wie handle ich die TMAcAdress ? TMACAddress = packed array[0..5] of Byte;

:wall:
Danke.

Klaus01 3. Apr 2006 10:03

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
die Mac-Adresse besteht aus 5 Byte.
Die Mac-Adresse die Du kennst, siehst Du
als Hex dargestellt.
Wenn Du die 5 Byte , byteweise nach Hex wandelst
bekommst Du die Mac-Adresse wie Du sie gewohnt bist.

Siehst Du denn die Mac-Adresse Deines WLAN Adpaters
wenn er nicht connected ist mit ipconfig /all
in der Console.

Grüße
Klaus

renekr 3. Apr 2006 10:06

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Danke.

IPconfig / all ist alles ok.

Selbst mit der JclSysInfo-GetMacAddresses.
bekomme ich nur die aktiven.

Klaus01 3. Apr 2006 10:38

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
vielleicht hilft Dir ja iphlpapi.dll aus der Klemme
da gibt es die Funktion GetIfTable die alle Interfaces
auflisten soll.
Habe ich aber nicht selbst ausprobiert.
Hier der Link zu Doku -> http://windowssdk.msdn.microsoft.com..._reference.asp

[edit1]
Und hier ein Beipspiel wie man sie verwendet.
http://www.delphipraxis.net/internal...ct.php?t=42992
http://www.delphipraxis.net/internal...light=iphlpapi
In den threads findest Du auch die dll und auch eine iphlpapi.pas

[/edit1]

[edit2]
ein Beispiel mit GetIfTable -> http://www.delphipraxis.net/internal...t.php?p=205634
und noch eines -> http://www.delphi-forum.de/viewtopic.php?t=1536
[/edit2]

Grüße
Klaus

renekr 3. Apr 2006 12:32

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Danke.

Stehe nur a bisserl auf dem Schlauch wie ich die Anzuwenden habe!!

Danke.

Klaus01 3. Apr 2006 13:05

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
habe Dir zu meinem vorherigen Post noch etwas hinzugeschrieben

Grüße
Klaus

renekr 3. Apr 2006 14:13

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Hi,
danke.

habe die ausm Delphi Forum mal getestet und geht soweit.

Habe auch gleich einen Fehler festgestellt das die MAC Adresse zukurz ist.

Danke.

renekr 8. Apr 2006 13:55

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Hi,

erstmal Danke.
Habe nun alles eingebeunden und es geht.

nun habe ich noch eine Spezielle Frage:

Ich bekomme an meinem Laptop 4 NICs zurück.
Mit Loopback usw.

Das is kein thema.

Aber ist das die Korrekte Reihenfolge die man im Windows unter :
Netzerkeinstellungen-Advanced -Advanced Settings unter Adapter und Bindings einstellen kann?
Dort kann man ja die Reihenfolge der Adapter ändern.
Bei mir sind eigentlich max 3 in den Pcs drin ( normal 2 ) und mich würde es Interessieren die Adapter in der Korrekten Windows Reihenfolge auslesen zu können.

Danke.

ich.online 27. Apr 2007 14:20

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Zitat:

Zitat von SirThornberry
ich benutze dafür folgende funktionen:
Delphi-Quellcode:
uses
  [...], nb30, [...]


Da funktioniert bei mir etwas nicht.

Ich habe im Notebook eine feste Karte und eine Wireless.

GetMACAdress liefert die MAC der Wirelesskarte
GetMacAddressCount liefert 1
GetMACAddress(0) liefert die MAC der Wirelesskarte
GetMACAddress(1) liefert mac not found

Die feste Karte ist aktiv, aber kein Kabel dran.

Gruß

K.-D.

Klaus01 27. Apr 2007 14:23

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Zitat:

Zitat von ich.online
Zitat:

Zitat von SirThornberry
ich benutze dafür folgende funktionen:
Delphi-Quellcode:
uses
  [...], nb30, [...]


Da funktioniert bei mir etwas nicht.

Ich habe im Notebook eine feste Karte und eine Wireless.

GetMACAdress liefert die MAC der Wirelesskarte
GetMacAddressCount liefert 1
GetMACAddress(0) liefert die MAC der Wirelesskarte
GetMACAddress(1) liefert mac not found

Die feste Karte ist aktiv, aber kein Kabel dran.

Gruß

K.-D.

Wenn kein Kabel dran ist, ist das netbios Protokol unten
und die Funktion kann die Mac Adresse nicht ermitteln.

Grüße
Klaus

ich.online 27. Apr 2007 14:49

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Hi Klaus,

das ist dumm. Somit kann ich das für den Kopierschutz vergessen.

Wenn ich jetzt was auf einem Notebook installiere, wenn ein Kabel dran ist, wird die App die Adresse ja nicht mehr finden, wenn das Kabel weg ist.

Sonst vielleich jemand eine Idee, wie man einen Rechner über die Hardware eindeutig identifiziert?


Gruß

K.-D.

Gehstock 27. Apr 2007 15:11

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
glaube luckie hatte mal was gebastelt wo man bios infos auslesen kann
unter anderen die "Universal Unique ID"
die sieht so aus und ist auch immer anders
CC 28 4A B1 E8 45 DA 11 A4 B1 1B 87 B0 89 E7 6B

oder über die CPU ID

Delphi-Quellcode:
const
   ID_BIT = $200000; // EFLAGS ID bit
type
TCPUID = array[1..4] of Longint;
function IsCPUID_Available : Boolean; register;
   asm
    PUSHFD {direct access to flags no possible, only via stack}
    POP EAX {flags to EAX}
    MOV EDX,EAX {save current flags}
    XOR EAX,ID_BIT {not ID bit}
    PUSH EAX {onto stack}
    POPFD {from stack to flags, with not ID bit}
    PUSHFD {back to stack}
    POP EAX {get back to EAX}
    XOR EAX,EDX {check if ID bit affected}
    JZ @exit {no, CPUID not availavle}
    MOV AL,True {Result=True}
    @exit:
  end;

function GetCPUID: TCPUID; assembler; register;
    asm
    PUSH   EBX        {Save affected register}
    PUSH   EDI
    MOV    EDI,EAX    {@Resukt}
    MOV    EAX,1
    DW     $A20F      {CPUID Command}
    STOSD               {CPUID[1]}
    MOV    EAX,EBX
    STOSD              {CPUID[2]}
    MOV    EAX,ECX
    STOSD              {CPUID[3]}
    MOV    EAX,EDX
    STOSD              {CPUID[4]}
    POP    EDI        {Restore registers}
    POP    EBX
    end;

function GetCPUInfo: string;
  var
    CPUID: TCPUID;
        I: Integer;
  begin
    for I:=Low(CPUID) to High(CPUID) do CPUID[I]:=-1;
    if IsCPUID_Available then
      begin
         CPUID:= GetCPUID;
         Result:= IntToHex(CPUID[1], 8)
                 +'-'+ IntToHex(CPUID[2], 8)
                 +'-'+ IntToHex(CPUID[3], 8)
                 +'-'+ IntToHex(CPUID[4], 8);
      end
    else Result:='CPUID not available';
  end;

ich.online 27. Apr 2007 15:46

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Ist die Universal Unique ID denn immer vorhanden? Wenn ja, gibt es dafür irgendwo Quellcode?
Die CPU-ID ist ja fast nie da. Darum komme ich damit ja auch nicht weiter.

Ich habe das bisher immer über die HDID gemacht. Das reichte ansich aus. Wenn es auch leicht zu manipulieren ist. Ein normaler Endanwender kann das aber nicht. Nur jetzt wollte ich das unter Linux mit Wine laufen lassen. Da gibt es keine SerialID. Man kann ja wohl auch die harte ID der Platten auslesen. Hab leider keinen Schimmer wie.

Gruß

K.-D.

Gehstock 27. Apr 2007 16:04

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Bios Help

damit kannst du die Bios Universal Unique ID auslesen

markusj 27. Apr 2007 16:04

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Nur so am Rande ... MAC als Kopierschutz kannst du vergessen, die kann man mit ein paar Zeilen Code ändern ...
=> Künstliche MAC bei der Registrierung angeben und schon kann jeder mit dieser MAC dein Programm nutzen.

mfG
Markus

ich.online 27. Apr 2007 16:23

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Danke.

Ist die Univesal Unique ID in jedem Bios vorhanden?

Unter Windows funktioniert das, bei Linux unter Wine gibt es eine Fehlermeldung:

Error on reading BIOS!
Datei nicht gefunden


Gruß

K.-D.

DGL-luke 27. Apr 2007 16:27

Re: MAC Adresse aller Netzwerk Karten ermitteln
 
Hallo, ist ja wohl ziemlich klar dass Wine nicht alle low-level sachen unterstützt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz