|
Antwort |
Registriert seit: 14. Sep 2019 3 Beiträge |
#1
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! |
Zitat |
Registriert seit: 6. Apr 2011 Ort: Berlin 3.070 Beiträge Delphi 10.4 Sydney |
#2
Als Startpunkt: https://www.delphipraxis.net/170122-...-auslesen.html
|
Zitat |
Registriert seit: 15. Okt 2019 52 Beiträge Delphi 10.3 Rio |
#3
Ich hätte es über PowerShell-Commands gelöst.
ChatGPT schlägt folgendes vor:
Code:
Erfolgreich getestet mit meinem Adapter.
Get-NetAdapter -InterfaceAlias "Ethernet 3 - Internet" | Select-Object InterfaceAlias, MediaConnectionState
Die Ausgabe kann man sich ja in Delphi zurückliefern lassen. |
Zitat |
Registriert seit: 13. Jan 2004 Ort: Hamm(Westf) 1.929 Beiträge Delphi 12 Athens |
#4
@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? |
Zitat |
Registriert seit: 27. Nov 2017 2.490 Beiträge Delphi 7 Professional |
#5
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/. |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |