Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
War gerade auf der MSDN Seite und laut der ist WMI in ME, 2000 und XP standardmäßig dabei. Nur bei 98, 95 und NT gibt's extra Downloads
[edit] Aber probier doch mal die WMI Tools. Wenn die laufen starte mal den WMI Object Browser (geht nur mit IE :evil: ) und schau mal unter Win32_SystemDevices.PartComponent -> Win32_NetworkAdapter. Du erhälst da eine Übersicht über alle NetDevices. Rein theoretisch müßte unter ME NetConnectionID und NetConnectionStatus <empty> stehen. Mit dem letzteren kann man sagen ob NW-Kabel drinnen oder nicht. |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Liste der Anhänge anzeigen (Anzahl: 1)
So hab mich nochmal rangesetzt und was geändert.
Hab jetzt Funktionen genommen, die rein theoretisch unter allen Windows-Versionen laufen sollten, vorausgesetzt WMI ist installiert. Bugs, Kritik und Verbesserungsvorschläge nehme ich gerne entgegen. |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Was bringt dir eine funktion, wenn du dafür ein fremdes Programm benötigst ?
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Ist auf jeden Fall ein gutes Argument, nur leider ist das bis jetzt die "sicherste" und "zuverläsigste" Lösung die ich gefunden habe. Ich weiß dass es noch viel 98/ME-User gibt, dehalb habe ich versucht Funktionen zu nehmen, die auch von diesen unterstützt werden. Mir macht das nix aus unter XP. Aber ich will ja dass mein Prog erstmal auf jedem Windows läuft. Leider kann ich das im Moment nicht testen da mir die Zeit fehlt ein oder zwei zusätzliche Systeme zum testen aufzubauen. Deshalb bin ich auf eure Hilfe angewiesen.
Aber MrKnogge, wenn du 'ne andre Idee hast das umzusetzen, ich bin ganz Ohr und einige andre sicher auch :-D |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Anbei die älteste Version die ich noch habe... |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Ich muss dich leider enttäuchen :cry: , aber nachdem ich deine Typenbibliothek installiert habe bekomme ich immer noch alle Informationen von XP. Durch die importierte TLB stelle ich ja eine Verbindung zu der DLL dar, über Funktionen. Also eine Schnittstelle. Diese sind im allgemeinen gleich geblieben (die von mir benötigten haben sich nicht geändert). Aber die Eigenschaften, die ich abrufen kann über WMI, hängen von der WMI-Version ab und nicht von der TLB! Das einzige was mir jetzt spontan einfällt ist, vorher den WMI-Status, dann die WMI-Version abzufragen und dann zu entscheiden welche Daten ich abfragen kann. Das heißt bei XP einfach NetConnectionStatus und bei anderen dann den umständlichen Weg über MAC -> IP=0.0.0.0? usw.
Wäre schön wenn es so einfach gewesen wäre :? |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Moin!
Also ich arbeite auch mit Ping bei der "Serverüberwachung" (aus Delphi heraus). Ebenso hatte ich Bedenken, was die Netzlast betrifft. Jetzt schicke ich alle 5 Minuten 10 Pings ab und entscheide anhand der verlorenen Päckchen, was zu tun ist. In diesem häßlichen Netzwerk sind 3 verlorene Päckchen eine Info, 5 eine Warnung und ab 7 wird es kritisch (unter Berücksichtigung der Zeit). Da solltest Du Dir also keine Sorgen von wegen der Netzlast machen - denke ich... |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Leider benötige ich die Info sofort (ok 5 Sekunden Tolleranz), da ich sofort reagieren möchte/muss, wenn die Verbindung verloren geht.
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Hi,
die ultimative Lösung habe auch ich nicht. Aber hast Du schon mal folgende Funktionen angeschaut? IsNetworkAlive, IsDestinationReachable Gruß, Markus |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
@DafOx: hast du schonmal damit gearbeitet? Wollte gerade die Sensapi.dll einbinden, aber Delphi brachte mir eine Fehlermeldung, dass es nicht ginge ("Fehler beim Laden der Typbibliothek/DLL").
Hab ich vielleicht was übersehen? :?: |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
Zudem gibt es die NetworkConnectionID ubd NetworkConnectionStatus unter WinSE nicht... |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Also ich hab deine genommen :?
Aber vielleicht liegt es ja noch an der DLL? Kannst du deine mal noch mit posten? |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
( ps: befinden sich unter WIn9x in %windir%\system\WBEM ) Zum Beitrag oben, IsNetworkAlive() liefert immer noch LAN zurück wenn das Kabel längst gezogen wurde...
Delphi-Quellcode:
const
NETWORK_ALIVE_LAN = $00000001; NETWORK_ALIVE_WAN = $00000002; NETWORK_ALIVE_AOL = $00000004; function IsNetworkAlive(out Flags: DWORD): BOOL; stdcall; external 'sensapi.dll' name 'IsNetworkAlive'; procedure TForm1.Button1Click(Sender: TObject); var Flags: DWORD; Text: string; begin Text := 'IsNetworkAlive: '; if not IsNetworkAlive(Flags) then Text := Text + '<offline>' else begin if (Flags and NETWORK_ALIVE_LAN) = NETWORK_ALIVE_LAN then Text := Text + 'LAN, '; if (Flags and NETWORK_ALIVE_WAN) = NETWORK_ALIVE_WAN then Text := Text + 'WAN, '; if (Flags and NETWORK_ALIVE_AOL) = NETWORK_ALIVE_AOL then Text := Text + 'Looser, '; Text := Text + '...'; end; ShowMessage(Text); end; |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
Reaktionszeit < 1 Sekunde :-D PS: Danke nochmal für die Dateien und den Code |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Ähm, hab ich jetzt 'nen Denkfehler? Weil wenn ich
Delphi-Quellcode:
einbinde, sagt mir Delphi, "der Prozedureinstiegspunkt wurde nicht gefunden". Aber laut MSDN heißt die Funktion doch so.
function IsDestinationReachable(Destination: String): BOOL; stdcall;
external 'sensapi.dll' name 'IsDestinationReachable'; Ich dreh hier gleich durch :wall: |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Hi.
Delphi-Quellcode:
Gruß,
PQOCInfo = ^TQOCInfo;
TQOCInfo = record dwSize: Integer; dwFlags: Integer; dwInSpeed: Integer; dwOutSpeed: Integer; end; function IsDestinationReachable(Destination: PChar; QOCInfo: pQOCInfo): BOOL; stdcall; external 'sensapi.dll' name 'IsDestinationReachableA'; Markus |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Na auf das A muss man erstmal kommen. Danke :-D
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
ne ganz einfache möglichkeit is (die supermuckl und ich eben herrausgefunden haben), ping einfach alle netzwerkkarten von dir an.. wenn das kabel gezogen ist, deaktiviert sich die karte und die ip existiert somit nicht mehr!
das klappt auf allen 5 rechnern hier, also warum nicht auch bei dir / euch !? MfG Powerstreamer |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich hoffe mal dass wir es jetzt geschafft haben. :zwinker:
Also die Erkennung läuft über IsNetworkAlive.
Projekt ist wieder anbei. Ich bitte wie immer um Berichte von Nicht-XP-Usern :wink: Danke |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
- Kabel drin: IsNetworkAlive True, DestinationAvailable True - Kabel wech: IsNetworkAlive True, DestinationAvailable False |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
:wall: ach menno :cry:
Hast du vielleicht mehr als eine Netwerkkarte? |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Und ich dachte schon es liegt an mir :mrgreen:
Hab jetzt 3 XP Rechner und 1 Server 2003 ausprobiert. Funktioniert tadellos ,außer beim Server das IsDestinationReachable. Warum weiß ich noch nicht. Ich warte weiter auf Berichte, vor allem nicht-XP-User :hi: |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
:wall: Mein Fehler
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var QOCInfo: TQOCInfo; begin Memo1.Clear; QOCInfo.Size := 16; //Bitte das einfügen if CheckBox1.Checked then if Edit1.Text <> '' then |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
@Nico: Nur rein aus Interesse: Weißt da was hinter den Kulissen passiert, wenn der Balloon-Hint "Das Netzwerkkabel wurde entfernt" erscheint (Stichwort: IDA :mrgreen: )? Polling? Was wird gepollt?
Gruß, Markus |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
Delphi-Quellcode:
einfügen.
QOCInfo.dwSize := SizeOf(TQOCInfo);
Gruß, Markus |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Der Code mit IsNetworkAlive hat vor 3 Wochen auf WinXP Prof. noch problemlos funktioniert (schnell, liefert praktisch ohne Verzögerung "Netzwerkkabel gezogen").
Jetzt geht er nicht mehr... :pale: DestinationReachable auf 192.168.0.1 (die Adresse meines Computers) liefert "Keine Netzwerkverbindung" obwohl ein normaler Ping funktioniert. Die WAN-Verbindung wird aber noch erkannt. An meinem Programm liegt der Fehler sicher nicht da ich es auch mit dem beigelegten Beispielprogramm ausprobiert habe. Wären nett wenn das irgendein SP2-User noch testen könnte, ich glaube aber nicht dass es daran liegt weil ich es damals auch schon hatte (glaube ich zumindest... :gruebel: ) Unter Windows 2000 Prof. (SP4), wo ich ein Programm mit dieser Funktion verwenden will, hat der Code nie funktioniert. |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Also ich hab XP SP2 und es funktioniert ohne Probleme. Unter 2000 SP3 lief es auch (glaub ich jedenfalls). Nur unter 98/ME läuft es nicht. Aber mit SP4 für 200 probier ich nochmal.
Das ganze kommt ja aus der sensapi.dll. Schau mal was du für ne Version hast |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Wie finde ich heraus welche Version ich habe?
Ich glaube nicht dass es daran liegt wenn du auch das SP2 hast und es bei dir funktioniert. Bei Windows 2000 geht es jetzt aber! Dann hat sich das Problem erledigt weil ich es nur fürs 2000er brauche. |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Hi!
Zitat:
Ciao Frederic |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Ich habe mich geirrt, der Code funktioniert doch nicht unter Windows 2k und liefert immer "LAN" auch wenn gar keine Verbindung vorhanden ist.
Und unter Windows XP funktioniert er wieder ... verrückt! :roll: Die sensapi.dll-Version auf dem Windows-2000-PC ist 5.0.2195.6627. |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Ich bins wieder.
Es funktioniert doch unter Win2k! Allerdings beträgt die Verzögerung etwa 5 Minuten. Mein Bruder hat das Kabel rausgezogen, und nach 5 Minuten hat er sich beschwert dass der Computer nicht mehr geht. Danach hat er wieder 5 min warten müssen bis es wieder gegangen ist. Das hat er sich gemerkt, jetzt zieht er es nicht mehr raus :firejump: :stupid: mfg. Tubos |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
wie läuft das z.b. auf Delphi 2005? hat schon jemand WMI in Delphi 2005 verwendet? muss ich da gewisse Units von WMI einbinden? |
Guten Abend allerseits!
Nun habe ich mal beide Varianten ausprobiert - sowohl die lange von toyoman, als auch den Dreizeiler, der am Anfang gepostet wurde. Allerdings habe ich folgendes Problem: toyoman's Variante läuft nur unter NT, der Dreizeiler nur unter XP! Was nun? Eine Möglichkeit wäre ja festzustellen, welches OS gerade benutzt wird, aber das ist alles ziemlich umständlich. Gibt's eventuell einen Befehl, mit dem man kurz und knapp abfragen kann, ob man mit dem LAN verbunden ist oder nicht? Ich meine, um festzustellen, ob man mit dem Internet verbunden ist, geht's auch schnell mit 'nem Befehl, der mir gerade nicht einfällt, aber funktioniert. Naja, wäre nett, wenn Ihr mal paar Tipps geben könntet. Schönen Abend noch! |
Zitat:
hey, die variante war nicht von mir sondern von djmasi... ich benütze in meinen Service diese Funktion (auch irgendwo hier aus dem Forum, bisschen modifiziert):
Delphi-Quellcode:
logfileschreiben ist eine Extra-Prozedur.
function NetworkConnect : Boolean;
var reg : TRegistry; i : Integer; NetworkCards : String; begin result := false; reg := TRegistry.Create(KEY_READ); reg.RootKey := HKEY_LOCAL_MACHINE; for i := 0 to 15 do //Mehr als 15 Netzwerkkarten sollte kein normaler Rechner haben... begin if reg.KeyExists('\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\' +inttostr(i)) = true then begin logfileschreiben('----------------------------------------------------------------------------------------'); reg.OpenKey('\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\' +inttostr(i),false); NetworkCards := reg.ReadString('ServiceName'); logfileschreiben('Networkcard ID: '+Networkcards); logfileschreiben('Networkcard description: '+reg.readstring('Description')); // break; if NetworkCards <> '' then begin reg.OpenKey('\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\'+NetworkCards,false); logfileschreiben('DHCP Domain: '+reg.readstring('DhcpDomain')); logfileschreiben('DHCP IP: '+reg.readstring('DhcpIPAddress')); logfileschreiben('----------------------------------------------------------------------------------------'); if reg.ReadString('DHCPDomain') <> '' then begin result := true end else begin result := false; end; end; end; end; reg.Free; end; Aufruf:
Delphi-Quellcode:
if networkconnect=true then
begin logfileschreiben('Networkcard: Network cable plugged in.'); winipath:=vpnfile; // Konfigurationsfile logfileschreiben('Using network version of VPN.ini: '+winipath); end else begin logfileschreiben('Networkcard: Network cable unplugged!'); winipath:=getpath+'vpn.ini'; logfileschreiben('Network not reachable, Using local VPN.ini file: '+winipath); end; |
Huhu,
sorry, da hab' ich dann wohl was verwechselt - ist ja aber auch egal! Es geht um eine kleine Unterkategorie, die nur testen soll, ob eine LAN-Verbindung hergestellt ist oder nicht und dementsprechend was ausgeben soll, also "verbunden" oder "nicht verbunden"! Das alles soll bei einem Buttonklick passieren. Könntest Du mir sagen, wie ich den Code abändern muß, damit es genau so geschieht? |
Zitat:
-Entferne alle Logfileschreiben Zeilen die brauchst du indem Fall nicht. Uses Registry nicht vergessen! Würde sagen so müssts gehn:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, registry, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); function NetworkConnect : Boolean; var reg : TRegistry; i : Integer; NetworkCards : String; begin result := false; reg := TRegistry.Create(KEY_READ); reg.RootKey := HKEY_LOCAL_MACHINE; for i := 0 to 15 do //Mehr als 15 Netzwerkkarten sollte kein normaler Rechner haben... begin if reg.KeyExists('\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\' +inttostr(i)) = true then begin reg.OpenKey('\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\' +inttostr(i),false); NetworkCards := reg.ReadString('ServiceName'); // break; if NetworkCards <> '' then begin reg.OpenKey('\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\'+NetworkCards,false); if reg.ReadString('DHCPDomain') <> '' then begin result := true end else begin result := false; end; end; end; end; reg.Free; end; begin // Network Cable unplugged? if networkconnect=true then begin showmessage('Netzwerkkabel ist eingesteckt!'); end else begin showmessage('Netzwerkkabel ist ausgesteckt!'); end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 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