Kleines Script zur Boot.ini

  • Hallo!
    Ich fummel mir grad eine Lösung zusammen, um automatisiert die boot.ini von Windows zu verändern. Um genau zu sein, es geht darum, das ein normaler boot-ini Eintrag ohne Kernel-Option vorzufinden ist, hier in meiner Umgebung jedoch diverse PC's ein anderes Boot-Logo haben und ergo der Eintrag /kernel=XYZ bei den Optionen in der boot.ini steht.

    Diese Einträge möchte ich gerne automatisiert per Script entfernen. Dabei ist neben der Änderung an sich wichtig, das der User eine endgültige Änderung erst bestätigt.

    Ich habe bislang folgende Lösung zusammengeschrieben:

    Die Original-Boot.ini wird kopiert. Die Kopie wir eingelesen und die entsprechenden Stellen, also die Optionen, mit einem Leerzeichen ersetzt. Danach wird der User gefragt, ob er die Änderung bestätigt (er sieht dann in einer Msgbox beide Varianten, die Alte und die Neue). Bestätigt er, wir die alte boot.ini gelöscht und die neue boot.ini an diese Stelle kopiert. Sagt er nein, wird die Kopie wieder entfernt und es passiert nichts weiter.

    Mein Problem: FileDelete() möchte nicht, das ich die boot.ini lösche. Ich ändere schon im Programm die Zugriffsrechte auf die Datei (kein Schreibschutz, nicht versteckt) aber trotzdem hängt sich das Programm einfach auf.

    Hier der Code:

    [autoit]


    Filecopy("c:\boot.ini","c:\Programme\boot.ini")
    FileSetAttrib("c:\Programme\boot.ini", "-RH", 1)

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

    $find = "/kernel=singkrnl.exe" ;Danach wird gesucht
    $find2 = "/kernel=dualkrnl.exe" ;Danach auch
    $replace = "" ;und damit ersetzt
    $filename = "c:\programme\boot.ini" ;Der Pfad und der Name der Datei
    $filename2 = "c:\boot.ini"
    $ersetzt = StringReplace(FileRead($filename), $find, $replace) ;Datei wird gelesen und der gesuchte String ersetzt
    $extend1 = @extended
    msgbox(1,"1",$extend1)
    FileDelete($filename) ;Alte Datei wird geleert bzw. gelöscht
    FileWrite($filename, $ersetzt) ;Neue Datei wird geschrieben
    $ersetzt2 = StringReplace(FileRead($filename), $find2, $replace) ;Datei wird gelesen und der gesuchte String ersetzt
    $extend2 = @extended
    FileDelete($filename) ;Alte Datei wird geleert bzw. gelöscht
    FileWrite($filename, $ersetzt2) ;Neue Datei wird geschrieben

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

    if ($extend1 = 0) AND ($extend2 = 0) Then
    msgbox(4096,"Abbruch","Kann Boot.ini nicht finden" & Chr(13) & Chr(13) & "Der Vorgang wird beendet.")

    else

    $old = FileRead("c:\boot.ini")
    $new = FileRead("c:\Programme\boot.ini")

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

    $value = msgbox(4,"Boot.ini ersetzen","Alte Datei: " & Chr(13) & Chr(13) & $old & Chr(13) & Chr(13) & "Neue Datei: " & Chr(13) & Chr(13) & $new & Chr(13) & "Möchten sie die Datei ändern?")

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

    if $value = 6 Then
    FileClose($filename2)
    FileSetAttrib($filename2,"-RH",1)
    FileCopy($filename,"c:\boot.ini",1)
    FileSetAttrib($filename2, "+RH",1)
    FileDelete($filename)
    msgbox(4096,"Bearbeitung","Datei wird geändert...",3)
    else
    FileDelete($filename)
    msgbox(4096,"Bearbeitung","Vorgang wird abgebrochen...",3)
    endif
    endif

    [/autoit]


    Über Sauberkeit etc kann man streiten, ich möchte eigentlich primär mein Problem gelöst wissen^^ Verfeinerungen am Code, Beschönigungen etc. nehme ich grundsätzlich erst vor, wenn die Funktionalität vollständig gegeben ist.

    Jemand eine Idee?

    MfG

    • Offizieller Beitrag

    Könnte sein das es anden Zugriffsrechten liegt.
    Füge mal

    [autoit]

    #RequireAdmin

    [/autoit]


    an den Anfang des Scriptes ein.

  • Das Neu-Schreiben der Datei geht einwandfrei, also es entsteht eine neue boot.ini in c:/programme so wie vorgegeben mit den Änderungen.
    Das Problem ist nur, das er nach wie vor die alte Datei nicht löscht.

    Ich habe das Statement #RequireAdmin auch eingesetzt, aber das ändert nichts. Merkwürdigerweise macht ein Test-Script, in dem nur

    [autoit]

    #RequireAdmin
    filedelete("c:\boot.ini")

    [/autoit]

    steht, alles richtig, also löscht die Datei. Der Fehler muss also irgendwo im "großen" Programm liegen....nur finden kann ich es immernoch nicht....vllt noch jmnd eine Idee?

  • [autoit]


    ;...
    $filename = "c:\programme\boot.ini" ;Der Pfad und der Name der Datei
    $filename2 = "c:\boot.ini"
    ;...
    FileDelete($filename) ;Alte Datei wird geleert bzw. gelöscht

    [/autoit]

    [/autoit]


    du verwendest dem falschen Variablennamen,

    mfg autoBert

  • ne das siehst du falsch


    das obere neu schreiben dient der 2. datei, die, die als sicherheitskopie erstellt und dann verändert wird. diese datei soll am ende an die stelle der originaldatei kommen, ergo stimmen die bezeichner...

    kann es sein, das sich das programm an FileSetAttrib() aufhängt? ich sehe das die attribute verändert werden (hidden und readonly ist raus)...muss sowas irgendwie anders bestätigt oder abgeschlossen werden vielleicht?

  • ich hab das problem jetzt lösen können...

    ich weiß nicht, warum ich die option mit im programm drin hatte (vermutlich aufgrund eines beispiels, bei dem ich abgeguckt habe) aber die Funktion FileSetAttrib() hat sich aufgrund der recursive-Option aufgehängt. nach entfernen der Option lief alles einwandfrei


    *close*