Fehler abfangen und speichern

  • Hallo erst mal an alle,

    vorab möchte ich gleich sagen das ich neu mit AutoIT bin und würde gerne wissen ob jemand mit gleichen Problemen schon zusammengestoßen ist und wie er die gelöst hat. Und zwar Betrieb, in dem ich arbeite, hat eine sehr große Infrastruktur. Dementsprechend sind hier sehr viele Rechner verschiedener Art. Nun haben wir hier OCS-Inventory laufen und bis jetzt wurde aber die ganze Softwareinstallation entweder per Hand oder per Batchscript geführt. Allerdings klappte bzw. klappt nicht jede Installation per Batchscript. Nun wurde ich beauftragt die Installation über OCS und AutoIT zu machen. Da ich schon mit AutoHotkey gearbeitet habe kommt mir alles bekannt vor und es dürfte nicht all so schwer sein im AutoIT den Anfang zu finden.

    Nun zu Frage:

    Da bei uns sehr viele verschieden Systemen vorhanden sind und auf verschiedenem Stand, können bei dem Script auch verschiedene Fehler auftreten wie z.B. ein Programm läuft im Hintergrund und lässt den Setup oder Update nicht weiter laufen. Diese Sache kann man natürlich ausschließen in dem man eine If-Schleife setzt, allerdings muss dieses Problem ja erst mal bekannt sein. Unsere Lösung bzw. der Anfangsgedanke ist, das man die Fehler mit dem selben AutoIT-Installationsscript (so nenne ich den mal) versucht aufzufangen und in die Registery einträgt. Bei OCS kann man dann sehen ob ein Rechner auf aktuellstem Stand ist oder nicht und guckt nach ob in der Registery Fehler bei Installation eingetreten sind. Klingt das so realistisch oder hat jemand eine andere Lösung parat? Fehler abfangen wolten wir über das aktive Fenster machen, also normaler weise wenn ein Fehler kommt, wird er ja nach vorne katapultiert. (Also wenn ich mich nicht irre, kann man mit AutoIT das Fenster dann ansprechen und den Inhalt dann in die Registery eintragen)

    Nach dem dann der Fehler bekannt ist kann man ja dementsprechend reagieren und das Script editieren und die Ausnahme bzw. die Regel einfügen...

    Alle Tipps und Tricks sind willkommen.

    Danke euch schon im Voraus

    Mix

  • Hi!

    Wie ich das lese möchtest du ein Fehlermanagement aufstellen, besser ist gleich darauf zu achten das die geupdateten Programme geschlossen sind u. bei der Installation zu prüfen was angelegt werden konnte und was nicht Fehler in ein Log Schreiben, ggf die Routine beim Herunterfahren o. Neustart des Rechners auszuführen.


    Hilfreiche Funktionen:

    [autoit]

    _WinAPI_GetLastError

    [/autoit]
    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _WinAPI_GetErrorMessage
    ; Description ...: Returns the calling threads last error message
    ; Syntax.........: _WinAPI_GetErrorMessage($iError)
    ; Parameters ....: $iError - the error code to transalte to a message
    ; Return values .: Success - Last error message
    ; Author ........: Paul Campbell (PaulIA)
    ; Modified.......: jpm, danielkza, Valik, ProgAndy
    ; Remarks .......:
    ; Related .......: _WinAPI_GetLastError
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func _WinAPI_GetErrorMessage($iError)
    Local $tBufferPtr = DllStructCreate("ptr")
    Local $pBufferPtr = DllStructGetPtr($tBufferPtr)

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

    Local $nCount = _WinAPI_FormatMessage(BitOR($__WINAPICONSTANT_FORMAT_MESSAGE_ALLOCATE_BUFFER, $__WINAPICONSTANT_FORMAT_MESSAGE_FROM_SYSTEM), _
    0, $iError, 0, $pBufferPtr, 0, 0)
    If @error Then Return SetError(@error, 0, "")

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

    Local $sText = ""
    Local $pBuffer = DllStructGetData($tBufferPtr, 1)
    If $pBuffer Then
    If $nCount > 0 Then
    Local $tBuffer = DllStructCreate("wchar[" & ($nCount + 1) & "]", $pBuffer)
    $sText = DllStructGetData($tBuffer, 1)
    EndIf
    _WinAPI_LocalFree($pBuffer)
    EndIf

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

    Return $sText
    EndFunc ;==>_WinAPI_GetErrorMessage

    [/autoit]

    lg Keiner

    Einmal editiert, zuletzt von Kleiner (19. Juli 2011 um 14:15)

  • Kleiner:

    Ja das ist richtig, wir suchen nach einem Fehlermanagement, welches und erlaubt die Scripte dann zu verbessern. Aber, wie ich schon geschrieben habe haben wir eine große Infrastruktur hier und auf verschiedenen Rechner sind verschieden Software. Aber alle Rechner haben etwas gemeinsam z.B. Firefox, Thunderbird usw. Die Programme zu schließen, die geupdatet werden sollen, ist gar kein Problem. Allerdings beißen sich manche Programme mit irgendwas, was man nicht vorhersehen kann. Zum Beispiel: Wenn man MapiConnector updated und Outlook läuft, dann geht der update nicht erfolgreich durch d.h. wird diese Ausnahme selbstverständlich in das Script eingebaut, sodass der Outlook geschlossen wird. Aber das ist ja schon bekanntes Problem und mir geht es um unbekannte. Bei ca. 800-1000 Rechner ist es so eine Sache, das es einige Probleme austreten und diese sollen am besten in der Registery oder in einem Log (Reg. finde ich persönlich besser) gespeichert werden.

    Ich bin gerade dabei zu gucken ob man es über Prozesse selbst macht, so das der Fehler erkannt wird, also SohnProzess usw. Dies kenne ich aber nur vom Unix-Welt, bei Windows habe ich mich damit noch nicht auseinander gesetzt.

    Grüße
    Mix

  • Du musst ein Muster haben, an dem du den Fehler erkennen kannst. Ansonsten kannst du nicht zwischen Fehler und Erfolg unterscheiden. Registryeinträge sind für solche Zwecke eine schlechte Lösung, hier sollte immer eine Logdatei in irgend einem Format her, eventuell auch eine kleine Datenbank, z.B. SQLite.

    Du kannst auch einen zentralen Fehlerserver aufstellen. Tritt ein Fehler auf, sendet das Skript den Fehler und alle nötigen Informationen (Fehlerskript, PC, Nutzer, evtl. Installierte Programme etc) and den Server und dieser erstellt dann einen Eintrag im globalen Fehlerprotokoll.

  • Du musst ein Muster haben, an dem du den Fehler erkennen kannst. Ansonsten kannst du nicht zwischen Fehler und Erfolg unterscheiden. Registryeinträge sind für solche Zwecke eine schlechte Lösung, hier sollte immer eine Logdatei in irgend einem Format her, eventuell auch eine kleine Datenbank, z.B. SQLite.

    Du kannst auch einen zentralen Fehlerserver aufstellen. Tritt ein Fehler auf, sendet das Skript den Fehler und alle nötigen Informationen (Fehlerskript, PC, Nutzer, evtl. Installierte Programme etc) and den Server und dieser erstellt dann einen Eintrag im globalen Fehlerprotokoll.

    Das ist richtig wir bräuchten ein Muster wie wir die Fehler erkennen. Nun stoße ich wahrscheinlich schon an meine Grenzen und komme nicht drauf wie man am besten die Fehler erkennt. Hat den wer eine Idee wie man an die Sache ran geht? Ich bitte nicht um ein fertiges Script :) sondern nur um Tipps.

    Wegen dem zentralen Fehlerserver ist gar keine schlechte Idee, allerdings brauchen wir erst mal ein funktionierendes Muster was die Fehler erkennt.

    Grüße
    Mix

    EDIT:

    Mir ist jetzt was in den Sinn gekommen und ich möchte gerne wissen was ihr davon haltet:

    Und zwar wenn ein Script ein Programm installieren soll, macht er am Anfang eine Auflistung der laufenden Prozesse. Wenn dann Installation fehlschlägt bzw. hängen bleibt (z.B. ein Fehler wird angezeigt), so wird eine erneute Auflistung der Prozesse gemacht. Von den Prozessen die neu dazu gekommen sind werden die Fenster gesucht. Ist kein Fenster für den Prozess vohanden wird er nicht gelogt, die neue Prozesse + Fensterinhalt werden gelogt. So kann man davon ausgehen das auch wenn 3 Fensterinhalte gelogt werden, das 1 davon den Fehler beinhaltet.

    Was hält ihr von der Idee?

    Einmal editiert, zuletzt von Mix (20. Juli 2011 um 09:33)

  • Um unerwartete Fehler zu erkennen musst du eigentlich nur prüfen ob alles so gelaufen ist wie du es gerne gehabt hättest. Bei einer Programminstallation werden bei Erfolg höchstwahrscheinlich Registry Schlüssel angelegt auf deren Existenz du prüfen kannst. Ausserdem kannst du grundsätzlich alle Rückgabewerte/Errorcodes deiner Funktionsaufrufe (z.B. controlcommand war fehlerhaft...) loggen. Eine Liste aller laufenden Prozesse schadet sicher auch nicht, genauso wie sämtlichen anderen Informationen über die Workstation, also OS Version, IP, Username usw. Vielleicht kann es auch wertvolle Informationen liefern wenn du einen Screenshot erstellst wenn ein controlclick ins leere lief, denn das könnte z.B. bedeuten, dass der Setup eine eigene Fehlermeldung einblendet anstelle der nächsten Seite auf der sich der Button befindet. Das ganze log Verzeichnis sollte automatisiert an dich oder eine zentrale Stelle weitergeleitet werden. Hier ist dann anzuraten neue logs mit einem "Soll Log" zu vergleichen und es nur dann zu speichern wenn es vom Normalzustand abweicht. So hast du dann alle Logs die ungewöhnlich waren und kannst vielleicht ein Schma erkennen, wie z.B. alle die einen Fehler hatten hatten auch Program XYZ nebenher laufen oder setzen WIN_XP ein, oder befinden sich in einem speziellen Netz ohne Internetanbindung, oder aber haben nur sehr eingeschränkte Berechtigungen usw.