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 Aktiven Netzwerkadapter bestimmen (https://www.delphipraxis.net/67160-aktiven-netzwerkadapter-bestimmen.html)

dbdeath74 10. Apr 2006 14:28


Aktiven Netzwerkadapter bestimmen
 
Hallo,

zur Erfassung unserer Hardware schreibe ich gerade ein kleines Tool.
Nun bin ich bei den Netzwerkadaptern auf ein kleines Problem gestossen.

Die Macadressen aller aktiven Adapter bekomme ich mit GetMAcAddress aus der JCL.
Mit GetAdapterInfo bekommme ich auch noch weitere Informationen wie Namen usw.

Kann ich irgendwie bestimmen welcher Netzwerkadapter der wirklich aktive ist?

Beispiel:
Auf einem Notebook gibt es eine LAN Verbindung, eine WLAN Verbindung und von mir aus noch 2 Netzwerkadapter von VMWare ....
Mich interessiert eigentlich nur die aktive LAN Verbindung, die in der Domäne drin hängt, und über die der momentane Netzwerkverkehr läuft.

Kennt jemand eine Möglichkeit den primären Netzwerkadapter herauszufinden?
Ich dachte eigentlich bisher es ist der erste aktive den ich finde, nun musste ich leider feststellen das sich zum Beispiel die VMWare Adapter als erstes in die Liste hängen .. :(

Bin über jeden Rat dankbar.

gruß dbdeath74

Heffalump 10. Apr 2006 14:51

Re: Aktiven Netzwerkadapter bestimmen
 
Du könntest die Gateway Adresse auslesen und anhand dieser ein Zuordnung treffen.

dbdeath74 12. Apr 2006 13:24

Re: Aktiven Netzwerkadapter bestimmen
 
hmmm die Gateway adresse hilft mir hier nicht weiter.

über die IP kann ich vielleicht noch die VMWare Adapter rauskicken weil die eine lokale IP haben.

Aber LAN und WLAN können dieselbe Gateway haben.

Man muss doch irgendwie testen können welches der primäre Adapter ist :(

Gruß dbdeath74

toyoman 9. Mai 2008 13:30

Re: Aktiven Netzwerkadapter bestimmen
 
Ok ist zwar schon Jahre her aber die Frage kommt ja immer mal wieder auf. Wie kann ich den aktiven Netzwerkadapter finden?

Hab da mal (auch vor Jahren) was gemacht um den ersten Adapter auszulesen (der aktive):
-firstadapter ist eine String Variable

Delphi-Quellcode:
    {---**--LOG----SCHREIBEN---------------------**----------}
     logfileschreiben('search for network adapters...');
    {---**--LOG----SCHREIBEN---------------------**----------}
 {------Windows 2000/XP ersten Adapter finden und speichern)--------------------------------}
        reg := TRegistry.Create;
        reg.Access :=KEY_READ;
        reg.rootkey:=HKEY_LOCAL_MACHINE;
        reg.OpenKey('SYSTEM\Setup\AnswerFileMap', false);
        if reg.ValueExists('Adapter1') then
        begin
             firstadapter:=reg.ReadString('Adapter1');
        end else
        begin
             firstadapter:='unknown';
        end;
                  reg := TRegistry.Create;
                  reg.Access :=KEY_READ;
                  reg.rootkey:=HKEY_LOCAL_MACHINE;
                  reg.OpenKey('SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\'+firstadapter, false);
                  if reg.ValueExists('DHCPServer') then
                  begin
                      dhcpserver:=reg.ReadString('DHCPServer');
                  end;
                  if reg.ValueExists('EnableDHCP') then
                  begin
                      enabledhcp:=inttostr(reg.ReadInteger('EnableDHCP'));
                  end;
                  if reg.ValueExists('DHCPDefaultGateway') then
                  begin
                      ReadREG_MULTI_SZ(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\'+firstadapter, 'DHCPDefaultGateway', Memo1.Lines);
                      dhcpdefaultgateway:='DHCP: '+memo1.lines.Strings[0];
                  end;
        reg.closekey;
        reg.free;

SirThornberry 9. Mai 2008 14:00

Re: Aktiven Netzwerkadapter bestimmen
 
Liste der Anhänge anzeigen (Anzahl: 1)
uj, nicht über die Registry. Dafür gibt es Api Funktionen. Zudem funktioniert deine Funktion nicht. Bei mir gibt es den Schlüssel zum Beispiel gar nicht in der Registry. Zudem wird bei dir nicht geprüft ob OpenKey fehl schlegt. Dadurch wird auf den Value im falschen Zweig geprüft wenn OpenKey bereits fehl schlägt

Der "aktive" Adapter wird durch die Metric bestimmt.
Es gibt eine Routingtabelle welche festlegt über welche Leitung welche Anfragen gehen. Gibt es mehrere mögliche Leitungen wird über die Metric die Priorität festgelegt.

im Windows kannst du mit "route print" die dir aktuellen Ruten anzeigen lassen.
Für die Apifunktionen hab ich mal was in den Anhang gepackt.

toyoman 9. Mai 2008 14:08

Re: Aktiven Netzwerkadapter bestimmen
 
tolle Sache, aber das Programm zeigt mir jetzt ja den aktuell aktiven Netzwerkadapter doch auch wieder nicht an?

Zitat:

Zitat von SirThornberry
uj, nicht über die Registry. Dafür gibt es Api Funktionen. Zudem funktioniert deine Funktion nicht. Bei mir gibt es den Schlüssel zum Beispiel gar nicht in der Registry. Zudem wird bei dir nicht geprüft ob OpenKey fehl schlegt. Dadurch wird auf den Value im falschen Zweig geprüft wenn OpenKey bereits fehl schlägt

Der "aktive" Adapter wird durch die Metric bestimmt.
Es gibt eine Routingtabelle welche festlegt über welche Leitung welche Anfragen gehen. Gibt es mehrere mögliche Leitungen wird über die Metric die Priorität festgelegt.

im Windows kannst du mit "route print" die dir aktuellen Ruten anzeigen lassen.
Für die Apifunktionen hab ich mal was in den Anhang gepackt.


SirThornberry 9. Mai 2008 14:12

Re: Aktiven Netzwerkadapter bestimmen
 
richtig. Wie ich bereits schieb wird die "aktive" Verbindung über die Metric bestimmt.
Zudem gibt es ja keine wirkliche aktive Verbindung. Denn welche Verbindung verwendet wird hängt ja auch vom Ziel ab. Wenn ich zwei Netzwerkkarten habe welche beide in verschiedene Netze gehen wird je nach Ziel die eine ander andere verwendet. Und nur wenn beide das gleiche Netz haben wird durch die Metric bestimmt welche bevorzugt wird. (Metric ist die letzte Spalte bei Routingtabelle in meinem Beispielprogramm)

toyoman 9. Mai 2008 14:15

Re: Aktiven Netzwerkadapter bestimmen
 
ok für diesen Fall macht das Sinn. Aber wenn du in einem Laptop einen LAN Adapter und einen WLAN Adapter hast ist meist nur einer aktiv und dementsprechend mit einer IP etc. versorgt.
Da muss man nun wissen welcher ist es um den richtigen Adapter auszulesen und evtl. die dazugehörigen Parameter.

Zitat:

Zitat von SirThornberry
richtig. Wie ich bereits schieb wird die "aktive" Verbindung über die Metric bestimmt.
Zudem gibt es ja keine wirkliche aktive Verbindung. Denn welche Verbindung verwendet wird hängt ja auch vom Ziel ab. Wenn ich zwei Netzwerkkarten habe welche beide in verschiedene Netze gehen wird je nach Ziel die eine ander andere verwendet. Und nur wenn beide das gleiche Netz haben wird durch die Metric bestimmt welche bevorzugt wird. (Metric ist die letzte Spalte bei Routingtabelle in meinem Beispielprogramm)


SirThornberry 9. Mai 2008 14:18

Re: Aktiven Netzwerkadapter bestimmen
 
War das jetzt eine Zustimmung oder Frage? :gruebel:

toyoman 9. Mai 2008 14:31

Re: Aktiven Netzwerkadapter bestimmen
 
beides :))
Wünsche schöne Pfingsten!

Zitat:

Zitat von SirThornberry
War das jetzt eine Zustimmung oder Frage? :gruebel:


hathor 10. Mai 2008 06:06

Re: Aktiven Netzwerkadapter bestimmen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich würde den Traffic/sec der Netzwerkadapter miteinander vergleichen. Der aktive Netzwerkadapter hat natürlich den höchsten Wert.

SirThornberry 10. Mai 2008 08:07

Re: Aktiven Netzwerkadapter bestimmen
 
letztendlich muss der Fragesteller wissen was für ihn "aktiv" im Zusammenhang mit dem Netzwerkadapter heißt. Das sicherste ist einfach die Routingtabelle auszulesen. Denn wenn er für das eigene Neztwerk den Netzwerkadapter will ist dieser durch die Maske identifizierbar.
Denn stelle man sich vor das es noch einen weiteren Netzwerkadapter gibt mit dem man sich ins Internet einwählt und große Daten heruntergeladen hat, so würde der falsche bestimmt wenn man nach dem Traffic geht.

Reinhard Kern 10. Mai 2008 14:53

Re: Aktiven Netzwerkadapter bestimmen
 
Zitat:

Zitat von hathor
Ich würde den Traffic/sec der Netzwerkadapter miteinander vergleichen. Der aktive Netzwerkadapter hat natürlich den höchsten Wert.

Hallo,

was ist schon natürlich - ich hatte schon oft PCs in einer Domäne, die mit einem 2. Adapter mit einer Unix-Workstation per NFS verbunden waren. Da sie der Workstation zuarbeiten, ist der Traffic im Unix-Netz weit höher als im Windows-Netz. Nach der ursprünglichen Fragestellung ist der Adapter gefragt, über den der DC (der eigenen Domäne!) erreichbar ist, das kann ohne weiteres der mit dem geringsten Traffic sein.

Gruss Reinhard

SirThornberry 10. Mai 2008 23:53

Re: Aktiven Netzwerkadapter bestimmen
 
genau so sehe ich das auch. Also ist der sicherste Weg die Routingtabelle zu nehmen und da zu schauen wo die Packete hinn gehen. Denn genau so funktionieren ja auch anfragen. Es wird in der Routingtabelle der Eintrag gesucht der mit der Ziel-IP übereinstimmt und dann wird über diesen Adapter gesendet.

toyoman 11. Mai 2008 08:56

Re: Aktiven Netzwerkadapter bestimmen
 
Zitat:

Zitat von SirThornberry
genau so sehe ich das auch. Also ist der sicherste Weg die Routingtabelle zu nehmen und da zu schauen wo die Packete hinn gehen. Denn genau so funktionieren ja auch anfragen. Es wird in der Routingtabelle der Eintrag gesucht der mit der Ziel-IP übereinstimmt und dann wird über diesen Adapter gesendet.

hallo jungens

is ja gut, geniesst jetzt erstmal euer pfingst weekend :)

aber interessante infos, danke!

RWarnecke 11. Mai 2008 10:16

Re: Aktiven Netzwerkadapter bestimmen
 
Ich hätte da auch noch einen Vorschlag. Schaue Dir doch mal MSDN-Library durchsuchenGetIfTable an. Damit kannst Du abfragen, ob ein Netzwerkadapter vom Rechner angeschlossen ist oder nicht.

SirThornberry 11. Mai 2008 10:24

Re: Aktiven Netzwerkadapter bestimmen
 
Nicht angeschlossene Netzwerkadapter tauchen gar nicht erst in der Routingtabelle auf weil über diese nicht geroutet werden kann ;-) (wenn ich nicht irre wird die Funktion auch in meinem Beispielprogramm verwendet)

RWarnecke 11. Mai 2008 10:48

Re: Aktiven Netzwerkadapter bestimmen
 
Zitat:

Zitat von SirThornberry
(wenn ich nicht irre wird die Funktion auch in meinem Beispielprogramm verwendet)

Wird in Deinem Beispielprogramm verwendet. Ich hatte es mir aber noch nicht angeschaut, wo ich den Beitrag geschrieben habe.


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