AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Netzwerkstatus abfragen

Ein Thema von Cobol · begonnen am 18. Feb 2024 · letzter Beitrag vom 19. Feb 2024
Antwort Antwort
Cobol

Registriert seit: 14. Sep 2019
3 Beiträge
 
#1

Netzwerkstatus abfragen

  Alt 18. Feb 2024, 19:10
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!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Netzwerkstatus abfragen

  Alt 19. Feb 2024, 08:19
Als Startpunkt: https://www.delphipraxis.net/170122-...-auslesen.html
  Mit Zitat antworten Zitat
Kratos

Registriert seit: 15. Okt 2019
51 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Netzwerkstatus abfragen

  Alt 19. Feb 2024, 10:29
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.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#4

AW: Netzwerkstatus abfragen

  Alt 19. Feb 2024, 11:26
@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?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.418 Beiträge
 
Delphi 7 Professional
 
#5

AW: Netzwerkstatus abfragen

  Alt 19. Feb 2024, 11:46
Habe spasseshalber mal den Chatbot meiner Wahl interviewt, dabei ist dashier herausgekommen:
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 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 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 von Frage:
Wie könnte ein konkreter Aufruf von GetIfTable und GetIfEntry in Delphi aussehen?
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 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 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 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 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 von Frage:
Wie kann ich den Status mehrerer Netzwerkadapter abfragen?
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 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 von Frage:
Wie kann ich die Informationen in einem TStringGrid ausgeben?
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 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/.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 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