Errors abfangen Fehler beheben

  • Hallo Zusammen,

    ich habe ein Script geschrieben um gewisse Daten aus einem Computer auszulesen. Hintergrund ist der, das wir gerne eine Art Audit über Reboots etc machen.

    Spoiler anzeigen
    [autoit]


    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.8.1
    Author: ****

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

    Script Function:
    Dieses Script scannt den aktuellen PC und speichert diese Infos in ein Textfile auf dem Server.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    ;######################################
    ;Includes
    ;######################################
    #include <_NTServices.au3>
    #include <file.au3>
    #include <Array.au3>
    #include <_MultiDateToNorm.au3>

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

    ;######################################
    ;Variablen
    ;######################################
    ;Definition Pfade
    Global $sauditpath

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

    ;Definition Infos
    Global $sSophosUpdaterVersion, $sSophosVersion, $sFirewallstatus, $iAdminrights, $sAdminrights, $sScantime, $sScandate, $sAdmingroup, $i, $sUpdateDate, $sSystemBootTime,$sRebootDateSplit, $sRebootDate
    Global $Name
    Global $aSysteminfo = _GetSystemInfo()
    Global $Members = _LocalGroupMembers("Administrators")

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

    ;Pfade
    $sauditpath = "\\echreipcpc0177\Audit$" & @ComputerName

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

    ;Ini
    $sInisave = $sauditpath & "\all.ini"

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

    ;Ist ein User angemeldet?
    $loggegInUser = LoggedOnUser()
    If $loggegInUser = 0 Then
    Exit
    EndIf

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

    ;Ablauf
    _Adminrights ()
    _LastUpdates ()
    _ScannedOn ()
    _SophosRead ()
    _CheckService ()
    _IniWrite ()
    _Exit ()

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

    ;######################################
    ;DOS Programm
    ;######################################
    Func _GetSystemInfo()
    Local $iPid = Run(@ComSpec & ' /c systeminfo /FO CSV', @ScriptDir, @SW_HIDE, 2 + 4), $sOutput = "", $aData
    Do
    Sleep(20)
    $sOutput &= StdoutRead($iPid, False, False)
    Until @error
    $aData = StringSplit($sOutput, @LF)
    If $aData[0] <> 3 Then Return SetError(1)
    $aName = StringRegExp($aData[1], '"([^"]*)"\,', 3)
    $aValue = StringRegExp($aData[2], '"([^"]*)"\,', 3)
    If UBound($aName) <> UBound($aValue) Then Return SetError(2)
    Local $aReturn[UBound($aName)][2]
    For $i = 0 To UBound($aName)-1
    $aReturn[$i][0] = $aName[$i]
    $aReturn[$i][1] = $aValue[$i]
    Next
    Return $aReturn
    EndFunc ;==>_GetSystemInfo

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

    ;######################################
    ;Mitglieder der Administratorgruppe
    ;######################################
    Func _LocalGroupMembers($sGroup)
    ;funkey 03.12.2009
    Local $line, $aMembers
    Local $cmd = "net localgroup "& $sGroup
    Local $Pid = Run(@ComSpec & " /c " & $cmd, "", @SW_HIDE, 2)
    While 1
    $line &= StdoutRead($Pid)
    If @error Then ExitLoop
    Wend
    $aMembers = StringSplit(StringTrimLeft($line, StringInStr($line, "-----", 0, -1) + 6), @CRLF, 3)
    ReDim $aMembers[UBound($aMembers) - 3]
    Return $aMembers
    EndFunc

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

    ;######################################
    ;Überprüfen ob jemand angemeldet ist
    ;######################################
    Func LoggedOnUser()
    $PID = ProcessExists("explorer.exe") ; Will return the PID or 0 if the process isn't found.
    If $PID Then
    return 1
    Else
    return 0
    EndIf
    EndFunc

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

    ;######################################
    ;Benutzername und Adminrechte auslesen
    ;######################################
    Func _Adminrights ()
    $iAdminrights = IsAdmin()
    If $iAdminrights = "1" Then
    $sAdminrights = "ja"
    Else
    $sAdminrights = "nein"
    EndIf

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

    $WMI = ObjGet("WinMgmts:root/cimv2")
    $colQuery1 = $WMI.ExecQuery("Select UserName FROM Win32_ComputerSystem")
    For $item In $colQuery1
    $ID = $item.UserName
    Next
    $colQuery2 = $WMI.ExecQuery("Select * FROM Win32_NetworkLoginProfile")
    For $object In $colQuery2
    If $object.Name = $ID Then
    $Name = $object.Fullname
    EndIf
    Next

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

    ;Herausfiltern von Administrator
    For $i = 0 To UBound($Members) -1
    If $Members[$i] = "Administrator" Then
    $Members[$i] = ""
    ElseIf $Members[$i] = "Domain\Domain Admins" Then
    $Members[$i] = ""
    EndIf
    Next

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

    For $i = Ubound($Members) - 1 To 0 Step -1
    If $Members[$i] = "" Then
    _ArrayDelete($Members, $i)
    EndIf
    Next

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

    $sAdmingroup = _ArrayToString($Members, ", ")
    EndFunc

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

    ;######################################
    ;Last Update
    ;######################################
    Func _LastUpdates ()
    $sUpdateDate = RegRead("HKLM64\SOFTWARE\MATRIX42\**********Client\15.1\Setup", "Date")
    EndFunc

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

    ;######################################
    ;Scanned on
    ;######################################
    Func _ScannedOn ()
    $sScandate = @MDAY & "." & @MON & "." & @YEAR
    $sScantime = @HOUR & ":" & @MIN
    EndFunc

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

    ;######################################
    ;Sophos auslesen
    ;######################################
    Func _SophosRead ()
    $sSophosUpdaterVersion = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{15C418EB-7675-42be-B2B3-281952DA014D}", "DisplayVersion")
    If RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{4320988A-7DE0-478D-A38B-CE9509BCE320}", "DisplayVersion") = "" Then
    $sSophosVersion = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{9ACB414D-9347-40B6-A453-5EFB2DB59DFA}", "DisplayVersion")
    Else
    $sSophosVersion = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{4320988A-7DE0-478D-A38B-CE9509BCE320}", "DisplayVersion")
    EndIf
    EndFunc

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

    ;######################################
    ;Services überprüfen
    ;######################################
    Func _CheckService ()
    $sFirewallstatus = _ServiceStatus("MpsSvc")
    EndFunc

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

    ;######################################
    ;Ini schreiben
    ;######################################
    Func _IniWrite ()
    ;Ordner erstellen
    If DirCreate($sauditpath) = 0 Then
    Exit
    EndIf

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

    If IniWrite($sInisave, "Netzwerktest", "Netzwerktest", "erreichbar") = 0 Then
    $sInisave = @TempDir & "Audit.ini"
    EndIf
    For $i = 0 To 30
    IniWrite($sInisave, "Systeminfo", $aSysteminfo[$i][0], $aSysteminfo[$i][1])
    Next
    IniWrite($sInisave, "User", "Adminrights", $sAdminrights)
    IniWrite($sInisave, "User", "User-ID", @UserName)
    IniWrite($sInisave, "User", "Displayname", $Name)
    IniWrite($sInisave, "User", "Admingroup", $sAdmingroup)
    IniWrite($sInisave, "Systeminfo", "Last Update", $sUpdateDate)
    IniWrite($sInisave, "Systeminfo", "Scanned Date", $sScandate)
    IniWrite($sInisave, "Systeminfo", "Scanned Time", $sScantime)
    IniWrite($sInisave, "Sophos", "SophosVersion", $sSophosVersion)
    IniWrite($sInisave, "Sophos", "SophosUpdaterVersion", $sSophosUpdaterVersion)
    IniWrite($sInisave, "Service", "firewall", $sFirewallstatus)
    $sSystemBootTime = IniRead($sInisave, "Systeminfo", "System Boot Time", "0")
    $sRebootDateSplit = StringSplit($sSystemBootTime, ",")
    $sRebootDate = _MultiDateToNorm($sRebootDateSplit[1])
    IniWrite($sInisave, "Systeminfo", "System Boot Time", $sRebootDate)
    EndFunc

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

    ;######################################
    ;Exit
    ;######################################
    Func _Exit ()
    Exit
    EndFunc

    [/autoit]

    Mein Problem ist das ich von ca. 160 gescannten PC's Stk eine Fehlermeldung bekommen.

    "Line 2165 (File XYZ)

    Error: Variable used without beeing declared.

    Ich würde diesen Fehler gerne abfangen/unterdrücken und ggf. lokal dokumentieren. Mit dieser Meldung kann ich nämlich nichts anfangen. Wäre echt cool wenn mir jemand helfen könnte.

  • SciTE -> Tools -> Compile -> Haken bei "Save a copy of the Source..."

    Die gesicherte .au3 enthält dann alle includes. Wenn du sie auddführst und der Fehler auftritt, kannst du dort nach der angegebenen Zeilennummer suchen und das Problem lokalisieren.

  • Sorry,

    aber solche Beiträge kannst du dir auch sparen. Ich kann Scite nicht überall installieren.

    Es würde ja schon reichen wenn du das auf einem der Rechner machst, die diesen Fehler liefern. Alternativ kannst du auch etwas mehr debugging betreiben, z.B. in dem du bei jedem Funktionsaufruf und Funktionsende in eine Logdatei schreibst. Dadurch kannst du schonmal eingrenzen in welcher der Funktionen es zum Absturz des Scriptes kommt. Eventuell entsteht der Fehler auch in einem deiner Includes.

    Eine weitere Variante wäre es alle Includes (und deren Includes) plus Hauptscript händisch in einer einzigen au3 zusammenzukopieren, dann kannst du die Zeilenanzahl der Fehlermeldung beim kompilierten Script 1:1 nutzen. Das wäre jedenfalls bei dir noch recht leicht machbar und zur Not auch durch ein Script automatisierbar.