Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Netzwerkstatus abfragen (https://www.delphipraxis.net/214669-netzwerkstatus-abfragen.html)

Cobol 18. Feb 2024 19:10

Netzwerkstatus abfragen
 
Hallo zusammen,

ich möchte ein Programm schreiben, welches den Status eines (im Hintergrund laufenden) Netzwerkadapters/-gerätes periodisch abfragt.

Bsp.: Ich habe ein Netzwerkgerät "Ethernet 3 - Internet", von dem ich periodisch wissen möchte, ob es aktiv ist oder nicht.
In den Statuseigenschaften dieses Adapters sehe ich unter "Medienstatus" bspw."aktiviert".

Vermutlich würde es reichen, diesen Medienstatus abzufragen. Weiß evtl. jemand, ob bzw. wie das programmatisch umsetzbar wäre?
Über Hinweise würde ich mich freuen.

Danke!

TiGü 19. Feb 2024 08:19

AW: Netzwerkstatus abfragen
 
Als Startpunkt: https://www.delphipraxis.net/170122-...-auslesen.html

Kratos 19. Feb 2024 10:29

AW: Netzwerkstatus abfragen
 
Ich hätte es über PowerShell-Commands gelöst.
ChatGPT schlägt folgendes vor:
Code:
Get-NetAdapter -InterfaceAlias "Ethernet 3 - Internet" | Select-Object InterfaceAlias, MediaConnectionState
Erfolgreich getestet mit meinem Adapter.
Die Ausgabe kann man sich ja in Delphi zurückliefern lassen.

QuickAndDirty 19. Feb 2024 11:26

AW: Netzwerkstatus abfragen
 
@kratos: Was muss ich lernen um sowas zu wissen?
PowerShell ? WSH ? ActiveDirectory ?
Wie heißt diese Magie und kannst du ein Grimoire empfehlen im sie zu lernen?

Delphi.Narium 19. Feb 2024 11:46

AW: Netzwerkstatus abfragen
 
Habe spasseshalber mal den Chatbot meiner Wahl interviewt, dabei ist dashier herausgekommen:
Zitat:

Zitat von Frage
Ich möchte in Delphi ein Programm schreiben, welches den Status eines (im Hintergrund laufenden) Netzwerkadapters/-gerätes periodisch abfragt.

Bsp.: Ich habe ein Netzwerkgerät "Ethernet 3 - Internet", von dem ich periodisch wissen möchte, ob es aktiv ist oder nicht.
In den Statuseigenschaften dieses Adapters sehe ich unter "Medienstatus" bspw."aktiviert".

Vermutlich würde es reichen, diesen Medienstatus abzufragen. Weiß evtl. jemand, ob bzw. wie das programmatisch umsetzbar wäre?

Zitat:

Zitat von Antwort
Ja, es ist möglich, den Status eines Netzwerkadapters in Delphi programmatisch abzufragen. Eine Möglichkeit besteht darin, die Windows Management Instrumentation (WMI) zu verwenden. Allerdings kann WMI auf einigen Systemen Probleme verursachen oder zu langsam initialisieren².

Eine andere Möglichkeit besteht darin, die Funktionen 'GetIfTable' und 'GetIfEntry' zu verwenden, die Ihnen den gewünschten Status ('dwOperStatus') liefern können². Hier ist ein einfacher Codeausschnitt, der zeigt, wie man diese Funktionen verwenden könnte:

Delphi-Quellcode:
unit GetIf;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
  MAX_INTERFACE_NAME_LEN = $100; // maximale Länge Name des Interfaces
  MAXLEN_PHYSADDR = 8; // maximale Länge der physischen Adresse
  MAXLEN_IFDESCR = $100; // maximale Länge Beschreibung des Int.

type
  TMIB_IFROW = record
    wszName : array [0 .. (MAX_INTERFACE_NAME_LEN*2-1)] of char;
    dwIndex : cardinal; // index of the interface
    dwType : Longint ; // type of interface
    dwMtu : Longint ; // max transmission unit
    dwSpeed : Longint ; // speed of the interface
    dwPhysAddrLen : Longint ; // length of physical address
    bPhysAddr : array [0 .. (MAXLEN_PHYSADDR-1)] of byte ; // physical address of adapter
    dwAdminStatus : Longint ; // administrative status
    // ...
    // Weitere Felder können hinzugefügt werden, um zusätzliche Informationen zu erhalten
  end;

implementation

// Hier können Sie die Funktionen GetIfTable und GetIfEntry aufrufen, um den Status des Netzwerkadapters abzurufen

end.
Zitat:

Zitat von Fortsetzung der Antwort
Bitte beachten Sie, dass Sie die 'GetIfTable' und 'GetIfEntry' Funktionen importieren und korrekt aufrufen müssen, um den Status des Netzwerkadapters zu erhalten. Dieser Codeausschnitt ist nur ein Anfangspunkt und muss entsprechend Ihren Anforderungen erweitert werden. Es ist auch wichtig zu beachten, dass Sie Administratorrechte benötigen könnten, um auf bestimmte Netzwerkinformationen zuzugreifen².

Quelle: Unterhaltung mit Bing, 19.2.2024
(1) Delphi Netzwerkadapter verbunden? - Delphi-PRAXiS. https://www.delphipraxis.net/108194-...verbunden.html.
(2) Delphi Netzwerkstatus abfragen - Delphi-PRAXiS. https://www.delphipraxis.net/214669-...-abfragen.html.
(3) Überprüfen des Netzwerkverbindungsstatus - Microsoft-Support. https://support.microsoft.com/de-de/...f-aac9114659a5.
(4) undefined. http://www.microsoft.com/library/med...ctions-new.GIF.

Zitat:

Zitat von Frage
Wie könnte ein konkreter Aufruf von GetIfTable und GetIfEntry in Delphi aussehen?

Zitat:

Zitat von Antwort
Hier ist ein einfacher Codeausschnitt, der zeigt, wie man die Funktionen 'GetIfTable' und 'GetIfEntry' in Delphi verwenden könnte:

Delphi-Quellcode:
unit GetIf;

interface

uses
  Windows, SysUtils;

type
  PMIB_IFROW = ^MIB_IFROW;
  MIB_IFROW = packed record
    wszName: array[0..MAX_INTERFACE_NAME_LEN * 2 - 1] of WideChar;
    dwIndex: DWORD;
    dwType: DWORD;
    dwMtu: DWORD;
    dwSpeed: DWORD;
    dwPhysAddrLen: DWORD;
    bPhysAddr: array[0..MAXLEN_PHYSADDR - 1] of BYTE;
    dwAdminStatus: DWORD;
    dwOperStatus: DWORD;
    dwLastChange: DWORD;
    dwInOctets: DWORD;
    dwInUcastPkts: DWORD;
    dwInNUcastPkts: DWORD;
    dwInDiscards: DWORD;
    dwInErrors: DWORD;
    dwInUnknownProtos: DWORD;
    dwOutOctets: DWORD;
    dwOutUcastPkts: DWORD;
    dwOutNUcastPkts: DWORD;
    dwOutDiscards: DWORD;
    dwOutErrors: DWORD;
    dwOutQLen: DWORD;
    dwDescrLen: DWORD;
    bDescr: array[0..MAXLEN_IFDESCR - 1] of AnsiChar;
  end;

function GetIfEntry(pIfRow: PMIB_IFROW): DWORD; stdcall; external 'IPHLPAPI.DLL';
function GetIfTable(pIfTable: Pointer; var pdwSize: ULONG; bOrder: BOOL): ULONG; stdcall; external 'IPHLPAPI.DLL';

implementation

end.
Zitat:

Zitat von Fortsetzung der Antwort
In diesem Codeausschnitt wird die 'GetIfEntry' Funktion importiert, die einen Zeiger auf eine 'MIB_IFROW' Struktur erwartet. Diese Struktur enthält Informationen über das Netzwerkinterface, einschließlich des Betriebsstatus ('dwOperStatus'). Sie können eine Instanz dieser Struktur erstellen, den 'dwIndex' auf den Index des gewünschten Netzwerkadapters setzen und dann die 'GetIfEntry' Funktion aufrufen, um die Struktur mit Informationen zu füllen¹.

Bitte beachten Sie, dass dieser Codeausschnitt nur ein Anfangspunkt ist und entsprechend Ihren Anforderungen erweitert werden muss¹. Es ist auch wichtig zu beachten, dass Sie Administratorrechte benötigen könnten, um auf bestimmte Netzwerkinformationen zuzugreifen¹.

Quelle: Unterhaltung mit Bing, 19.2.2024
(1) delphi - GetIfTable results change after Windows updates on certain .... https://stackoverflow.com/questions/...tain-computers.
(2) GetIfTable2 - MIB_IF_ROW2 - Delphi-PRAXiS. https://www.delphipraxis.net/165808-...b_if_row2.html.
(3) 50 plattformübergreifende Beispiele für Delphi 10.3 Rio FireMonkey. https://learndelphi.org/de/50-cross-...io-firemonkey/.

Zitat:

Zitat von Frage
Könnte ich diese Funktionen z. B. per TTimer in einem Zeitintervall von 10 Sekunden aufrufen und das Ergebnis in einem TMemo oder einem TStringGrid ausgeben?

Zitat:

Zitat von Antwort
Ja, Sie können einen 'TTimer' verwenden, um die Netzwerkstatusabfrage periodisch durchzuführen und das Ergebnis in einem 'TMemo' oder 'TStringGrid' auszugeben. Hier ist ein einfacher Codeausschnitt, der zeigt, wie man das machen könnte:

Delphi-Quellcode:
unit MainForm;

interface

uses
  Windows, SysUtils, Classes, Controls, Forms, StdCtrls, ExtCtrls, GetIf;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  IfRow: MIB_IFROW;
begin
  ZeroMemory(@IfRow, SizeOf(IfRow));
  IfRow.dwIndex := 1; // Setzen Sie hier den Index Ihres Netzwerkadapters ein
  if GetIfEntry(@IfRow) = NO_ERROR then
  begin
    Memo1.Lines.Add('Status: ' + IntToStr(IfRow.dwOperStatus));
  end
  else
  begin
    Memo1.Lines.Add('Fehler beim Abrufen des Netzwerkstatus');
  end;
end;

end.
Zitat:

Zitat von Fortsetzung der Antwort
In diesem Codeausschnitt wird ein 'TTimer' verwendet, um alle 10 Sekunden (Sie können das Intervall auf 10000 Millisekunden setzen) den Status des Netzwerkadapters abzufragen und das Ergebnis in einem 'TMemo' auszugeben.

Bitte beachten Sie, dass dieser Codeausschnitt nur ein Anfangspunkt ist und entsprechend Ihren Anforderungen erweitert werden muss. Es ist auch wichtig zu beachten, dass Sie Administratorrechte benötigen könnten, um auf bestimmte Netzwerkinformationen zuzugreifen.

Zitat:

Zitat von Frage
Wie kann ich den Status mehrerer Netzwerkadapter abfragen?

Zitat:

Zitat von Antwort
Um den Status mehrerer Netzwerkadapter abzufragen, können Sie die Funktion 'GetIfTable' verwenden. Diese Funktion gibt eine Tabelle aller Netzwerkadapter auf dem System zurück. Sie können dann durch diese Tabelle iterieren und für jeden Eintrag die Funktion 'GetIfEntry' aufrufen, um den Status des jeweiligen Adapters zu erhalten.

Hier ist ein einfacher Codeausschnitt, der zeigt, wie man das machen könnte:

Delphi-Quellcode:
unit MainForm;

interface

uses
  Windows, SysUtils, Classes, Controls, Forms, StdCtrls, ExtCtrls, GetIf;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  pIfTable: PMIB_IFTABLE;
  dwSize: ULONG;
  i: Integer;
  IfRow: MIB_IFROW;
begin
  dwSize := 0;
  GetIfTable(nil, dwSize, False); // Erster Aufruf, um die benötigte Größe zu ermitteln
  GetMem(pIfTable, dwSize);
  try
    if GetIfTable(pIfTable, dwSize, True) = NO_ERROR then // Zweiter Aufruf, um die Daten zu erhalten
    begin
      for i := 0 to pIfTable^.dwNumEntries - 1 do
      begin
        ZeroMemory(@IfRow, SizeOf(IfRow));
        IfRow.dwIndex := pIfTable^.table[i].dwIndex;
        if GetIfEntry(@IfRow) = NO_ERROR then
        begin
          Memo1.Lines.Add('Adapter ' + IntToStr(i) + ': ' + 'Status: ' + IntToStr(IfRow.dwOperStatus));
        end
        else
        begin
          Memo1.Lines.Add('Fehler beim Abrufen des Netzwerkstatus');
        end;
      end;
    end;
  finally
    FreeMem(pIfTable);
  end;
end;

end.
Zitat:

Zitat von Fortsetzung der Antwort
In diesem Codeausschnitt wird ein 'TTimer' verwendet, um alle 10 Sekunden (Sie können das Intervall auf 10000 Millisekunden setzen) den Status aller Netzwerkadapter abzufragen und das Ergebnis in einem 'TMemo' auszugeben¹.

Bitte beachten Sie, dass dieser Codeausschnitt nur ein Anfangspunkt ist und entsprechend Ihren Anforderungen erweitert werden muss¹. Es ist auch wichtig zu beachten, dass Sie Administratorrechte benötigen könnten, um auf bestimmte Netzwerkinformationen zuzugreifen¹.

Quelle: Unterhaltung mit Bing, 19.2.2024
(1) Delphi Aktiven Netzwerkadapter bestimmen - Delphi-PRAXiS. https://www.delphipraxis.net/67160-a...bestimmen.html.
(2) Delphi Netzwerkstatus abfragen - Delphi-PRAXiS. https://www.delphipraxis.net/214669-...-abfragen.html.
(3) Delphi Netzwerkadapter verbunden? - Delphi-PRAXiS. https://www.delphipraxis.net/108194-...verbunden.html.

Zitat:

Zitat von Frage
Wie kann ich die Informationen in einem TStringGrid ausgeben?

Zitat:

Zitat von Antwort
Um die Informationen in einem 'TStringGrid' auszugeben, können Sie die 'Cells'-Eigenschaft des 'TStringGrid' verwenden. Hier ist ein einfacher Codeausschnitt, der zeigt, wie man das machen könnte:

Delphi-Quellcode:
unit MainForm;

interface

uses
  Windows, SysUtils, Classes, Controls, Forms, StdCtrls, ExtCtrls, Grids, GetIf;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  pIfTable: PMIB_IFTABLE;
  dwSize: ULONG;
  i: Integer;
  IfRow: MIB_IFROW;
begin
  dwSize := 0;
  GetIfTable(nil, dwSize, False); // Erster Aufruf, um die benötigte Größe zu ermitteln
  GetMem(pIfTable, dwSize);
  try
    if GetIfTable(pIfTable, dwSize, True) = NO_ERROR then // Zweiter Aufruf, um die Daten zu erhalten
    begin
      StringGrid1.RowCount := pIfTable^.dwNumEntries + 1; // +1 für die Überschrift
      StringGrid1.Cells[0, 0] := 'Adapter';
      StringGrid1.Cells[1, 0] := 'Status';
      for i := 0 to pIfTable^.dwNumEntries - 1 do
      begin
        ZeroMemory(@IfRow, SizeOf(IfRow));
        IfRow.dwIndex := pIfTable^.table[i].dwIndex;
        if GetIfEntry(@IfRow) = NO_ERROR then
        begin
          StringGrid1.Cells[0, i + 1] := 'Adapter ' + IntToStr(i);
          StringGrid1.Cells[1, i + 1] := 'Status: ' + IntToStr(IfRow.dwOperStatus);
        end
        else
        begin
          StringGrid1.Cells[0, i + 1] := 'Adapter ' + IntToStr(i);
          StringGrid1.Cells[1, i + 1] := 'Fehler beim Abrufen des Netzwerkstatus';
        end;
      end;
    end;
  finally
    FreeMem(pIfTable);
  end;
end;

end.
Zitat:

Zitat von Fortsetzung der Antwort
In diesem Codeausschnitt wird ein 'TTimer' verwendet, um alle 10 Sekunden (Sie können das Intervall auf 10000 Millisekunden setzen) den Status aller Netzwerkadapter abzufragen und das Ergebnis in einem 'TStringGrid' auszugeben¹.

Bitte beachten Sie, dass dieser Codeausschnitt nur ein Anfangspunkt ist und entsprechend Ihren Anforderungen erweitert werden muss¹. Es ist auch wichtig zu beachten, dass Sie Administratorrechte benötigen könnten, um auf bestimmte Netzwerkinformationen zuzugreifen¹.

Quelle: Unterhaltung mit Bing, 19.2.2024
(1) Inhalt eines StringGrids speichern und laden - Delphi-Treff. https://www.delphi-treff.de/tipps-tr...ern-und-laden/.
(2) TStringGrid - Delphi-Treff. https://www.delphi-treff.de/tipps-tr...n/tstringgrid/.
(3) Filling a TStringGrid in Delphi - Stack Overflow. https://stackoverflow.com/questions/...grid-in-delphi.
(4) Text im StringGrid ausrichten - Delphi-Treff. https://www.delphi-treff.de/tipps-tr...id-ausrichten/.



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