![]() |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
wenn mein Rechner nicht mit dem Switch verbunden ist, so bekomm ich als IP immer die localhost-adresse. Sobald eine Verbindung besteht hat er die IP, wie ich sie festgelegt habe (192.168.10.1)
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Hat jetzt mein Code wirklich bei keinem Funktioniert?
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Wenn du eine schreibgeschützte Datei auf ein Netzlaufwerk packts, auf das alle clients Zugriff haben, müsste doch fileexists gehen, oder?
Ratte |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
also ich hab mal bei mir in die registry geschaut. da existieren die werte, die du da abfrgats nicht mal
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Hatte mich auch schon mit dem Thema rumgeärgert. Die Sachen mit Registry und MAC Adresse fallen raus, da das mit der Reg auf jedem Windows unterschiedlich ist und die MAC bei Entfernen des Kabels erhalten bleibt.
Habe aber gerade etwas gefunden bei delphi3000.com. bin mal so frei und liste den verwendeten Code:
Delphi-Quellcode:
Bei mir funktioniert das wunderbar, nach dem Rausziehen dauert es circa 5 sek, beim Reinstecken 1/2 sek bis es umschlägt.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, WinSock, ExtCtrls; type TForm1 = class(TForm) Button2: TButton; Timer1: TTimer; CheckBox1: TCheckBox; procedure Button2Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } function DetectHostIP: boolean; end; var Form1: TForm1; HostIP:String='Unknown'; implementation {$R *.dfm} function TForm1.DetectHostIP: Boolean; var wsdata: TWSAData; hostname: array[0..255] of char; hostEnt: PHostEnt; addr: PChar; begin WSAStartup($0101,wsdata); try gethostname(hostname,sizeof(hostname)); hostEnt := gethostbyname(hostname); if Assigned(hostEnt) then if Assigned(hostEnt^.h_addr_list) then begin addr := hostEnt^.h_addr_list^; if Assigned(addr) then begin HostIP := Format('%d.%d.%d.%d',[byte(addr[0]),byte(addr[1]),byte(addr[2]),byte(addr[3])]); Result := True; end else Result := False; end else Result := False else begin MessageDlg(Format('WinSock Error %d', [WSAGetLastError]),mtError,[mbOK],0); Result := False; end; finally WSACleanup; end; end; procedure TForm1.Button2Click(Sender: TObject); begin if DetectHostIP=True then ShowMessage(HostIP); end; procedure TForm1.Timer1Timer(Sender: TObject); begin if DetectHostIP=True then if HostIP <> '127.0.0.1' then CheckBox1.Checked := True //CheckBox sagt: Netzwerkkabel steckt else CheckBox1.Checked := False; //oder halt net end; end. Das Problem ist allerdings: Bei meinem Centrino 1.5 braucht das Prog 20% CPU. Das darf natürlich nicht sein. Habe aber grad keine Lust da ich morgen ne Algebra Klausur schreibe. Aber werde mich damit weiter befassen. Ciao Thomas |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Evtl. ist das hier was du suchst:
![]() ![]() |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Leider nein :?
Mir geht es ja um die lokale IP und keine Interneteinwahl. Aber nochmal zur Überlegung. Was soll angezeigt werden?
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Liste der Anhänge anzeigen (Anzahl: 1)
Hab's geschafft! Nach langem hin- und her hab ich die WMI zum laufen bekommen. Es werden jetzt alle Netzwerkadapter ausgegeben, die auch in "Netzwerkverbindungen" stehen, deren MAC-Adresse und Status (Connected/NOT Connected).
Probiert es mal bitte unter anderen OS als XP/SP1 aus und postet mal die Resultate.
Delphi-Quellcode:
Eingebunden wird das dann folgendermaßen:
unit UNetWMI;
interface uses // Delphi VCL Units Classes, Variants; // external forward declarations function getSystemMACAddresses: TStringList; implementation uses // Delphi VCL Units Windows, Dialogs, ComObj, ActiveX, // Imported type libraries WbemScripting_TLB; { Typelib name: "Microsoft Windows WMI Scripting V1.2 Library" } const // define used constants WMI_LOCAL_COMPUTER = '.'; WMI_SYSTEM_NAMESPACE = 'root\CIMV2'; WMI_CLASS_NIC = 'Win32_NetworkAdapter'; WMI_ATTRIB_ADAPTER = 'AdapterType'; WMI_ATTRIB_AVAILAB = 'NetConnectionID'; WMI_ATTRIB_CONNSTAT = 'NetConnectionStatus'; WMI_ATTRIB_MAC = 'MACAddress'; WMI_ATTRIB_NAME = 'Name'; // retrieve System MAC Addresses via WMI // function getSystemMACAddresses: TStringList; var l_WMILocator: ISWbemLocator; // Locator, gets Services l_WMIServices: ISWbemServices; // Services, gets Object Definitions l_WMIObjectDefinition: ISWbemObject; // Definition, gets Set of Objetcs l_WMIObjectSet: SWbemObjectSet; // ObjectSet, gets Enum over Instances l_WMIObjectInstances: IEnumVariant; // Enum of Instances, gets Object l_WMIObject: ISWbemObject; // Object, gets Sets of his properties l_WMIPropertySet: ISWbemPropertySet; // PropertySet, gets single property l_WMIProperty: ISWbemProperty; // Property, gets Value l_TempObj: OleVariant; // temporary used values l_ObjValue: Cardinal; begin // create the return object result := TStringList.Create; // retrieve object enum through WMI classes l_WMILocator := CoSWbemLocator.Create; l_WMIServices := L_WMILocator.ConnectServer(WMI_LOCAL_COMPUTER, WMI_SYSTEM_NAMESPACE, '', '', '', '', 0, nil); l_WMIObjectDefinition := l_WMIServices.Get(WMI_CLASS_NIC, wbemFlagUseAmendedQualifiers, nil); l_WMIObjectSet := l_WMIObjectDefinition.Instances_(0, nil); l_WMIObjectInstances := (l_WMIObjectSet._NewEnum) as IEnumVariant; // iterate through enum values (WbemObjects) and get the property values while (l_WMIObjectInstances.Next(1, l_TempObj, l_ObjValue) = S_OK) do begin l_WMIObject:= IUnknown(l_TempObj) as SWBemObject; l_WMIPropertySet := l_WMIObject.Properties_; l_WMIProperty := l_WMIPropertySet.Item(WMI_ATTRIB_AVAILAB, 0); if not VarIsNull(l_WMIProperty.Get_Value) then begin result.Add(l_WMIProperty.Get_Value); l_WMIProperty := l_WMIPropertySet.Item(WMI_ATTRIB_NAME, 0); if not VarIsNull(l_WMIProperty.Get_Value) then result.Append(' - '+l_WMIProperty.Get_Value); l_WMIProperty := l_WMIPropertySet.Item(WMI_ATTRIB_MAC, 0); if not VarIsNull(l_WMIProperty.Get_Value) then result.Append(' - '+l_WMIProperty.Get_Value) else result.Append(' - MAC-Address not available'); l_WMIProperty := l_WMIPropertySet.Item(WMI_ATTRIB_ADAPTER, 0); if not VarIsNull(l_WMIProperty.Get_Value) then result.Append(' - '+l_WMIProperty.Get_Value) else result.Append(' - Network Type not available'); l_WMIProperty := l_WMIPropertySet.Item(WMI_ATTRIB_CONNSTAT, 0); if l_WMIProperty.Get_Value=2 then result.Append(' - Status: Connected') else result.Append(' - Status: NOT Connected'); result.Add(''); end; end; end; end.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin ListBox1.Items := getSystemMACAddresses; end; Wer die WMI Library braucht, ![]() Anbei mal mein Versuchsprojekt :dp: |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
also ich habs mal getestet ! bei mir unter WinXP home gehts einwandfrei allerdings unter WinME gehts gar nicht.
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Hmm, hab gerade gesehen dass es NetConnectionID erst ab XP gibt. Da ich kein Win98/ME mehr habe, wäre es schön wenn vielleicht jemand für diese Windows-Versionen was findet.
Die Funktionen von Win32_NetworkAdapter findet ihr ![]() [edit] @novabeat: kannst du mir bitte eine genaue Fehlerbeschreibung geben. An welcher Zeiler hängt es unter ME, etc? Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz