Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Namen der Netzwerk-Verbindungen auslesen (https://www.delphipraxis.net/170122-namen-der-netzwerk-verbindungen-auslesen.html)

Helmi 1. Sep 2012 12:43

Namen der Netzwerk-Verbindungen auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe diesen Code gefunden um die MAC-Adressen der Netzwerkkarten auszulesen.
Nur wie kann ich nun die Namen der Verbindungen auslesen?

Bei mir heisst eine Verbindung "LAN-Verbindung" (siehe Bild)

sx2008 1. Sep 2012 14:39

AW: Namen der Netzwerk-Verbindungen auslesen
 
Eigentlich genau gleich, wie du die MAC-Adresse gelesen hast.
Das Property heisst dann anstatt 'MACAdress' einfach 'Name'.
Weitere interessante Properties sind
  • AdapterType
  • Description
  • GUID
  • Manufacturer
  • Name
  • NetConnectionID
  • NetEnabled
  • ServiceName
  • Speed

Helmi 1. Sep 2012 15:07

AW: Namen der Netzwerk-Verbindungen auslesen
 
Hallo,

Danke für die Liste!

Wenn ich "Name" nutze, dann erhalte ich alles, nur nicht das was ich suche:

Zitat:

WAN Miniport (SSTP)
WAN Miniport (IKEv2)
WAN Miniport (L2TP)
WAN Miniport (PPTP)
WAN Miniport (PPPOE)
WAN Miniport (IPv6)
WAN Miniport (Network Monitor)
NVIDIA nForce-Netzwerkcontroller
WAN Miniport (IP)
Microsoft-ISATAP-Adapter
RAS Async Adapter
NVIDIA nForce-Netzwerkcontroller
Teredo Tunneling Pseudo-Interface
AVM ISDN-Controller FRITZ!Card PCI
AVM NDIS WAN CAPI-Treiber (1)
Apple Mobile Device Ethernet
RRNetCap Miniport
RRNetCap Miniport
RRNetCap Miniport
RRNetCap Miniport
RRNetCap Miniport
RRNetCap Miniport

sx2008 1. Sep 2012 15:10

AW: Namen der Netzwerk-Verbindungen auslesen
 
Ich weiss nicht genau was du suchst, aber NetConnectionID könnte es sein.

Helmi 1. Sep 2012 15:15

AW: Namen der Netzwerk-Verbindungen auslesen
 
Zitat:

Zitat von sx2008 (Beitrag 1180981)
Ich weiss nicht genau was du suchst, aber NetConnectionID könnte es sein.

Genau das was ich suchte!
Sorry - hätt ich auch selbst draufkommen können - nur bei ID denk ich immer gleich an eine Integerzahl.

Helmi 27. Okt 2012 14:50

AW: Namen der Netzwerk-Verbindungen auslesen
 
Zitat:

Zitat von sx2008 (Beitrag 1180977)
Eigentlich genau gleich, wie du die MAC-Adresse gelesen hast.
Das Property heisst dann anstatt 'MACAdress' einfach 'Name'.
Weitere interessante Properties sind
  • AdapterType
  • Description
  • GUID
  • Manufacturer
  • Name
  • NetConnectionID
  • NetEnabled
  • ServiceName
  • Speed

Gibt es auch Properties für die IP-Adresse?

Bzw. wo findet man eine Liste der möglichen Properties?

RWarnecke 27. Okt 2012 14:55

AW: Namen der Netzwerk-Verbindungen auslesen
 
Die API MSDN-Library durchsuchenGetAdaptersInfo und/oder MSDN-Library durchsuchenGetAdapterAddresses ist alles was Du brauchst.

Helmi 27. Okt 2012 14:57

AW: Namen der Netzwerk-Verbindungen auslesen
 
Zitat:

Zitat von RWarnecke (Beitrag 1188642)
Die API MSDN-Library durchsuchenGetAdaptersInfo und/oder MSDN-Library durchsuchenGetAdapterAddresses ist alles was Du brauchst.

Dieses Forum ist echt interessant - wenn man GetAdaptersInfo sucht, dann findet man immer wieder einen Verweis auf GetAdaptersInfo - nur leider kein Beispiel

himitsu 27. Okt 2012 15:50

AW: Namen der Netzwerk-Verbindungen auslesen
 
Reicht dir das verlinkte "Example" nicht?

Und so schwer ist diese kleine API auch nicht zu verstehn.
Man muß nur ein paar wenige Zeilen im MSDN nachlesen und schon kommt man z.B. auf Sowas:
Delphi-Quellcode:
var
  Len:  ULONG;
  AI, M: PIP_ADAPTER_INFO;
  Err:  HRESULT;
begin
  Len := 0;
  GetAdaptersInfo(nil, Len);
  GetMem(M, Len);
  try
    AI := M;
    Err := GetAdaptersInfo(AI, Len);
    if Err <> ERROR_SUCCESS then
      RaiseLastOSError(Err);
    while Assigned(AI) do begin
      ShowMessage(AI.Description + ' : ' + AI.IpAddressList.IpAddress.S);

      AI := AI.Next;
    end;
  finally
    FreeMem(M);
  end;
end;

RWarnecke 27. Okt 2012 15:59

AW: Namen der Netzwerk-Verbindungen auslesen
 
Hier wäre auch ein Beispiel von mir aus der Delphi-Praxis. Das gleiche Beispiel findest auch nochmal auf www.Code-Orakel.de

Christian Seehase 27. Okt 2012 18:17

AW: Namen der Netzwerk-Verbindungen auslesen
 
Hier haben wir auch noch ein paar Beispiele zu den Funktionen aus der DP

http://www.delphipraxis.net/9580-sub...-finden-2.html
http://www.delphipraxis.net/818-gate...-auslesen.html

Helmi 27. Okt 2012 18:31

AW: Namen der Netzwerk-Verbindungen auslesen
 
Danke Danke Danke für die vielen Tips!

Irgendwie hab ich immer falsch gesucht (oder wie auch immer)

Ich hab jetzt mal was zusammengebastelt:

Delphi-Quellcode:
const
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128; // arb.
  MAX_ADAPTER_NAME_LENGTH        = 256; // arb.
  MAX_ADAPTER_ADDRESS_LENGTH     = 8; // arb.

type
  PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
  IP_ADDRESS_STRING = packed record
    acString: array [1..16] of AnsiChar;
  end;

  PIP_MASK_STRING = ^IP_MASK_STRING;
  IP_MASK_STRING = IP_ADDRESS_STRING;

  PIP_ADDR_STRING = ^IP_ADDR_STRING;
  IP_ADDR_STRING = packed record
    Next    : PIP_ADDR_STRING;
    IpAddress: IP_ADDRESS_STRING;
    IpMask  : IP_MASK_STRING;
    Context : DWORD;
  end;

  time_t = int64;

  PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
  IP_ADAPTER_INFO = packed record
    Next               : PIP_ADAPTER_INFO;
    ComboIndex         : DWORD;
    AdapterName        : array [1..MAX_ADAPTER_NAME_LENGTH + 4] of AnsiChar ;
    Description        : array [1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of AnsiChar;
    AddressLength      : UINT;
    Address            : array [1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte;
    Index              : DWORD;
    dwType             : UINT;
    DhcpEnabled        : UINT;
    CurrentIpAddress   : PIP_ADDR_STRING;
    IpAddressList      : IP_ADDR_STRING;
    GatewayList        : IP_ADDR_STRING;
    DhcpServer         : IP_ADDR_STRING;
    HaveWins           : Boolean;
    PrimaryWinsServer  : IP_ADDR_STRING;
    SecondaryWinsServer : IP_ADDR_STRING;
    LeaseObtained      : time_t;
    LeaseExpires       : time_t;
  end;

  function GetAdaptersInfo(const pAdapterInfo: PIP_ADAPTER_INFO; const pOutBufLen: PULONG): DWORD; stdcall;
    external 'IPHLPAPI.DLL' name 'GetAdaptersInfo';

//http://msdn.microsoft.com/en-us/library/windows/desktop/aa365917(v=vs.85).aspx
procedure GetConnectionNameList(List: TStrings);
var
  pAdapterList: PIP_ADAPTER_INFO;
  dwLenAdapter: DWORD;
  ErrorCode  : DWORD;

begin
  List.Clear;

  pAdapterList := nil; // Alles auf 0 ==> Benötigte Buffergrösse ermitteln
  dwLenAdapter := 0;

  ErrorCode := GetAdaptersInfo(pAdapterList, @dwLenAdapter);

  If ErrorCode <> ERROR_BUFFER_OVERFLOW then
    begin
      RaiseLastOSError(ErrorCode);

      exit;
    end;

  pAdapterList := AllocMem(dwLenAdapter);

  try
    ErrorCode := GetAdaptersInfo(pAdapterList, @dwLenAdapter);

    If ErrorCode <> ERROR_SUCCESS then
      begin
        RaiseLastOSError(ErrorCode);

        exit;
      end;


    while Assigned(pAdapterList) do
      begin
        List.Add(Format('AdapterName: %s', [String(pAdapterList.AdapterName)]));
        List.Add(Format('Descpription: %s', [String(pAdapterList.Description)]));
        List.Add(Format('ComboIndex: %d', [pAdapterList.ComboIndex]));
        List.Add(Format('AddressLength: %d', [pAdapterList.AddressLength]));
        List.Add(Format('Address: %d', [UInt64(pAdapterList.Address)]));
        List.Add(Format('Index: %d', [pAdapterList.Index]));
        List.Add(Format('dwType: %d', [pAdapterList.dwType]));
        List.Add(Format('DhcpEnabled: %d', [pAdapterList.DhcpEnabled]));
        List.Add(Format('IpAddressList.IpAddress: %s', [String(pAdapterList.IpAddressList.IpAddress.acString)]));
        List.Add(Format('IpAddressList.IpMask: %s', [String(pAdapterList.IpAddressList.IpMask.acString)]));
        List.Add(Format('IpAddressList.Context: %d', [pAdapterList.IpAddressList.Context]));
        List.Add(Format('GatewayList.IpAddress: %s', [String(pAdapterList.GatewayList.IpAddress.acString)]));
        List.Add(Format('GatewayList.IpMask: %s', [String(pAdapterList.GatewayList.IpMask.acString)]));
        List.Add(Format('GatewayList.Context: %d', [pAdapterList.GatewayList.Context]));
        List.Add(Format('DhcpServer.IpAddress: %s', [String(pAdapterList.DhcpServer.IpAddress.acString)]));
        List.Add(Format('DhcpServer.IpMask: %s', [String(pAdapterList.DhcpServer.IpMask.acString)]));
        List.Add(Format('DhcpServer.Context: %d', [pAdapterList.DhcpServer.Context]));
        List.Add(Format('IpAddressList.HaveWins: %d', [Integer(pAdapterList.HaveWins)]));
        List.Add(Format('PrimaryWinsServer.IpAddress: %s', [String(pAdapterList.PrimaryWinsServer.IpAddress.acString)]));
        List.Add(Format('PrimaryWinsServer.IpMask: %s', [String(pAdapterList.PrimaryWinsServer.IpMask.acString)]));
        List.Add(Format('PrimaryWinsServer.Context: %d', [pAdapterList.PrimaryWinsServer.Context]));
        List.Add(Format('SecondaryWinsServer.IpAddress: %s', [String(pAdapterList.SecondaryWinsServer.IpAddress.acString)]));
        List.Add(Format('SecondaryWinsServer.IpMask: %s', [String(pAdapterList.SecondaryWinsServer.IpMask.acString)]));
        List.Add(Format('SecondaryWinsServer.Context: %d', [pAdapterList.SecondaryWinsServer.Context]));

        List.Add('-------------------------------------------------------');

        pAdapterList := pAdapterList.Next;
      end;
   finally
     FreeMem(pAdapterList);
   end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  GetConnectionNameList(Memo1.Lines);
end;
Da les ich mir jetzt alles aus was GetAdaptersInfo zu bieten hat.
Nur, und jetzt bitte keine Schläge, in meinem ersten Post oben fragte ich nach dem Namen der Netzwerkverbindung - diese wird mir jetzt über GetAdaptersInfo nicht mehr angeboten. Kann man die über GetAdaptersInfo nicht auslesen? - muss ich dazu WMI benutzen?
Ich würd halt ungern zwei "verschiedene" Funktionen nutzen um eigentlich im gleichen Bereich (also Netzwerk) Daten auszulesen

[Edit]
In der Code-Libary findet man diesen Thread.
Damit könnt ich aus der Registry den Namen auslesen...

himitsu 27. Okt 2012 18:33

AW: Namen der Netzwerk-Verbindungen auslesen
 
Tipp:
Gibt es in XE schon diese Units?
Delphi-Quellcode:
uses
  Winapi.IpTypes, Winapi.IpHlpApi;
(bzw. IpTypes und IpHlpApi)

Und pssst, Dein FreeMem gibt nichts frei, da dort der Pointer nil ist (weil dieser ja seit dem GetMem verändert "Next" wurde).
(siehe mein Edit ... hatte das auch erst vergessen :oops:, aber keine Sorge ... der Code vom CodeOrakel, vergißt dagegen sogar komplett der Freigeben)

Da AdapterName ein ANSI-String ist, besser nach AnsiString und nicht String "casten" (
Delphi-Quellcode:
String(pAdapterList.AdapterName)
) ... dann gibt's eventuell auch weniger Compilerhinweise, bezüglich ANSI<>Unicode.

Und IpAddressList = evetuell auch mehrere IPs und nicht nur Eine.

Helmi 27. Okt 2012 18:35

AW: Namen der Netzwerk-Verbindungen auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1188663)
Tipp:
Gibt es in XE schon diese Units?
Delphi-Quellcode:
uses
  Winapi.IpTypes, Winapi.IpHlpApi;
(bzw. IpTypes und IpHlpApi)

In meinem XE2 gibt es diese beiden Units

[Edit]
sehr praktische Units - spart viel Definitionsarbeit (vor allem wenn man es schon getan hat :-( )

Helmi 27. Okt 2012 18:52

AW: Namen der Netzwerk-Verbindungen auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1188663)
Tipp:
Und pssst, Dein FreeMem gibt nichts frei, da dort der Pointer nil ist (weil dieser ja seit dem GetMem verändert "Next" wurde).
(siehe mein Edit ... hatte das auch erst vergessen :oops:, aber keine Sorge ... der Code vom CodeOrakel, vergißt dagegen sogar komplett der Freigeben)

stimmt - der ist nil!
Aber dann dürft ja FreeMem nichts zu tun haben und falls ja, dann wird Speicher freigegeben.
Ich seh jetzt nicht so das Problem das drinzulassen, oder?


Zitat:

Zitat von himitsu (Beitrag 1188663)
Da AdapterName ein ANSI-String ist, besser nach AnsiString und nicht String "casten" (
Delphi-Quellcode:
String(pAdapterList.AdapterName)
) ... dann gibt's eventuell auch weniger Compilerhinweise, bezüglich ANSI<>Unicode.

Also mein Delphi ist da ganz ruhig (ok - hab jetzt die o. g. Units mit drin)

Zitat:

Zitat von himitsu (Beitrag 1188663)
Und IpAddressList = evetuell auch mehrere IPs und nicht nur Eine.

Aber es wird doch nur eine angezeigt bzw. rückgemeldet von GetAdaptersInfo?


So - jetzt muss ich Himitsu genügend Zeit zum Antworten und Editieren geben.... - ist halt nimmer der Jüngste :mrgreen:

RWarnecke 27. Okt 2012 19:15

AW: Namen der Netzwerk-Verbindungen auslesen
 
Mit GetAdaptersInfo funktioniert es nur mit der Registry. Wenn Du nur System gleich oder größer Windows XP unterstützen möchtest, dann nimm MSDN-Library durchsuchenGetAdaptersAddresses.

himitsu 27. Okt 2012 19:30

AW: Namen der Netzwerk-Verbindungen auslesen
 
Wenn man FreeMem nil gibt, dann macht es nichts, da es ja denkt es gäbe nichts freizugeben.

Man muß ihm schon einen Pointer geben, welcher auch (noch) auf den freizugebenden Speicherblock zeigt.

Helmi 27. Okt 2012 20:02

AW: Namen der Netzwerk-Verbindungen auslesen
 
Zitat:

Zitat von RWarnecke (Beitrag 1188669)
Mit GetAdaptersInfo funktioniert es nur mit der Registry. Wenn Du nur System gleich oder größer Windows XP unterstützen möchtest, dann nimm MSDN-Library durchsuchenGetAdaptersAddresses.

Bin ich jetzt blind oder steht in GetAdaptersInfo keine IP-Adresse?
Den "FriendlyName" hab ich gefunden - genau das was ich suche

Ich sehe GetAdaptersAddresses als Ergänzung zu GetAdaptersInfo an

Schwedenbitter 10. Okt 2016 13:49

AW: Namen der Netzwerk-Verbindungen auslesen
 
Hat schon mal jemand diesen Code mit
Delphi-Quellcode:
ReportMemoryLeaksOnShutdown:= True;
compiliert/ausgeführt?


Ich frage bloß deshalb, weil ich damit einen belegten Speicherblock angezeigt bekomme. Ich habe hier (vorletzter Post) ähnlichen Code gefunden, in dem vor
Delphi-Quellcode:
pAdapterList := pAdapterList.Next;
der aktuelle Eintrag auf eine Temp-Variable übertragen und diese dann jedes Mal freigegeben wird. Damit bekomme ich kein Speicherleck mehr.

Ich liebe aber kurzen Code. Daher meine Frage. Sollte es also wirklich kürzer gehen, würde ich mich über eine Antwort freuen.

himitsu 10. Okt 2016 14:26

AW: Namen der Netzwerk-Verbindungen auslesen
 
Für die Schleife muß man eine eigene Variable verwenden, denn durch
Delphi-Quellcode:
pAdapterList:=pAdapterList.Next
wird ja der Zeiger verschoben, und
Delphi-Quellcode:
FreeMem(pAdapterList)
kann dann nicht mehr das freigeben, was durch
Delphi-Quellcode:
AllocMem
reserviert wurde.

p80286 10. Okt 2016 15:00

AW: Namen der Netzwerk-Verbindungen auslesen
 
Ich habs nur überflogen, aber meiner Meinung nach muß in der Schleife
Delphi-Quellcode:
while Assigned(pAdapterList) do
PIP_ADAPTER_INFO genutzt werden.
Und die Freigabe für pAdapterlist ist in Ordung.

Gruß
K-H

Schwedenbitter 10. Okt 2016 15:12

AW: Namen der Netzwerk-Verbindungen auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1350372)
Für die Schleife muß man eine eigene Variable verwenden, ...

Also passt das mit der temp-Variable. Danke für die ultraschnelle Antwort :dp:


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