hosts-Datei bearbeiten und sichern

  • Hi,

    so, mein erstes "größeres" Programm hier ;)

    Hintergrund:
    Ich hab vor Ewigkeiten Spybot Search & Destroy installiert und diese schöne Liste mit "gefährlichen" Seiten in meine HOSTS-Datei aufgenommen - und schreibgeschützt.
    Jetzt muss ich das Ding aber ab und an ändern (VHOSTS für Apache z.B.) - damit ich jetzt nicht immer von Hand die Datei suchen muss, Schreibschutz raus, ändern, Schreibschutz rein, usw., hab ich mir ein kleines Programm gebastelt.

    Die meisten werden es wohl nicht brauchen, da man ja nicht so oft an der hosts was ändert, aber wäre cool wenn der ein oder andere mal über den Code fliegen könnte und schön Kritik übt, wie gesagt, mein erstes größeres Prog in Autoit ;)

    Ein paar Sachen werde ich noch ändern bzw. ergänzen (nachträgliches Ändern des Backup-Orts z.B....)

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=..\Icons\bogdangc.deviantart.com\glob-v2.ico
    #AutoIt3Wrapper_Res_Description=HOSTS bearbeiten und sichern.
    #AutoIt3Wrapper_Res_Fileversion=0.1.0.0
    #AutoIt3Wrapper_Res_LegalCopyright=alfred for http://www.autoit.de
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <GUIConstants.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiEdit.au3>

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

    Opt("GUIOnEventMode", 1)
    AutoItSetOption("TrayIconHide", 1)

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

    Const $ERR_INI = "ini"
    Const $sIni = @ScriptDir & "\" & @ComputerName & ".ini"

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

    Global $sHostsFolder
    Global $sHostsFileName = IniRead($sIni, "Config", "hosts", $ERR_INI)
    Global $sFolderBackups = addSlash(IniRead($sIni, "Config", "backup", $ERR_INI))

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

    Global $fFirstStart = True
    Global $sHosts, $editHosts, $guiHosts, $guiFirstStart
    Global $inputBackups, $inputHostsFile

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

    startProgram()
    buildGUI()

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

    ; Prüft ob Windows-Version passt, ob die INI-Datei i.O. ist, sowie ob die HOSTS-Datei überhaupt existiert:
    Func startProgram()
    ; Check, ob richtige Windows Version:
    If @OSVersion = "WIN_XP" Or @OSVersion = "WIN_2003" Or @OSVersion = "WIN_2000" Or @OSVersion = "WIN_VISTA" Then
    $sHostsFolder = @WindowsDir & "\system32\drivers\etc\"
    $sHostsFileName = $sHostsFolder & "hosts"
    Else
    showError("Programm kann nur unter Windows 2000/XP/2003 oder Vista ausgeführt werden.")
    _exit()
    EndIf

    ; Checken, ob INI und Einstellungen vorhanden:
    If Not FileExists($sIni) Then
    firstStart()
    ElseIf $sHostsFileName = $ERR_INI Or $sHostsFileName = "" Or $sFolderBackups = $ERR_INI Or $sFolderBackups = "" Then
    FileSetAttrib($sIni, "-R")
    firstStart() ; INI korrupt? -> Ordner neu abfragen
    Else
    FileSetAttrib($sIni, "-R")
    EndIf

    ; HOSTS-Datei Schreibschutz entfernen:
    FileSetAttrib($sHostsFileName, "-R")
    $sHosts = FileRead($sHostsFileName)

    If $sHosts = "" Then
    showError("Konnte HOSTS-Datei nicht lesen." & @CRLF & "Programm wird beendet.")
    _exit()
    EndIf

    EndFunc ;==>startProgram

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

    ; Beim ersten Start werden vom Benutzer Speicherort der HOSTS-Datei, sowie ein Backup-Verzeichnis abgefragt:
    Func firstStart()
    $sBackupFolder = @MyDocumentsDir

    $guiFirstStart = GUICreate("HOSTS - Erster Start", 563, 121, 424, 271)
    $labelHostsFile = GUICtrlCreateLabel("Speicherort der hosts-Datei:", 8, 16, 135, 17)
    $inputHostsFile = GUICtrlCreateInput($sHostsFileName, 152, 13, 369, 21)
    $labelBackups = GUICtrlCreateLabel("Speicherort für Backups:", 8, 54, 121, 17)
    $inputBackups = GUICtrlCreateInput($sBackupFolder, 152, 51, 369, 21)
    $buSelectHosts = GUICtrlCreateButton("...", 531, 12, 25, 25, 0)
    $buSelectBackups = GUICtrlCreateButton("...", 531, 50, 25, 25, 0)
    $buOk = GUICtrlCreateButton("OK", 357, 88, 75, 25, 0)
    $buCancel = GUICtrlCreateButton("Abbrechen", 445, 88, 75, 25, 0)

    GUICtrlSetOnEvent($buSelectHosts, "setHosts")
    GUICtrlSetOnEvent($buSelectBackups, "setBackups")
    GUICtrlSetOnEvent($buOk, "saveIni")
    GUICtrlSetOnEvent($buCancel, "_exit")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    GUISetState(@SW_SHOW)

    While $fFirstStart
    Sleep(100)
    WEnd
    EndFunc ;==>firstStart

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

    ; Speichert die INI und beendet die "firstStart"-GUI:
    Func saveIni()
    $sBackupFolder = addSlash(GUICtrlRead($inputBackups))
    $sHostsFile = GUICtrlRead($inputHostsFile)

    If $sBackupFolder <> "" And $sHostsFile <> "" And FileExists($sHostsFile) Then
    ; Backup-Verzeichnis erstellen, falls nicht vorhanden:
    If Not FileExists($sBackupFolder) Then
    $fCreateBackupFolder = DirCreate($sBackupFolder)
    EndIf

    IniWrite($sIni, "Config", "hosts", $sHostsFile)
    IniWrite($sIni, "Config", "backup", $sBackupFolder)
    $sHostsFileName = $sHostsFile
    $sFolderBackups = $sBackupFolder

    GUISetState($guiFirstStart, @SW_HIDE)
    GUIDelete($guiFirstStart)
    $fFirstStart = False

    Else
    showError("Bitte HOSTS-Datei und Backup-Verzeichnis angeben.")
    EndIf

    EndFunc ;==>saveIni

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

    ; Speichert, sofern Änderungen vorgenommen wurden, die HOSTS-Datei:
    Func saveHosts()
    $sHostsNew = _GUICtrlEdit_GetText($editHosts)

    If $sHostsNew <> $sHosts Then
    $sHostsFile = FileOpen($sHostsFileName, 2)

    If $sHostsFile <> -1 Then
    $fFileWritten = FileWrite($sHostsFile, $sHostsNew)

    If $fFileWritten <> 1 Then
    showError("Konnte Datei nicht schreiben!")
    Else
    showInfo("Datei gespeichert.")
    $sHosts = FileRead($sHostsFileName)
    EndIf

    FileClose($sHostsFile)
    Else
    showError("Konnte Datei nicht öffnen!")
    EndIf

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

    Else
    showInfo("Es wurden keine Änderungen vorgenommen." & @CRLF & "Nicht gespeichert.", "Keine Änderungen")
    EndIf

    EndFunc ;==>saveHosts

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

    ; Startet das Backup:
    Func startBackup()
    $sToday = @YEAR & "-" & @MON & "-" & @MDAY
    $sNewFileNameStart = $sToday & " - " & @ComputerName & " - hosts"
    $iCounter = "1"
    $sFileExtension = ".txt"

    $sNewFileName = addSlash($sFolderBackups) & $sNewFileNameStart & $sFileExtension

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

    While FileExists($sNewFileName)
    $sNewFileName = $sFolderBackups & $sNewFileNameStart & " " & $iCounter & $sFileExtension
    $iCounter += 1
    WEnd

    $copy = FileCopy($sHostsFileName, $sNewFileName)

    If FileExists($sNewFileName) Then
    showInfo("Backup erstellt:" & @CRLF & "Datei: " & $sNewFileName)
    FileSetAttrib($sNewFileName, "+R")
    Else
    showError("Konnte Backup nicht erstellen!")
    EndIf

    EndFunc ;==>startBackup

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

    ; Erstellt die GUI:
    Func buildGUI()
    ; GUI bauen:
    $guiHosts = GUICreate("HOSTS", 701, 573, 245, 146)
    $labelCurrentHosts = GUICtrlCreateLabel("Hosts:", 6, 14, 40, 17)
    $inputCurrentHosts = GUICtrlCreateInput($sHostsFileName, 56, 10, 265, 21, $ES_READONLY)
    $labelCurrentBackups = GUICtrlCreateLabel("Backups:", 333, 14, 57, 17)
    $inputCurrentBackups = GUICtrlCreateInput($sFolderBackups, 394, 10, 265, 21, $ES_READONLY)
    ;~ $buChange = GUICtrlCreateButton("...", 667, 8, 25, 25, 0)
    $editHosts = _GUICtrlEdit_Create($guiHosts, "", 0, 44, 697, 489)
    ;~ $editHosts = GUICtrlCreateEdit("", 0, 0, 697, 489)
    ;~ GUICtrlSetFont(-1, 8, 400, 0, "Courier")
    $buEdit = GUICtrlCreateButton("Änderungen speichern", 2, 542, 137, 25, 0)
    $buBackup = GUICtrlCreateButton("Backup erstellen", 561, 542, 137, 25, 0)

    ; Fonts:
    GUICtrlSetFont($labelCurrentHosts, 8, 800, 0, "MS Sans Serif")
    GUICtrlSetFont($labelCurrentBackups, 8, 800, 0, "MS Sans Serif")

    ; Edit-Feld setzen:
    _GUICtrlEdit_SetText($editHosts, $sHosts)

    ; Events:
    GUICtrlSetOnEvent($buEdit, "saveHosts")
    GUICtrlSetOnEvent($buBackup, "startBackup")
    ;~ GUICtrlSetOnEvent($buChange, "changeHostsFolder")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")

    ; GUI anzeigen:
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(100)
    WEnd
    EndFunc ;==>buildGUI

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

    ; Liest den vom Benutzer eingegeben Speicherort der HOSTS-Datei aus und setzt ihn in das Input-Feld:
    Func setHosts()
    Local $sHostsSelect = FileOpenDialog("HOSTS-Datei wählen", $sHostsFolder, "Alle (*.*)", 1)
    If $sHostsSelect <> "" Then
    GUICtrlSetData($inputHostsFile, $sHostsSelect)
    EndIf
    EndFunc ;==>setHosts

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

    ; Liest den vom Benutzer eingegeben Speicherort der Backups aus und setzt ihn in das Input-Feld:
    Func setBackups()
    Local $sBackupFolder = FileSelectFolder("BACKUP-Verzeichnis wählen", "", 7, @MyDocumentsDir)
    If $sBackupFolder <> "" Then
    GUICtrlSetData($inputBackups, $sBackupFolder)
    EndIf
    EndFunc ;==>setBackups

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

    ; Fügt, falls notwendig, einen Slash zu einem Pfad hinzu:
    Func addSlash($dir)
    $length = StringLen($dir)
    $check = StringInStr($dir, "\", 0, -1)

    If $length <> $check Then
    $dir = $dir & "\"
    EndIf

    Return $dir
    EndFunc ;==>addSlash

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

    ; Zeigt einen Fehler an:
    Func showError($sError, $sTitle = "Fehler")
    MsgBox(16, $sTitle, $sError)
    EndFunc ;==>showError

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

    ; Zeigt eine Info an:
    Func showInfo($sInfo, $sTitle = "Information")
    MsgBox(64, $sTitle, $sInfo)
    EndFunc ;==>showInfo

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

    ; Setzt die HOSTS-Datei und die INI auf schreibgeschützt und beendet das Programm:
    Func _exit()
    FileSetAttrib($sHostsFileName, "+R")
    FileSetAttrib($sIni, "+R")
    Exit
    EndFunc ;==>_exit

    [/autoit]

    Screenshot:
    bsp4.JPG

    getestet unter Windows XP Pro SP2 32bit und Vista Business 32bit

    mfg,
    alfred

  • Die sind besser :) (such dir eine aus)

    Spoiler anzeigen
    [autoit]

    ; Fügt, falls notwendig, einen Slash zu einem Pfad hinzu:
    Func addSlash($dir)
    Return $dir & StringLeft("\",StringRight($dir,1)<>"\")
    EndFunc ;==>addSlash

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

    Func addSlash($dir)
    If StringRight($dir,1)<>"\" Then $dir &= "\"
    Return $dir
    EndFunc ;==>addSlash

    [/autoit]