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
#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>
Opt("GUIOnEventMode", 1)
AutoItSetOption("TrayIconHide", 1)
Const $ERR_INI = "ini"
Const $sIni = @ScriptDir & "\" & @ComputerName & ".ini"
Global $sHostsFolder
Global $sHostsFileName = IniRead($sIni, "Config", "hosts", $ERR_INI)
Global $sFolderBackups = addSlash(IniRead($sIni, "Config", "backup", $ERR_INI))
Global $fFirstStart = True
Global $sHosts, $editHosts, $guiHosts, $guiFirstStart
Global $inputBackups, $inputHostsFile
startProgram()
buildGUI()
; 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
; 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
; 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
; 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
Else
showInfo("Es wurden keine Änderungen vorgenommen." & @CRLF & "Nicht gespeichert.", "Keine Änderungen")
EndIf
EndFunc ;==>saveHosts
; Startet das Backup:
Func startBackup()
$sToday = @YEAR & "-" & @MON & "-" & @MDAY
$sNewFileNameStart = $sToday & " - " & @ComputerName & " - hosts"
$iCounter = "1"
$sFileExtension = ".txt"
$sNewFileName = addSlash($sFolderBackups) & $sNewFileNameStart & $sFileExtension
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
; 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)
While 1
Sleep(100)
WEnd
EndFunc ;==>buildGUI
; 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
; 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
; 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
; Zeigt einen Fehler an:
Func showError($sError, $sTitle = "Fehler")
MsgBox(16, $sTitle, $sError)
EndFunc ;==>showError
; Zeigt eine Info an:
Func showInfo($sInfo, $sTitle = "Information")
MsgBox(64, $sTitle, $sInfo)
EndFunc ;==>showInfo
; 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
Screenshot:
bsp4.JPG
getestet unter Windows XP Pro SP2 32bit und Vista Business 32bit
mfg,
alfred