![]() |
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. |
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
|
Re: MAC Adresse aller Netzwerk Karten ermitteln
|
Re: MAC Adresse aller Netzwerk Karten ermitteln
|
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; |
Re: MAC Adresse aller Netzwerk Karten ermitteln
Hallo,
was ist das? Zitat:
es wäre nett wenn du die uses .... Zeile mitkopieren könntest. Danke Rainer |
Re: MAC Adresse aller Netzwerk Karten ermitteln
Zitat:
|
Re: MAC Adresse aller Netzwerk Karten ermitteln
@runger: Hab die Uses ergänzt.
|
Re: MAC Adresse aller Netzwerk Karten ermitteln
Hi,
vielen Dank. Aber ich glaube ich stelle mich grad ein bisschen dumm an.
Delphi-Quellcode:
Wie rufe ich die auf.
function GetMacAddresses(const Machine: string; const Addresses: TStrings): Integer;
Ich will im Prinzip für jeden Lan Adapter die MAc Adresse und ev sogar die IP dazu. ( ev. noch die Bezeichnung ) Danke. |
Re: MAC Adresse aller Netzwerk Karten ermitteln
Delphi-Quellcode:
var
macs: TString; IPAdr: String; ... macs := TStringList.Create; GetMacAddresses( GetLocalComputerName, macs); IPAdr := GetIPAddress( GetLocalComputerName); |
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 |
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 |
Re: MAC Adresse aller Netzwerk Karten ermitteln
Zitat:
|
Re: MAC Adresse aller Netzwerk Karten ermitteln
Oh Danke.
Habe nun die GetIPs genommen. ![]() 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 |
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 |
Re: MAC Adresse aller Netzwerk Karten ermitteln
Delphi-Quellcode:
Was gibt Dir denn LanAdaptorCount zurück, nur die Interfaces die "online" sind oder alle.
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; Wenn es funktioniert, der Hinweis wurde schon mal weiter oben gepostet. Grüße Klaus |
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. |
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 |
Re: MAC Adresse aller Netzwerk Karten ermitteln
Danke.
IPconfig / all ist alles ok. Selbst mit der JclSysInfo-GetMacAddresses. bekomme ich nur die aktiven. |
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 -> ![]() [edit1] Und hier ein Beipspiel wie man sie verwendet. ![]() ![]() In den threads findest Du auch die dll und auch eine iphlpapi.pas [/edit1] [edit2] ein Beispiel mit GetIfTable -> ![]() und noch eines -> ![]() [/edit2] Grüße Klaus |
Re: MAC Adresse aller Netzwerk Karten ermitteln
Danke.
Stehe nur a bisserl auf dem Schlauch wie ich die Anzuwenden habe!! Danke. |
Re: MAC Adresse aller Netzwerk Karten ermitteln
habe Dir zu meinem vorherigen Post noch etwas hinzugeschrieben
Grüße Klaus |
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. |
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. |
Re: MAC Adresse aller Netzwerk Karten ermitteln
Zitat:
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. |
Re: MAC Adresse aller Netzwerk Karten ermitteln
Zitat:
und die Funktion kann die Mac Adresse nicht ermitteln. Grüße Klaus |
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. |
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; |
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. |
Re: MAC Adresse aller Netzwerk Karten ermitteln
|
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 |
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. |
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