Also eine einfaches Zurücksetzen der Variable %IP an einer bestimmten Stelle tut es nicht? Im Übrigen hatte ich die Variablen anfänglich auf Global, ich habe halt schon oft Pferde kotzen sehen, und siehe da es funktionierte plötzlich, obwohl vielleicht unlogisch...
Ip Aktualsierung funktionieert nicht
-
casi4712 -
9. Juni 2022 um 15:40 -
Unerledigt
-
-
Wenn du meine Änderung noch drinne hast, finde ich es nicht unlogisch.
Denn, nun wird geprüft ob du wirklich einen String zurück bekommst, ansonsten konnte er es nicht auslesen = keine Verbindung.
-
HAllo MOmbas, welche Änderung meinst du konkret, diese hier?
Code;Zeile 27/28: Local $sHost= "localhost" ;Außerhalb einer Funktion deklariert, also muss hier Global stehen! Local $Gateway, $nMsg ;Außerhalb einer Funktion deklariert, also muss hier Global stehen!
also alles auf global setzen?
Kleiner Zwischenstand:
#
AutoIt
Alles anzeigen#cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.16.0 Author: myName Script Function: Template AutoIt script. #ce ---------------------------------------------------------------------------- ; Script Start - Add your code below here #include-once #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <String.au3> #include <WinApi.au3> #include <WindowsConstants.au3> #include <MsgBoxConstants.au3> Global $ARRAY_COLOR_TOP_MIN[3] = [36, 65, 142] Global $ARRAY_COLOR_TOP_MAX[3] = [11, 42, 122] Global $RBOX_EVENT_CLOSE = 1 Global $ROUNDES = 20, $LastHwnd = 0 Global $LastHwnd Global $GUIBKCOLOR = 0xFFFFFFFF global $sHost= "localhost" global $Gateway, $nMsg global $IP = "Kein Netz" Global $IPLabel Global $HostLabel ; processing ------------------------------------------------------------------- AdlibRegister('_ActiveIP', 50) Global $hGui = RBoxCreate("IP CHECK", 400, 200) ;_createButtons() _createLabels() While True CheckX($hGui, $RBOX_EVENT_CLOSE, "GuiCtrlSetColor(" & $RBOX_EVENT_CLOSE & ",0xA3A3A3)", "GuiCtrlSetColor(" & $RBOX_EVENT_CLOSE & ",0x555555)") local $gMsg = GUIGetMsg() Switch $gMsg Case $GUI_EVENT_CLOSE, $RBOX_EVENT_CLOSE GUIDelete($hGui) AdlibUnRegister('_ActiveIP') Exit EndSwitch WEnd ; functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Func _createLabels() $HostLabel = GUICtrlCreateLabel( $sHost, 10, 85, 980, 20 ) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetFont(-1, 9, 800) ; bold $IPLabel = GUICtrlCreateLabel( $ip, 10, 60, 980, 20 ) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetFont(-1, 9, 800) ; bold EndFunc Func _createButtons() EndFunc ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Func _ActiveIP() Local $objAdapter Local $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $sHost & "\root\cimv2") If Not IsObj($objWMIService) Then Return SetError(1, 0, 0) Local $colAdapter = $objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration WHERE IPEnabled = True", "WQL", 0x30) If Not IsObj($colAdapter) Then Return SetError(1, 0, 0) For $objAdapter In $colAdapter If ($objAdapter.IPAddress(0)) Then If $objAdapter.DefaultIPGateway(0) Then If IsString($objAdapter.IPAddress(0)) and _ IsString($objAdapter.DefaultIPGateway(0)) Then $IP = $objAdapter.IPAddress(0) GUICtrlSetData($IPLabel, $IP) $Gateway = $objAdapter.DefaultIPGateway(0) ;- GUICtrlSetData($GatewayLabel, $Gateway) Return Else GUICtrlSetData($IPLabel , "Kein Netz") GUICtrlSetData($GatewayLabel, "") Endif EndIf EndIf Next EndFunc ;==>_ActiveIP ;;;;;;;;;;;;;;BOX-Style;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Func RBoxCreate($Title, $width, $height, $left = -1, $top = -1, $show = 1) Local $GUI = GUICreate($Title, $width, $height, $left, $top, $WS_POPUP) ;GUICtrlCreatePic('C:\Windows\Temp\hg.jpg', 0, 25, 920, 660) GUICtrlSetState(-1, $GUI_DISABLE) GUISetBkColor($GUIBKCOLOR, $GUI) ;_GuiRoundCorners($GUI,0,0,$ROUNDES,$ROUNDES) $RBOX_EVENT_CLOSE = GUICtrlCreateLabel('X', $width - 20, 3, 25, 25) GUICtrlSetCursor($RBOX_EVENT_CLOSE, 0) GUICtrlSetBkColor($RBOX_EVENT_CLOSE, -2) GUICtrlSetFont($RBOX_EVENT_CLOSE, 15, 800) GUICtrlSetColor($RBOX_EVENT_CLOSE, 0x555555) $Title &= " " Local $hTitle = GUICtrlCreateLabel($Title, 0, 0, $width - 20, 26, $SS_CENTER, $GUI_WS_EX_PARENTDRAG) GUICtrlSetFont($hTitle, 17, 400, 0, "Consolas") GUICtrlSetBkColor($hTitle, -2) Local $Graphic = GUICtrlCreateGraphic(0, 0, $width, 25) GUICtrlSetState($Graphic, $Gui_DISABLE) ;GradientFill($Graphic, 0, 0, $width, 25, $ARRAY_COLOR_TOP_MIN, $ARRAY_COLOR_TOP_MAX) If $show = 1 Then GUISetState(@SW_SHOW, $GUI) Return $GUI EndFunc Func CheckX($hGui, $CtrlID, $sCMD, $eCMD) Local $cGui = GUIGetCursorInfo($hGui) If Not IsArray($cGui) Then Return 0 EndIf If $LastHwnd <> $cGui[4] And $cGui[4] = $CtrlID Then Return Execute($sCMD) + Assign("LastHwnd", $cGui[4]) If $LastHwnd <> $cGui[4] Then Return Execute($eCMD) + Assign("LastHwnd", $cGui[4]) EndFunc
-
Nein, ich meine diese hier (hier fehlt immer noch das Auskommentieren in Zeile 103, siehe unten). Und pack mal das Return hinter die if Abfrage (bzw. das kann eigentlich weg, da du nichts zurück gibst)), das habe ich versehentlich mit rein kopiert.:
Code
Alles anzeigenIf ($objAdapter.IPAddress(0)) Then If $objAdapter.DefaultIPGateway(0) Then If IsString($objAdapter.IPAddress(0)) and _ IsString($objAdapter.DefaultIPGateway(0)) Then $IP = $objAdapter.IPAddress(0) GUICtrlSetData($IPLabel, $IP) $Gateway = $objAdapter.DefaultIPGateway(0) ;- GUICtrlSetData($GatewayLabel, $Gateway) Else GUICtrlSetData($IPLabel , "Kein Netz") ;- GUICtrlSetData($GatewayLabel, "") Endif EndIf EndIf ;- Return ;wird eigentlich nicht benötigt, da du keinen Wert zurück gibst.
Und ob du wirklich alle !50! Millisekunden die Abfrage laufen lassen willst, solltest du dir echt überlegen.
Das bedeutet, das diese Abfrage 20mal je Sekunde läuft und ist daher total überdimensioniert. Die Default 250ms sind schon in Ordnung, wobei auch 500ms gehen würden.
-
Mal ein Tipp für den Einsatz von Adlib-Funktionen.
Es kann immer mal passieren, dass du die Aufrufsequenz etwas zu häufig gewählt hast und die Funktion dann erneut aufgerufen wird, obwohl sie vom ersten Aufruf noch nicht fertig ist.
Deshalb angewöhnen bei kurzen Aufrufintervallen:
AutoItFunc _myAdlib() AdlibUnregister('myAdlib') ; Adlibfunktion bei Eintritt in die Funktion deregistrieren ; ... was zu tun ist in der Funktion AdlibRegister('myAdlib') ; Bei Verlassen der Funktion erneut registrieren EndFunc
Systeminfos hole ich mir gerne mit Powershell:
AutoIt
Alles anzeigen#include <Array.au3> $aAdapter = _PS_GetActiveAdapterShortInfo() If IsArray($aAdapter) Then _ArrayDisplay($aAdapter, 'Active Network Adapters', '', 0, Default, 'Description|IPAddress|DefaultIPGateway|IPSubnet|DHCPEnabled') EndIf Func _PS_GetActiveAdapterShortInfo() Local $sCmd = 'Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | ' & _ 'Select-Object -Property Description,IPAddress,DefaultIPGateway,IPSubnet,DHCPEnabled | ' & _ 'foreach {$_.Description + ";" + [string]$_.IPAddress + ";" + [string]$_.DefaultIPGateway + ";" + ' & _ '[string]$_.IPSubnet + ";" + $_.DHCPEnabled } | out-file $env:TEMP\__ActiveAdapt.csv -Append -Encoding UTF8' Local $FileResult = @TempDir & '\__ActiveAdapt.csv' If FileExists($FileResult) Then FileDelete($FileResult) RunWait(@ComSpec & ' /c powershell "' & StringRegExpReplace($sCmd, '([\\"])', "\\$1") & '"', @ScriptDir, @SW_HIDE) Local $aRead = StringSplit(FileRead($FileResult), @CRLF, 1), $aIface, $aAdapt[$aRead[0]+1][5] = [[0]] For $i = 1 To $aRead[0] $aIface = StringRegExp($aRead[$i], '([^;]*);([^;]*);([^;]*);([^;]*);([^;]*)', 3) If IsArray($aIface) Then $aAdapt[0][0] += 1 $aAdapt[$aAdapt[0][0]][0] = $aIface[0] $aAdapt[$aAdapt[0][0]][1] = $aIface[1] $aAdapt[$aAdapt[0][0]][2] = $aIface[2] $aAdapt[$aAdapt[0][0]][3] = $aIface[3] $aAdapt[$aAdapt[0][0]][4] = $aIface[4] EndIf Next ReDim $aAdapt[$aAdapt[0][0]+1][5] Return $aAdapt EndFunc
-
So habe die Zeile jetzt auskommentiert, und auch die Frquenz hochgesetzt, immer noch Fehlanzeige, scheint doch sehr komplex zu sein das Problem
AutoIt
Alles anzeigen#include-once #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <String.au3> #include <WinApi.au3> #include <WindowsConstants.au3> #include <MsgBoxConstants.au3> Global $ARRAY_COLOR_TOP_MIN[3] = [36, 65, 142] Global $ARRAY_COLOR_TOP_MAX[3] = [11, 42, 122] Global $RBOX_EVENT_CLOSE = 1 Global $ROUNDES = 20, $LastHwnd = 0 Global $LastHwnd Global $GUIBKCOLOR = 0xFFFFFFFF global $sHost= "localhost" global $Gateway, $nMsg global $IP = "Kein Netz" Global $IPLabel Global $HostLabel ; processing ------------------------------------------------------------------- AdlibRegister('_ActiveIP', 500) Global $hGui = RBoxCreate("IP CHECK", 400, 200) ;_createButtons() _createLabels() While True CheckX($hGui, $RBOX_EVENT_CLOSE, "GuiCtrlSetColor(" & $RBOX_EVENT_CLOSE & ",0xA3A3A3)", "GuiCtrlSetColor(" & $RBOX_EVENT_CLOSE & ",0x555555)") local $gMsg = GUIGetMsg() Switch $gMsg Case $GUI_EVENT_CLOSE, $RBOX_EVENT_CLOSE GUIDelete($hGui) AdlibUnRegister('_ActiveIP') Exit EndSwitch WEnd ; functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Func _createLabels() $HostLabel = GUICtrlCreateLabel( $sHost, 10, 85, 980, 20 ) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetFont(-1, 9, 800) ; bold $IPLabel = GUICtrlCreateLabel( $ip, 10, 60, 980, 20 ) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetFont(-1, 9, 800) ; bold EndFunc Func _createButtons() EndFunc ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Func _ActiveIP() Local $objAdapter Local $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $sHost & "\root\cimv2") If Not IsObj($objWMIService) Then Return SetError(1, 0, 0) Local $colAdapter = $objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration WHERE IPEnabled = True", "WQL", 0x30) If Not IsObj($colAdapter) Then Return SetError(1, 0, 0) For $objAdapter In $colAdapter If ($objAdapter.IPAddress(0)) Then If $objAdapter.DefaultIPGateway(0) Then If IsString($objAdapter.IPAddress(0)) and _ IsString($objAdapter.DefaultIPGateway(0)) Then $IP = $objAdapter.IPAddress(0) GUICtrlSetData($IPLabel, $IP) $Gateway = $objAdapter.DefaultIPGateway(0) Else GUICtrlSetData($IPLabel , "Kein Netz") Endif EndIf EndIf next Return EndFunc ;==>_ActiveIP ;;;;;;;;;;;;;;BOX-Style;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Func RBoxCreate($Title, $width, $height, $left = -1, $top = -1, $show = 1) Local $GUI = GUICreate($Title, $width, $height, $left, $top, $WS_POPUP) ;GUICtrlCreatePic('C:\Windows\Temp\hg.jpg', 0, 25, 920, 660) GUICtrlSetState(-1, $GUI_DISABLE) GUISetBkColor($GUIBKCOLOR, $GUI) ;_GuiRoundCorners($GUI,0,0,$ROUNDES,$ROUNDES) $RBOX_EVENT_CLOSE = GUICtrlCreateLabel('X', $width - 20, 3, 25, 25) GUICtrlSetCursor($RBOX_EVENT_CLOSE, 0) GUICtrlSetBkColor($RBOX_EVENT_CLOSE, -2) GUICtrlSetFont($RBOX_EVENT_CLOSE, 15, 800) GUICtrlSetColor($RBOX_EVENT_CLOSE, 0x555555) $Title &= " " Local $hTitle = GUICtrlCreateLabel($Title, 0, 0, $width - 20, 26, $SS_CENTER, $GUI_WS_EX_PARENTDRAG) GUICtrlSetFont($hTitle, 17, 400, 0, "Consolas") GUICtrlSetBkColor($hTitle, -2) Local $Graphic = GUICtrlCreateGraphic(0, 0, $width, 25) GUICtrlSetState($Graphic, $Gui_DISABLE) ;GradientFill($Graphic, 0, 0, $width, 25, $ARRAY_COLOR_TOP_MIN, $ARRAY_COLOR_TOP_MAX) If $show = 1 Then GUISetState(@SW_SHOW, $GUI) Return $GUI EndFunc Func CheckX($hGui, $CtrlID, $sCMD, $eCMD) Local $cGui = GUIGetCursorInfo($hGui) If Not IsArray($cGui) Then Return 0 EndIf If $LastHwnd <> $cGui[4] And $cGui[4] = $CtrlID Then Return Execute($sCMD) + Assign("LastHwnd", $cGui[4]) If $LastHwnd <> $cGui[4] Then Return Execute($eCMD) + Assign("LastHwnd", $cGui[4]) EndFunc
Um noch mal auf meine Frage zurückzukommen, spricht denn was dagegen, die Variable $IP beim Eintritt in die Funktion zurückzusetzen?
-
was dagegen, die Variable $IP beim Eintritt in die Funktion zurückzusetzen?
Wozu? In der Adlib Funktion wird die IP mit Wert besetzt, falls der nicht gelesen werden kann mit "kein Netz". Es sind also bereits beide möglichen Zustände abgedeckt. Die Variable $IP wird immer überschrieben.
-
tja komisch, wie gesagt, von dem Zustand kein Kabel ausgehend schaltet er den Zusatnd auch um, nur umgekehrt nicht, da scheint es auch keine logische Erkärung zu geben...
-
Tipp: Bau dir zu Testzwecken ein manuelles Auslesen (auf einen Button, der dann deine Funktion aufruft (inkl. einer Ausgabe in einer MsgBox ($objAdapter.IPAddress(0)) oder so und ohne die Adlib registrierung) wenn du ihn drückst).
Dann schaut du was er dir ausgibt, nachdem du das Kabel gesteckt hast und nochmal nachdem du es gezogen hast.
Du musst nun step by Step das Problem finden.
-
das hatte ich doch schon vorher, ohne Adlib, da steht dann einfach 0. Ich schätze mal es ist irgend eine Art von Timing Problem.
-
Moin,
wie schon gesagt, wenn keine IP-Adresse ermittelt wird, passiert meiner Meinung nach gar nichts.
Versuch mal das:
AutoIt
Alles anzeigen;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Func _ActiveIP() Local $objAdapter Local $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $sHost & "\root\cimv2") If IsObj($objWMIService) Then Local $colAdapter = $objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration WHERE IPEnabled = True", "WQL", 0x30) If IsObj($colAdapter) Then For $objAdapter In $colAdapter If ($objAdapter.IPAddress(0)) Then If $objAdapter.DefaultIPGateway(0) Then If IsString($objAdapter.IPAddress(0)) And IsString($objAdapter.DefaultIPGateway(0)) Then $IP = $objAdapter.IPAddress(0) GUICtrlSetData($IPLabel, $IP) $Gateway = $objAdapter.DefaultIPGateway(0) Return ; <<<<< wenn eine IP-Adresse gefunden wurde, ist hier Schluss EndIf EndIf EndIf Next Endif EndIf GUICtrlSetData($IPLabel, "Kein Netz") ; <<<<< ansonsten landen wir hier EndFunc ;==>_ActiveIP
Wenn der Adapter beim Verbindungsverlust die letzte IP-Adresse hält, nützt das allerdings auch nicht.
-
Velted Ob du das nun mit Return rausspringen und ansonsten das letzte Guictrlsetdata ausführst oder das mit dem else block oben machst (wie es in meiner Änderung steht) ist vollkommen egal und eher Geschmackssache (ich mag lieber klare Else definitionen). Aber eine Sache fällt mir beim Schreiben durchaus auf: Für alle anderen "Else" Fälle gibt es keine Definition in meiner Variante und somit keine Rücksetzung, daher:
casi4712 : Entweder du nimmst die Variante von Velted oder mach es so:
AutoIt
Alles anzeigenFunc _ActiveIP() Local $objAdapter Local $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $sHost & "\root\cimv2") $IP = 'kein Netz' ;Auf Default zurücksetzen $Gateway = '' ;Auf Default zurücksetzen If IsObj($objWMIService) Then Local $colAdapter = $objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration WHERE IPEnabled = True", "WQL", 0x30) If IsObj($colAdapter) Then For $objAdapter In $colAdapter If ($objAdapter.IPAddress(0)) Then If $objAdapter.DefaultIPGateway(0) Then If IsString($objAdapter.IPAddress(0)) And _ IsString($objAdapter.DefaultIPGateway(0)) Then $IP = $objAdapter.IPAddress(0) ;Wird nur gesetzt, wenn etwas gefunden wurde $Gateway = $objAdapter.DefaultIPGateway(0) ;Wird nur gesetzt, wenn etwas gefunden wurde ;~ Exitloop ;Optional! Mit Exitloop: Ausgabe ERSTER Fund, Ohne Exitloop: Ausgabe LETZTER Fund! EndIf EndIf EndIf Next Endif EndIf GUICtrlSetData($IPLabel, $IP) ;Wird immer gesetzt: Default, wenn nichts gefunden wurde oder die IP EndFunc ;==>_ActiveIP
-
Moombas: Gefällt mir auch besser!
-
casi4712 :Mit der Änderung aus Beitrag #52 könnte es klappen. Gelesen hast du es ja schon, wie sieht es mit einem Test aus?
-
Ich würde empfehlen, dass ganze in eine Funktion auszulagern. Das macht es übersichtlicher und einfacher zu nutzen.
AutoIt
Alles anzeigen;check for ips and get them $arIps = _activeIPs() If @error Then MsgBox(16, "Error", "IP Information could not be received: "&@error) Else If UBound($arIps) > 0 Then ConsoleWrite($arIps[0][0]&" - "&$arIps[0][0]&@crlf) ; Or the guictrlsetdata EndIf EndIf ; only check Local $check = _activeIPs(Default, True) If @error Then MsgBox(16, "Error", "IP Information could not be received: "&@error) ElseIf $check Then MsgBox(48, "", "Online") Else MsgBox(48, "", "Offline") EndIf Func _activeIPs($sHost = "127.0.0.1", $checkOnly = False) Local $arIPs[1][2], $count = 0 Local $objAdapter Static $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $sHost & "\root\cimv2") If Not IsObj($objWMIService) Then return SetError(1) Local $colAdapter = $objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration WHERE IPEnabled = True", "WQL", 0x30) If Not IsObj($colAdapter) Then return SetError(2) For $objAdapter In $colAdapter $sIp = $objAdapter.IPAddress(0) $sGW = $objAdapter.DefaultIPGateway(0) If $sIp or $sGW and IsString($sIp) or IsString($sGW) Then If $checkOnly Then return True ReDim $arIPs[$count+1][2] $arIPs[$count][0] = $sIp $arIPs[$count][1] = $sGW $count+=1 EndIf Next If $checkOnly Then return False return $arIPs EndFunc
Es kann also ein Array mit IP/Gateway gesucht werden oder nur getestet werden, ob eines vorhanden ist.
Ich hab auch das WMI-Object static gemacht (Static $objWMIService), da das Objekt nur beim ersten mal erfolgreich erstellt wurde und ab dem zweiten Call fehlschlug.
Scheinbar kann man nicht mehrere Objekte davon in einem Programm erstellen/nutzen, dementsprechend hab ich mit static dafür gesorgt, dass es nur einmal erstellt wird und nicht öfter (vmtl. muss man eigentlich nen close call an dem Objekt machen oder so).
-
_PS_GetActiveAdapterShortInfo()
Wenn IPv4 und IPv6 aktiviert ist, arbeitet die Funktion (StringRegExpReplace) nicht korrekt.
Schau selbst:
-
Bingo Velted: Jetzt funktioniert es so wie es soll, und macht auch Sinn so. Auch Mombas und allen anderen einen recht herzlichen Dank. Die Änderung aus Beitrag 52 hatte ich ja bereits eingearbeitet. Ich immer mit meinen Zangengeburten...
lg und einen schönen Feierabend
Chris
-
casi4712 : Das Problem hierbei war schlicht und einfach: Du hast viele If-Bedingungen aber nie den "not" bzw. "else" Fall bearbeitet. Wenn du den Stecker ziehst ist das Ergebnis wohl kein Objekt und du springst somit früher raus, wofür es keine Behandlung gab, in allen anderen Fällen jedoch funktionierte.
Versuch mal immer auch den "Else" Fall abzuarbeiten. Wenn de rcode steht kannst du immer noch schauen ob du diese besser zusammen fassen kannst (was hier bei Velted und meiner letzten Variante der Fall ist). Dann stolperst du weniger.
-
Noch eine Idee:
Versuche doch mal dein Skript an das Event-Log zu koppeln. Ist natürlich nur dann sinnvoll, wenn bei jedem deiner möglichen Fälle auch ein Logeintrag erfolgt. Dazu findest du in <Ereignisanzeige><Windows-Protokolle><System> alle relevanten Einträge. Einen betreffenden markieren, "Aktion" - "Aufgabe an dieses Ereignis anfügen..." auswählen und damit dein Skript zum IP-Check immer einmalig bei Auftreten des Ereignisses starten.
-
ok Mombas, stimmt hatte ich schlichtweg vergessen. @Bug, wäre auch eine Idee, werden ich bei Gelegenheit mal ausprobieren. Danke erst mal an alle Mithelfenden
lg
Chris
-