Prozessüberprüfung

  • Hi,
    ich habe n Problem an dem ich gerade verzweifle. :( Also ich will ein Programm machen, dass im Hintergrund läuft und immer wenn sich die Anzahl der Prozesse ändert soll er den Prozessnamen und den dazugehörigen Pfad mit der in der Ini vergleichen und wenn es nicht übereinstimmt den Prozess suspendieren und auf eine Antwort vom Benutzer warten.

    Soweit bin ich bisher:

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #include <GUIConstants.au3>
    #include <sound.au3>
    ;#NoTrayIcon
    $Warnung = _SoundOpen("C:\Warnung.wav")
    ProcessSetPriority("Prozess_Security.exe",4)
    IniDelete("C:\Prozesse.ini","Temp")
    $Ini = 'C:\Prozesse.ini'
    Global $OK,$l,$Prozesse,$Prozess_Pfad,$a,$l1,$l2,$checken,$IniImmer,$IniTemp,$k
    If Not FileExists($Ini) Then
    IniWrite($Ini,"Immer","explorer.exe","C:\WINDOWS\Explorer.exe")
    IniWrite($ini,"Status","AUTOEXEC",FileGetSize("C:\AUTOEXEC.bat"))
    EndIf

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

    $Prozesse = ProcessList()
    $l = $Prozesse[0][0]
    _Whileschleife()

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

    Func _Whileschleife()
    While 1
    Global $Prozesse = ProcessList()
    If $l = $Prozesse[0][0] Then
    Sleep(50)
    Else
    Global $Prozesse = ProcessList()
    $l = $Prozesse[0][0]
    For $k = 2 To $Prozesse[0][0]
    $Prozess_Pfad = _Path($Prozesse[$k][1])
    If $Prozess_Pfad = 2 Then $Prozess_Pfad = "Nicht ermittelbar!"
    If Not IniRead($Ini,"Immer",$Prozesse[$k][0],"") = $Prozess_Pfad Then
    IniReadSection($Ini,"Temp")
    If Not @error Then
    If Not IniRead($Ini,"Temp",$Prozesse[$k][0],"") = $Prozess_Pfad Then
    _ProcessStop($Prozesse[$k][0])
    _Unbekannt($Prozesse[$k][0],$Prozess_Pfad)
    EndIf
    Else
    _ProcessStop($Prozesse[$k][0])
    _Unbekannt($Prozesse[$k][0],$Prozess_Pfad)
    EndIf
    EndIf
    ToolTip($Prozesse[$k][0],0,0,$Prozess_Pfad & " " & $k & " " & $Prozesse[0][0])
    Next
    If IniRead($Ini,"Status","AUTOEXEC","") = FileGetSize("C:\AUTOEXEC.bat") Then
    Sleep(1)
    Else
    $File = FileOpen("C:\AUTOEXEC.bat",0)
    $Text = FileRead($File)
    MsgBox(16,"Autoexec.bat wurde geändert!!!","Aktueller Inhalt:" & @CRLF & @CRLF & $Text)
    EndIf
    EndIf
    WEnd
    EndFunc

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

    Func _ProcessStop($process)
    $processid = ProcessExists($process)
    If $processid Then
    $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
    $i_sucess = DllCall("ntdll.dll","int","NtSuspendProcess","int",$ai_Handle[0])
    DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ai_Handle)
    If IsArray($i_sucess) Then
    Return 1
    Else
    SetError(1)
    Return 0
    Endif
    Else
    SetError(2)
    Return 0
    Endif
    EndFunc

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

    Func _ProcessStart($process)
    $processid = ProcessExists($process)
    If $processid Then
    $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
    $i_sucess = DllCall("ntdll.dll","int","NtResumeProcess","int",$ai_Handle[0])
    DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ai_Handle)
    If IsArray($i_sucess) Then
    Return 1
    Else
    SetError(1)
    Return 0
    Endif
    Else
    SetError(2)
    Return 0
    Endif
    EndFunc

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

    Func _Unbekannt($Prozessname,$Pfad)
    _SoundPlay($Warnung)
    $Form1 = GUICreate("Unbekannten Prozess entdeckt!!! (Prozessname: " & $Prozessname & " | Prozesspfad: " & $Pfad, 1674, 41, -1, -1)
    $Button1 = GUICtrlCreateButton("Für immer erlauben", 344, 0, 193, 41)
    $Button2 = GUICtrlCreateButton("bis Neustart erlauben", 608, 0, 193, 41)
    $Button3 = GUICtrlCreateButton("Programm beenden", 872, 0, 195, 41)
    $Button4 = GUICtrlCreateButton("Programm beenden und Datei löschen", 1136, 0, 193, 41)
    GUISetState(@SW_SHOW)
    While 1
    $msg = GUIGetMsg()
    If $msg = $Button1 Then
    GUISetState(@SW_HIDE)
    IniWrite($Ini,"Immer",$Prozessname,$Pfad)
    _ProcessStart($Prozessname)
    $l = 0
    _Whileschleife()
    EndIf

    If $msg = $Button2 Then
    GUISetState(@SW_HIDE)
    IniWrite($Ini,"Temp",$Prozessname,$Pfad)
    _ProcessStart($Prozessname)
    $l = 0
    _Whileschleife()
    EndIf

    If $msg = $Button3 Then
    GUISetState(@SW_HIDE)
    ProcessClose($Prozessname)
    Sleep(500)
    If ProcessExists($Prozessname) Then
    MsgBox(16,$Prozessname,"Prozess konnte nicht beendet werden!")
    $l = 0
    _Whileschleife()
    Else
    GUISetState(@SW_HIDE)
    MsgBox(64,$Prozessname,"Prozess beendet!")
    $l = 0
    _Whileschleife()
    EndIf
    EndIf
    If $msg = $Button4 Then
    GUISetState(@SW_HIDE)
    ProcessClose($Prozessname)
    Sleep(500)
    If ProcessExists($Prozessname) Then
    $Proz = "Prozess konnte nicht beendet werden!"
    Else
    $Proz = "Prozess beendet!"
    EndIf
    $del = FileDelete($Pfad)
    If $del = 1 Then
    $del = "Datei gelöscht!"
    $Flag = 64
    Else
    $del = "Datei konnte nicht gelöscht werden!"
    $Flag = 16
    EndIf

    MsgBox($Flag,$Prozessname,$Proz & @CRLF & $del)
    $l = 0
    _Whileschleife()
    EndIf
    Sleep(100)
    WEnd
    EndFunc

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

    Func _Path($iPID)
    Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', 0x0410, 'int', 0, 'int', $iPID)
    If $aProc[0] = 0 Then Return 2
    Local $vStruct = DllStructCreate('int[1024]')
    DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
    Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameExW', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'wstr', '', 'int', 2048)
    If $aReturn[0] = 0 Then Return 2
    Return $aReturn[3]
    EndFunc

    [/autoit]


    Wenn sich die Prozessanzahl ändert, dann kontrolliert er die Prozesse, aberüberprüft nie bis zum Ende und bleibt vorher stehen :cursing: Bitte um Hilfe

    PS: Hatte auch noch irgendwie vor die gesamte Registrierung nach der Datei zu durchsuchen und wenn etwas gefunden wird, dann soll es in einer MsgBox angezeigt werden. Aber da bin ich überfragt wie ich das machen soll. Über Hilfe würde ich mich freuen :)

    4 Mal editiert, zuletzt von xXlowXx (19. Juni 2009 um 20:27)

  • Das Vergleichen funktioniert ja, aber es kontrolliert nicht alle Prozesse und somit kommt mein Script zum Stillstand.

  • Fehler gefunden, ich habe vergessen Autoit3.exe mit in die Ini reinzutun und somit wurde bei der Überprüfung der Prozess angehalten.

    *gelöst*