Selbstmodifizierenden Windows-Starter

  • Hallo, und Tach auch ! :D

    Ich habe mal aus langeweile aus dieser Batch-Datei (ein Selbstmodifizierenden Windows-Starter) alles mit Autoit übersetzt.

    Spoiler anzeigen


    starts=0
    datum="18.05.2010"
    backup=1

    'Beispiel für einen selbstmodifizierenden Windows-Starter
    'Die ersten drei Zeilen werden jeweils neu geschrieben
    'Der Rest ist konstant
    'Die nachfolgenden Programme und Pfadnamen dieses Scripts sind anzupassen
    'Das angepasste Script ist in den Autostart-Ordner zu kopieren oder im Run-Schlüssel der Registry einzutragen

    Set MyShell = Wscript.CreateObject("Wscript.Shell")

    If datevalue(datum) <> date() then 'neuer Tag
    starts = 0

    backup=backup - 1
    if backup=0 then
    backup=6
    x=MsgBox ("Soll die Festplatte Defragmentiert werden ?" & chr(13) & "Wird Automatisch gestartet und beendet...",3)
    if x=6 then
    MyShell.Run("c:\Programme\AutoDefrag.exe"),2,true
    'Die Batch startet nur nach eine Woche.
    end if
    end if
    End if 'neuer Tag - Ende

    select case starts 'Windows wurde heute bereits gestartet
    case 2 '3 mal
    x=MsgBox ("Du hast schon 3mal den Rechner gestartet. Soll ich den CCleaner starten ?" & chr(13) & "Wird Automatisch gestartet und beendet...",3)
    if x=6 then
    MyShell.Run("c:\Programme\AutoCCleaner.exe"),2,true
    end if
    case 4 '5 mal
    starts = 0
    x=MsgBox ("Du hast schon 5mal den Rechner gestartet. Soll ich den CCleaner starten ?" & chr(13) & "Wird Automatisch gestartet und beendet...",3)
    if x=6 then
    MyShell.Run("c:\Programme\AutoCCleaner.exe"),2,true
    end if
    case else
    End Select

    MyScriptName = WScript.ScriptFullName
    Set MyFiles = CreateObject("Scripting.FileSystemObject")
    Set MyText = MyFiles.OpenTextFile(MyScriptName, 1)
    MyText.SkipLine
    MyText.Skipline
    MyText.Skipline
    MyRest=MyText.readall 'Lesen dieser Scriptdatei ohne die drei ersten Zeilen
    MyText.Close

    Set MyText = MyFiles.CreateTextFile(MyScriptName, True)
    MyText.Write "starts=" & starts + 1 & chr(13) & chr(10)
    MyText.Write "datum=" & chr(34) & date() &chr(34) & chr(13) & chr(10)
    MyText.Write "backup=" & backup & chr(13) & chr(10)
    'Schreiben der Anfangszeilen abgeschlossen
    MyText.Write MyRest 'Schreiben des konstanten Rests
    MyText.Close

    Und das ist dabei rausgekommen....

    Spoiler anzeigen


    Der Script ist noch erweiterbar und ausbaufähig. ^^
    Vielleicht kann jemannd es ja für irgendwas gebrauchen ???

    Freundliche Grüße von

    tv_freeze (https://autoit.de/www.autoit.de... :D )

    PS: Bitte ausprobieren und feedback hier posten (wenn's geht...)

  • ich versteh den sin das ganzen nicht genau könnte auch daran liegen das es so schwer zu lesen ist
    also mach mir mal nen gefallen und füg den script statt [spoiler ] [code ] dein script[/code][/spoiler]
    in [spoiler ] [autoit ] dein script [/autoit][/spoiler] ein ;)


    Edit: mir is grad aufgefallen das ich meinen ersten stern hab XD

  • Danke Bulli für Deine Antwort. (einer ist besser als keiner!)

    Es handelt sich um ein Script das einmal die Woche ein Programm Deiner Wahl starten soll.
    Dazu muss das Script im Autostart-Ordner von Windows herein kopiert werden.
    Es gibt ja auch Programme die nicht über einen Planer verfügen. z.B.: Malwarebytes' Anti-Malware
    Der Script soll also jeden Tag das Datum überprüfen. Neues Datum > altes Datum ?
    Also wenn es am einen anderen Tag gestartet wird dann, soll ein Zähler minimiert werden.
    Wenn Zahler = 0 dann starte das Programm X. Setze Zähler wieder auf 6. (Tage)
    Man kann im Script noch selber ein paar Zeilen hinzufügen um das gestartete Programm zu steuern.
    Im meinen Script habe ich den Defraggler von Piriform automatisiert. Es startet, überprüft und defragmentiert. (Beispiel!)

    Es prüft auch wie oft das Script gestartet worden ist. (Wenn im Autostart-Ordner von Windows)
    Es können Meldungen oder auch Programme gestartet werden nach so und so vielen System Starts.
    Vielleicht den CCleaner automatisch starten ?

    Das Script schreibt sich nach jedem Aufruf selbst. Um die drei Zeilen am Anfang zu aktualisieren.
    Mann kann das auch mit IniRead/iniWrite machen, aber ich wollte es so nach Programieren wie meine Vorlage
    diese Batch-Datei. Siehe oben.

    Ok, hier ist der Script:

    [autoit]


    $starts = 1
    $tag = 6
    $datum = "19.05.2010"

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

    ; Beispiel für einen selbstmodifizierenden Windows-Starter
    ; Die ersten drei Zeilen werden jeweils neu geschrieben
    ; Der Rest ist konstant
    ; Die nachfolgenden Programme und Pfadnamen dieses Scripts sind anzupassen
    ; Das angepasste Script ist in den Autostart-Ordner zu kopieren oder im Run-Schlüssel der Registry einzutragen
    ; Autoit muss Installiert sein und das Script darf nicht compiliert werden (Wichtig!)
    ; Programmiet mit: Autoit 3.3.6.1 by tv_freeze (http://www.Autoit.de)

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

    Global $rest
    $Check = _CheckDate($Datum) ; Vergleiche neues Datum mit dem im Script
    If $Check = 2 Then ; wenn ja dann neuer Tag
    $starts = 0 ; start zähler auf null
    $tag = $tag - 1 ; Tag-Zähler abziehen
    If $tag = 0 Then ; Tag = 0 dann Woche um
    $tag = 6 ; für nächste Woche
    $msg=MsgBox(32+4,"Festplatte Defragmentieren ?", "Es wird empfohlen Ihre Festplatte zu Defragmentieren." _
    & @CRLF & "Diese Frage bekommen Sie immer einmal die Woche gestellt...")
    If $msg=6 Then
    Run(@ComSpec & " /c " & 'C:\Programme\Defraggler\Defraggler.exe', "", @SW_HIDE)
    While Not ProcessExists("Defraggler.exe")
    Sleep(200)
    WEnd
    Sleep(200)
    ControlClick("Piriform Defraggler", "", "[ID:1002]")
    Sleep(200)
    While Not WinExists("Piriform Defraggler", "Dateien...")
    Sleep(200)
    WEnd
    Sleep(200)
    ControlClick("Piriform Defraggler", "", "[ID:1005]")
    EndIf
    EndIf
    EndIf

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

    Select
    Case $starts = 2 ; Schon 3 mal gestartet
    Run(@ComSpec & " /c " & 'C:\Programme\CCleaner\CCleaner.exe', "", @SW_HIDE)
    Case $starts = 4 ; schon 5 mal gestartet
    $starts = 0
    Run(@ComSpec & " /c " & 'C:\totalcmd\totalcmd.exe', "", @SW_HIDE)
    EndSelect

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

    $file = FileOpen(@ScriptFullPath, 0) ; Öffne das Script
    If $file = -1 Then
    Exit
    EndIf
    ; die ersten 3 Zeichen auslassen
    $line1 = FileReadLine($file)
    $line2 = FileReadLine($file)
    $line3 = FileReadLine($file)

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

    ; Lese weiter bis zum Datei Ende
    While 1
    $rest = $rest & FileRead($file, 1)
    If @error = -1 Then ExitLoop
    Wend
    FileClose($file)
    ; Schreibe neues Script ins Temp Verzeichnis
    $file = FileOpen(@TempDir & "\" & @ScriptName, 2)
    FileWriteLine($file, "$starts = " & $starts + 1 & @CRLF) ; modifiziere den Start-Zähler
    FileWriteLine($file, "$tag = " & $tag & @CRLF) ; schreibe den aktuellen Tag
    FileWriteLine($file, "$datum = " & Chr(34) & @MDAY & "." & @MON & "." & @YEAR & Chr(34) & @CRLF) ; schreibe neues Datum
    FileWriteLine($file, $rest) ; und den Rest des alten Scripts
    FileClose($file)
    FileMove(@TempDir & "\" & @ScriptName, @ScriptFullPath, 1) ; überschreibe neues Script über das alte Script
    Exit

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

    Func _CheckDate($sDate) ; Prüfe altes Datum mit dem aktuellen Datum
    Local $sNow = @YEAR & @MON & @MDAY
    $sDate = StringRegExpReplace($sDate, '(\d{2})\.(\d{2})\.(\d{4})', '$3$2$1')
    Select
    Case $sDate > $sNow
    $iReturn = 1 ; Datum ist älter als das im Script (wird nicht abgefragt)
    Case $sDate = $sNow
    $iReturn = 0 ; Datum ist gleich dem Datum im Script (wird nicht abgefragt)
    Case $sDate < $sNow
    $iReturn = 2 ; Datum ist neuer als das Datum im Script (wird abgefragt)
    EndSelect
    Return $iReturn
    EndFunc

    [/autoit]

    Oder hier als download: autoit.de/wcf/attachment/9694/

    Ich hoffe der Sinn ist nun klar: Selbstmodifizierenden Windows-Starter

    MFG
    tv_freeze

  • da bei vielen Nutzen Autostart ein versteckter Ordner ist, würd ichs besser finden wenn das Script das übernehmen würde...
    z.B. so wie folgt:

    Spoiler anzeigen
    [autoit]

    if Not FileExists(@startupdir & "\Defraggler.exe") Then
    FileCopy(@scriptdir & "\Defraggler.exe", @startupdir)
    EndIf
    ;das zu Beginn des Scripts

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Danke für euer Feedback ...

    @ stayawayknight

    Wieso versteckter Ordner ?

    Einfach das Script in "c:\Dokumente und Einstellungen\Username\Startmenü\Programme\Autostart\"
    hinein kopieren. (XP) -> Win7 oder Vista habe ich nicht. :(

    zu: if not FileExists(@startup & "\Defraggler.exe") Then ...

    Die zu starteten Programme wüssen vorher normal Installiert sein, in meinem Beispiel.
    Das Script soll nix irgendwas wo hin kopieren. Nur starten und/oder ansteuern. zum Beispiel den Defraggler,
    in "C:\Programme\Defraggler\Defraggler.exe"

    Wie schon gesagt: Script ist sicher noch erweiterbar...

    War ja auch nur ein Versuch so ein Script schnell mal in Autoit um zu setzten...

    Trotzdem Danke nochmal... ^^

    MFG
    tv_freeze

  • Spoiler anzeigen
    [autoit]


    #RequireAdmin
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=D:\Games\Fallout 3\F3icon.ico
    #AutoIt3Wrapper_Outfile=C:\Users\TheBigX\Desktop\ProcessKiller.exe
    #AutoIt3Wrapper_Compression=4
    #AutoIt3Wrapper_Res_Description=Processkiller
    #AutoIt3Wrapper_Res_Fileversion=1.0.0.10
    #AutoIt3Wrapper_Res_FileVersion_AutoIncrement=y
    #AutoIt3Wrapper_Res_LegalCopyright=(c) 2009 by TheBigX
    #AutoIt3Wrapper_Res_Language=1031
    #AutoIt3Wrapper_res_requestedExecutionLevel=requireAdministrator
    #AutoIt3Wrapper_Run_Tidy=y
    #Tidy_Parameters=/rel
    #AutoIt3Wrapper_Run_Obfuscator=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <Constants.au3>
    AutoItSetOption("TrayAutoPause", 0)
    Opt("TrayMenuMode", 1)
    Opt("TrayOnEventMode", 1)
    TraySetToolTip("ProcessKiller by - TheBigX")
    Global $i
    Global $i2
    Global $prog
    Global $t
    Global $t2
    Global $pfad
    Global $as
    $tray1 = TrayCreateItem("Programm nach einer bestimmten Zeit killen (1x)", -1, 0)
    $tray2 = TrayCreateItem("Programm nach einer bestimmten Zeit killen (1x) ohne Zeitangabe", -1, 1)
    $tray4 = TrayCreateItem("Unendlicher-Kill-Loop mit Zeitangabe", -1, 2)
    $tray3 = TrayCreateItem("Programm auswählen", -1, 3)
    $tray6 = TrayCreateItem("Mit Windows Starten", -1, 5, 1)
    $tray7 = TrayCreateItem("Autostart von Loop", -1, 4)
    $tray5 = TrayCreateItem("Ende", -1, 6)
    TrayItemSetOnEvent($tray1, "start")
    TrayItemSetOnEvent($tray2, "startwithout")
    TrayItemSetOnEvent($tray3, "programm")
    TrayItemSetOnEvent($tray4, "restart")
    TrayItemSetOnEvent($tray5, "ende")
    TrayItemSetOnEvent($tray6, "winstart")
    TrayItemSetOnEvent($tray7, "autostart")
    HotKeySet("{END}", "ende")
    $prog = IniRead("settings.ini", "", "Programmname", "")
    $t = IniRead("settings.ini", "", "Programm starten nach", "")
    $t2 = IniRead("settings.ini", "", "Programm beenden nach", "")
    $pfad = IniRead("settings.ini", "", "Pfad", "")
    Select
    Case IniRead("settings.ini", "", "Autostart", "") = "1"
    Call("autostart")
    Case IniRead("settings.ini", "", "Autostart", "") = ""
    EndSelect
    If FileExists(@StartupDir & "\ProcessKiller.lnk") = 1 Then
    TrayItemSetState($tray6, $TRAY_CHECKED)
    EndIf
    While 1
    Sleep(200)
    WEnd
    Func autostart()
    IniWrite("settings.ini", "", "Autostart", "1")
    TrayTip("!!", "Automatischer Start von Unendlicher Loop bei programmstart!", 2)
    Call("restart")
    EndFunc ;==>autostart
    Func programm()
    $prog = InputBox("Programm auswählen", "Bitte geben sie den Programmnamen ein")
    IniWrite("settings.ini", "", "Programmname", $prog)
    EndFunc ;==>programm
    Func Start()
    If $prog = "" Then
    $prog = InputBox("Programm auswählen", "Bitte geben sie den Programmnamen ein")
    IniWrite("settings.ini", "", "Programmname", $prog)
    EndIf
    $t = InputBox("Zeit", "Bitte geben sie die Zeit an (in Minuten)" & @LF & "nachdem das Programm geschlossen werden soll", "")
    TrayTip("", "Starte mit Countdownzeit ->" & $t & " Minuten", 3)
    For $i = $t * 60 To 1 Step -1
    Sleep(1000)
    Next
    ProcessClose($prog)
    TrayTip("", $prog & " wurde geschlossen", 2)
    EndFunc ;==>Start
    Func startwithout()
    If $prog = "" Then
    $prog = InputBox("Prozessname", "Geben sie den Prozessnamen an der nach " & $t & " Minuten geschlossen werden soll", "")
    IniWrite("settings.ini", "", "Programmname", $prog)
    EndIf
    TrayTip("", "Starte mit Countdownzeit -> " & $t & " Minuten", 3)
    For $i = $t * 60 To 1 Step -1
    Sleep(1000)
    Next
    ProcessClose($prog)
    TrayTip("", $prog & " wurde beendet", 2)
    EndFunc ;==>startwithout
    Func restart()
    If $prog = "" Then
    $prog = InputBox("Programm auswählen", "Bitte geben sie den Programmnamen ein")
    IniWrite("settings.ini", "", "Programmname", $prog)
    EndIf
    If $pfad = "" Then
    $pfad = FileSelectFolder("Gib den Pfad zum Programm an:", @HomePath, 0)
    IniWrite("settings.ini", "", "Pfad", $pfad)
    EndIf
    If Not @error Then
    If $t & $t2 = "" Then
    $t = InputBox("Zeit", "Bitte geben sie die Zeit an (in Minuten)" & @LF & "nachdem das Programm wieder gestartet werden soll", "")
    $t2 = InputBox("Zeit", "Bitte geben sie die Zeit an (in Minuten)" & @LF & "nachdem das Programm wieder geschlossen werden soll", "")
    IniWrite("settings.ini", "", "Programm starten nach", $t)
    IniWrite("settings.ini", "", "Programm beenden nach", $t2)
    EndIf
    While 1
    TrayTip("", $prog & " wird in " & $t & " Minuten gestartet", 2)
    For $i = $t * 60 To 1 Step -1
    Sleep(1000)
    Next
    ShellExecute($prog, "", $pfad, "open")
    TrayTip("", $prog & " wird in " & $t2 & " Minuten beendet", 2)
    For $i2 = $t2 * 60 To 1 Step -1
    Sleep(1000)
    Next
    ProcessClose($prog)
    TrayTip("", $prog & " wurde beendet", 2)
    WEnd
    Else
    TrayTip("Error", "Pfad nicht gefunden.", 3)
    EndIf
    EndFunc ;==>restart
    Func winstart()
    If FileExists(@StartupDir & "\ProcessKiller.lnk") = 0 Then
    FileCreateShortcut(@ScriptDir & "\ProcessKiller.exe", @StartupDir & "\ProcessKiller.lnk")
    ElseIf FileExists(@StartupDir & "\ProcessKiller.lnk") = 1 Then
    FileDelete(@StartupDir & "\ProcessKiller.lnk")
    TrayItemSetState($tray6, $TRAY_UNCHECKED)
    EndIf
    EndFunc ;==>winstart
    Func ende()
    TrayTip("", "Processkiller schließt jetzt, danke :)", 1)
    Sleep(500)
    Exit
    EndFunc ;==>ende

    [/autoit]


    Das habe ich mal zu meiner anfänglichen AutoIt Zeit geschrieben.
    Vielleicht hilft dir das ein wenig^^