Fehler abfangen

  • Hallo Leute,

    nutze seit kurzem Autoit und habe auch schon was kleines gebastelt. Allerdings weiß ich nicht wie ich eventuelle Fehleingaben von Anwendern abfangen kann und dies dem Anwendermitteilen kann. Es geht darum ein Passwort über Telnet abzugleichen. Ich muß also die Fehlermeldung aus dem Dos Fenster auslesen weiß aber nicht wie?
    ier mal das was ich schon habe

    Spoiler anzeigen
    [autoit]


    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    #include

    [/autoit] [autoit][/autoit] [autoit]

    $return = MsgBox(4, "Passwortabgleich", "Hiermit wird ihr Passwort für den Genesiszugang abgeglichen.", 30)

    [/autoit] [autoit][/autoit] [autoit]

    If $return = 7 Then ;Eingabe Username
    Exit
    Else
    GUICreate("Login", 320, 120) ; will create a dialog box that when displayed is centered

    GUISetHelp("notepad") ; will run notepad if F1 is typed
    Opt("GUICoordMode",2)

    $widthCell=120
    GUICtrlCreateLabel ("Benutzername", 10, 20, $widthCell)
    $username = GuiCtrlCreateInput("", 0, -1, 150, 20)

    GUICtrlCreateLabel ("altes Novell-Passwort", -2.25*$widthcell, 0)
    $passwd = GuiCtrlCreateInput("", -30, -1, 150, 20,$ES_PASSWORD)

    GUICtrlCreateLabel ("neues Novell-Passwort", -2.25*$widthcell, 0)
    $passwd2 = GuiCtrlCreateInput("", -30, -1, 150, 20,$ES_PASSWORD)

    $Button_1 = GUICtrlCreateButton ("Passwortwechsel", -135, 10,90)
    GUICtrlSetOnEvent($Button_1, '_login')
    GUISetOnEvent($GUI_EVENT_CLOSE, '_exit')
    GUISetState () ; will display an empty dialog box
    EndIf
    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _login()

    run ("telnet.exe")
    WinWaitActive("C:\WINDOWS\system32\telnet.exe")
    send ("open cas_prod")
    send ("{ENTER}")
    WinActivate("Telnet cas_pro")
    send (GUICtrlRead($username))
    send ("{ENTER}")
    send (GUICtrlRead($passwd))
    send ("{ENTER}")
    Sleep(100)
    send ("passwd")
    send ("{ENTER}")
    Sleep(100)
    send ("{BS}")
    send (GUICtrlRead($passwd))
    send ("{ENTER}")
    Sleep(100)
    send ("{BS}")
    send (GUICtrlRead($passwd2))
    send ("{ENTER}")
    Sleep(100)
    send ("{BS}")
    send (GUICtrlRead($passwd2))
    send ("{ENTER}")
    sleep(100)
    ;send ("exit")
    ;WinClose ("Telnet cas_prod")
    MsgBox(0, "Erfolgreich", "Das Passwort wurde erfolgreich geändert. Bitte melden Sie sich jetzt im Genesis mit Ihrem bekannten Genesis Passwort hat",8)
    _exit()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc

    [/autoit]

    Danke für eure Hilfe
    Sebastian</GUIConstants.au3>

  • Ich denke den Text auszulesen ist ungefähr so schwer wie den Text aus einem 3D-Shooter zu bekommen. Mir fällt nix anderes als OCR ein. Aber das ist eine langwierige Sache, hab ich mal angefangen zu proggen aber noch nicht fertiggestellt. Vllt kannst du den Benutzer über GUIs fragen ob alles ohne Fehler verlaufen ist und falls doch ihn in einer Liste den fehler auswählen lassen den er dort liest.

  • Hm mit dem Nutzer möchte ich das eigentlich nicht machen da die meisten vom PC keine Ahung haben (sprich man kennt den Knopf zum einschalten). Es gibt ja nur einen Fehler und zwar wenn der Anwender das falsche erste Passwort eingibt und sich nicht am Server per Telnet anmelden kann. Wenn das geht geht auch der Rest. Was vielleicht noch schön wäre, wenn der Nutzer das neue Passwort zweimal eingeben muß und es vergliechen wird. Kann mir da jemand weiterhelfen?

    Danke
    Sebastian

  • Ich denke, er weiß nicht, wie er das Fenster auslesen kann
    Ich hab hier mal ein Bsp. Das gibt den Fehler bei Verbindungsaufbau fehlgeschlagen

    Spoiler anzeigen
    [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    #include <GUICONSTANTS.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $return = MsgBox(4, "Passwortabgleich", "Hiermit wird ihr Passwort für den Genesiszugang abgeglichen.", 30)

    [/autoit] [autoit][/autoit] [autoit]

    If $return = 7 Then ;Eingabe Username
    Exit
    Else
    GUICreate("Login", 320, 120) ; will create a dialog box that when displayed is centered

    GUISetHelp("notepad") ; will run notepad if F1 is typed
    Opt("GUICoordMode",2)

    $widthCell=120
    GUICtrlCreateLabel ("Benutzername", 10, 20, $widthCell)
    $username = GuiCtrlCreateInput("", 0, -1, 150, 20)

    GUICtrlCreateLabel ("altes Novell-Passwort", -2.25*$widthcell, 0)
    $passwd = GuiCtrlCreateInput("", -30, -1, 150, 20,$ES_PASSWORD)

    GUICtrlCreateLabel ("neues Novell-Passwort", -2.25*$widthcell, 0)
    $passwd2 = GuiCtrlCreateInput("", -30, -1, 150, 20,$ES_PASSWORD)

    $Button_1 = GUICtrlCreateButton ("Passwortwechsel", -135, 10,90)
    GUICtrlSetOnEvent($Button_1, '_login')
    GUISetOnEvent($GUI_EVENT_CLOSE, '_exit')
    GUISetState () ; will display an empty dialog box
    EndIf
    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _login()

    $win = run ("telnet.exe")
    $win = WinGetHandle("C:\WINDOWS\system32\telnet.exe")
    WinWaitActive($win)
    send ("open cas_prod")
    send ("{ENTER}")
    WinActivate($win)
    ;Verbindung testen
    Sleep(2000)
    If StringInStr(_getTelnetText($win),"Verbinden fehlgeschlagen") Then
    MsgBox(0,"Fehler","Verbinden fehlgeschlagen")
    Return 0
    EndIf
    ;Ende
    send (GUICtrlRead($username))
    send ("{ENTER}")
    send (GUICtrlRead($passwd))
    send ("{ENTER}")
    Sleep(100)
    send ("passwd")
    send ("{ENTER}")
    Sleep(100)
    send ("{BS}")
    send (GUICtrlRead($passwd))
    send ("{ENTER}")
    Sleep(100)
    send ("{BS}")
    send (GUICtrlRead($passwd2))
    send ("{ENTER}")
    Sleep(100)
    send ("{BS}")
    send (GUICtrlRead($passwd2))
    send ("{ENTER}")
    sleep(100)
    ;send ("exit")
    ;WinClose ("Telnet cas_prod")
    MsgBox(0, "Erfolgreich", "Das Passwort wurde erfolgreich geändert. Bitte melden Sie sich jetzt im Genesis mit Ihrem bekannten Genesis Passwort hat",8)
    _exit()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _getTelnetText($win)
    $temp = ClipGet()
    WinActivate($win)
    If Not WinActive($win) Then Return 0
    $pos = WinGetPos($win)
    MouseClick("left",$pos[0]+10,$pos[1]+10)
    Send("b")
    Send("a")
    Sleep(500)
    Send("{ENTER}")
    $return = ClipGet()
    ClipPut($temp)
    MsgBox(0, '', $return)
    Return $return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc

    [/autoit]
  • Hallo danke für die Hilfe werde es morgen gleich mal ausprobieren. Das mit dem Passwortvergleich habe ich hinbekommen. Sobald ich morgen das Ergebnis habe melde ich mich wieder.

    Schönen Abend noch.

    Sebastian

  • Hallo,

    habe jetzt das die Zeilen von progandy ausporbiert, aber so richtig gefällt es mir noch nicht. Problem ist das er jedesmal das Fenster bringt. Schön wäre wenn das Fenster nur im fehlerfall erschient und dann wieder zur Ausgangspositision zurück kehrt. Habe schon ein bißchen mit den Schleifen gespielt aber kommen nicht wirklich weiter.

    hier noch mal das aktuelle Scrip

    Spoiler anzeigen
    [autoit]


    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    #include
    #include
    #include

    [/autoit] [autoit][/autoit] [autoit]

    $return = MsgBox(4, "Passwortabgleich", "Hiermit wird ihr Passwort für den Genesiszugang abgeglichen. Dies ist nur nach einem Passwortwechsel nötig." & @CRLF & "Ihr Genesis-Passwort bleibt bestehen und ändert sich nicht!", 30)

    [/autoit] [autoit][/autoit] [autoit]

    If $return = 7 Then ;Eingabe Username
    Exit
    Else
    GUICreate("Login", 320, 140) ; will create a dialog box that when displayed is centered

    GUISetHelp("notepad") ; will run notepad if F1 is typed
    Opt("GUICoordMode",2)

    $widthCell=120
    GUICtrlCreateLabel ("Benutzername", 10, 20, $widthCell)
    $username = GuiCtrlCreateInput("", 0, -1, 150, 20)

    GUICtrlCreateLabel ("altes Novell-Passwort", -2.25*$widthcell, 0)
    $passwd = GuiCtrlCreateInput("", -30, -1, 150, 20,$ES_PASSWORD)

    GUICtrlCreateLabel ("neues Novell-Passwort", -2.25*$widthcell, 0)
    $passwd2 = GuiCtrlCreateInput("", -30, -1, 150, 20,$ES_PASSWORD)

    GUICtrlCreateLabel ("neues Novell-Passwort", -2.25*$widthcell, 0)
    $passwd3 = GuiCtrlCreateInput("", -30, -1, 150, 20,$ES_PASSWORD)

    $Button_1 = GUICtrlCreateButton ("Passwortwechsel", -135, 10,90)
    GUICtrlSetOnEvent ($Button_1,'_login')
    GUISetOnEvent($GUI_EVENT_CLOSE, '_exit')
    GUISetState () ; will display an empty dialog box


    EndIf

    [/autoit] [autoit][/autoit] [autoit]



    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _login()
    If GUICtrlRead($passwd2)=GUICtrlRead($passwd3) Then ;Vergleich der Passwörter
    $win = run ("telnet.exe")
    $win = WinGetHandle("C:\WINDOWS\system32\telnet.exe")
    WinWaitActive($win)
    send ("open cas_prod") ;Aufruf telnet mit cas_prod
    send ("{ENTER}")
    ;WinActivate("Telnet cas_pro")
    WinWaitActive($win)
    send (GUICtrlRead($username))
    send ("{ENTER}")
    send (GUICtrlRead($passwd))
    send ("{ENTER}")
    Sleep(100)
    WinActivate($win)
    ;Verbindung testen
    Sleep(2000)
    If StringInStr(_getTelnetText($win),"Verbinden fehlgeschlagen") Then
    MsgBox(0,"Fehler","Verbinden fehlgeschlagen")
    Return 0
    EndIf
    ;Ende
    send ("passwd")
    send ("{ENTER}")
    Sleep(100)
    send ("{BS}")
    send (GUICtrlRead($passwd))
    send ("{ENTER}")
    Sleep(100)
    send ("{BS}")
    send (GUICtrlRead($passwd2))
    send ("{ENTER}")
    Sleep(100)
    send ("{BS}")
    send (GUICtrlRead($passwd2))
    send ("{ENTER}")
    sleep(100)
    send ("exit")
    WinClose ($win)
    MsgBox(0, "Erfolgreich", "Das Passwort wurde erfolgreich geändert. Bitte melden Sie sich jetzt im Genesis mit Ihrem bekannten Genesis Passwort hat",8)
    _exit()
    Else
    MsgBox(0,"","Die Passwörter stimmen nicht überein")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _getTelnetText($win)
    $temp = ClipGet()
    WinActivate($win)
    If Not WinActive($win) Then Return 0
    $pos = WinGetPos($win)
    MouseClick("left",$pos[0]+10,$pos[1]+10)
    Send("b")
    Send("a")
    Sleep(500)
    Send("{ENTER}")
    $return = ClipGet()
    ClipPut($temp)
    MsgBox(0, '', $return)
    Return $return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Danke Sebastian

  • Welches Fenster denn?
    In der Func hab ich zum Testen eine MSgBox drin ( MsgBox(0, '', $return) ) Die kannst du aber entfernen.

    Spoiler anzeigen
    [autoit]

    Func _getTelnetText($win)
    $temp = ClipGet()
    WinActivate($win)
    If Not WinActive($win) Then Return 0
    $pos = WinGetPos($win)
    MouseClick("left",$pos[0]+10,$pos[1]+10)
    Send("b")
    Send("a")
    Sleep(500)
    Send("{ENTER}")
    $return = ClipGet()
    ClipPut($temp)
    MsgBox(0, '', $return)
    Return $return
    EndFunc

    [/autoit]
  • Hallo;
    habe den Fehler gefunden. Das Problem war das ich nie eine Fehlermeldung bekommen habe 8|
    in deinem Script war die Zeile

    [autoit]

    If StringInStr(_getTelnetText($win),"Verbinden fehlgeschlagen") Then

    [/autoit]

    Das war falsch (zumindest bei mir ging es so nicht). Ich habe jetzt folgendes gemacht

    [autoit]

    _getTelnetText($win)
    If StringInStr($return, "login:") Then

    [/autoit]

    Damit geht es wunderbar ob das jetzt der Weisheit letzter Schluß ist weiß ich nicht.

    Letztes Problem was mir aufgefallen ist, wenn ich mit der Maus ganz an den Anfang der Eingabezeilen klinke so springt der Coursor dort nicht hin. Ich muß mit der Maus immer in der Mitte oder am Ende der Zeile sein. Hat einer eine Idee voran das liegt? Schön wäre auch wenn der Anwender "enter" drückt das der Coursor in die nächste Zeile springt.

    Danke für die tolle Unterstützung bisher
    Grüße
    Sebastian

  • Zitat

    Letztes Problem was mir aufgefallen ist, wenn ich mit der Maus ganz an den Anfang der Eingabezeilen klinke so springt der Coursor dort nicht hin


    Deine Label sind zu lange. Diese überlagern die Input-Box, sodass man nicht mehr reinklicken kann.
    Das mit dem Enter kannst du so machen:
    Alle Inputs direkt hintereinander erstellen, Dazwischen KEINE anderen Controls wie Label !

    Spoiler anzeigen
    [autoit]

    $input1 = GuictrlcreateInpuBox
    GUIctrlSetOnEvent(-1, "_NextBox")
    $input2 = GuictrlcreateInpuBox
    GUIctrlSetOnEvent(-1, "_NextBox")
    $input3 = GuictrlcreateInpuBox
    GUIctrlSetOnEvent(-1, "_NextBox")
    $input4 = GuictrlcreateInpuBox
    GUIctrlSetOnEvent(-1, "_NextBox")

    [/autoit] [autoit][/autoit] [autoit]

    Func _NextBox()
    If @GUI_CTRLID >= $input1 And @GUI_CTRLID < $input3
    GUICtrlSetState(@GUI_CTRLID+1,$GUI_FOCUS)
    Endif
    EndFunc

    [/autoit]
    Zitat

    in deinem Script war die Zeile

    [autoit]

    If StringInStr(_getTelnetText($win),"Verbinden fehlgeschlagen") Then

    [/autoit]

    Das war falsch (zumindest bei mir ging es so nicht). Ich habe jetzt folgendes gemacht

    [autoit]

    _getTelnetText($win)
    If StringInStr($return, "login:") Then

    [/autoit]

    Damit geht es wunderbar ob das jetzt der Weisheit letzter Schluß ist weiß ich nicht.

    Hast du dir den Text angesehen? Bei mir konnte ich nicht verbinden. Dieser Text war für Verbinden fehlgeschlagen. Die Variable Return darfst du bicht abfragen, die ist nur Funktionsintern Du solltest es so machen:

    [autoit]

    If StringInStr(_getTelnetText($win), "login:") Then

    [/autoit]
  • Hallo Progandy,

    ein gesundes neues Jahr wünsche ich dir noch. Danke für deine Hilfe das mit dem Zeilensprunge per Enter funktioniert. Aber sag mir bitte warum ich die return Variable nicht nehmen darf? Mit der Msgbox ist das leider nicht so schön da der Anwender sie ja immer sieht. Ich dachte mit die return Variable enthält das was ausgegeben wird in der Msgbox?

    Grüße
    Sebastian

  • a, aber die Variable ist nur Funktionsintern gedacht. Der Inhalt wird mit return zurückgegeben. Die MsgBox kannst du einfch aus der Funktion löschen:

    Spoiler anzeigen
    [autoit]

    Func _getTelnetText($win)
    Local $temp = ClipGet()
    WinActivate($win)
    If Not WinActive($win) Then Return 0
    Local $pos = WinGetPos($win)
    MouseClick("left",$pos[0]+10,$pos[1]+10)
    Send("b")
    Send("a")
    Sleep(500)
    Send("{ENTER}")
    Local $return = ClipGet()
    ClipPut($temp)
    Return $return
    EndFunc

    [/autoit]
  • aha, jetzt weiß ich wo der Fehler war. Ich habe natürlich die MsgBox gelöscht aber ich hatte ich in der Funktion vor $temp = ClipGet() kein Local stehen. Jetzt geht es wunderbar, vielen Dank für deine ausführliche Hilfe.

    Grüße
    Sebastian

    PS: Problem gelöst und kann geschlossen werden.