Automatische PDF-Passworteingabe

  • Hi zusammen,

    ich habe ein kleines Programm geschrieben, welches die Passworteingabe bei PDF-Dateien automatisieren kann. Das wollte ich euch nicht vorenthalten, da der ein oder andere vielleicht auch z.B. Rechnungen via E-Mail im PDF-Format bekommt, die dann noch mit der Kundennummer oder so als Passwort "geschützt" sind, was - wie ich finde - irgendwie nervt :wacko: .

    Zur Funktionsweise: die Passwörter werden im Format "Alias : Passwort" zeilenweise (im Klartext) in einer Text-Datei gespeichert (um den Doppelpunkt sind eigentlich keine Leerzeichen, aber wenn ich die wegmache erstellt mir der Editor automatisch einen Smiley :P ). Sollte nur eine Zeile vorhanden sein, wird standardmäßig automatisch durchgeloggt, ansonsten wird eine GUI zur Auswahl angeboten. Es stehen auch noch die Optionen "Immer GUI anzeigen (always_gui)" und "Kein Tray Symbol anzeigen (no_icon)" zur Verfügung, welche als Parameter übergeben werden können.

    Im Prinzip läuft es schon, ich habe nur mal noch eine Frage bzgl. der "Eleganz" (was die Programmierung betrifft) :D .
    Im folgenden Teil erstelle ich dynamisch die Buttons über welche die Passwörter ausgewählt werden können:

    [autoit]

    For $line In $passwords
    $couple = StringSplit($line, ":", 3)
    $buttons[$line_counter] = GUICtrlCreateButton($couple[0], 20, 60 + (37 * $line_counter), 190, 32)
    $line_counter += 1
    Next

    [/autoit]

    Und in diesem Teil überwache ich die GUI:

    [autoit]

    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    [...]
    Case $msg <> 0

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

    $shift = 4

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

    If $msg >= $shift And $msg <= $shift + $anz_passwords Then

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

    $couple = StringSplit($passwords[$msg - $shift], ":", 3)
    $password = StringStripWS($couple[1], 3)

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

    WinActivate($pass_win_handle)
    Send($password)
    Send("{ENTER}")
    GUISetState(@SW_HIDE)
    Sleep(2000)

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

    EndIf
    EndSelect

    [/autoit]

    Diesen Teil habe ich - wie man sehen kann - irgendwie nicht so smooth hinbekommen. Ich habe festgestellt, dass der erste Button $msg =4 erzeugt, und alle weiteren eben +1. Auf diese Weise werden quasi die Buttons auf das Passwort-Array gemappt. Hat jemand vielleicht einen Vorschlag, wie man das besser machen kann?

    Hier das ganze Programm:

    Spoiler anzeigen
    [autoit]

    ;Ausstiegsoption (falls kein icon angezeigt wird) mit STRG + SHIFT + Q bzw. STRG + ALT + Q
    HotKeySet("^+q", "exit_now")
    HotKeySet("^!q", "exit_now")

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

    ;Nur einen Start zulassen
    If _Singleton("pdf_password_helper", 1) = 0 Then Exit

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

    ;Includes
    #include-once
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include "Array.au3"
    #include <Misc.au3>
    #include <File.au3>

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

    ;Fenster-Titel-Erkennungsmethode (auch Teil-Texte erkennen)
    AutoItSetOption("WinTitleMatchMode", 2)

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

    ;Tray-Menü anpassen
    Opt("TrayOnEventMode",1)
    Opt("TrayMenuMode",1)
    TraySetIcon(@WindowsDir & "\system32\shell32.dll", 45)

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

    $exit = TrayCreateItem("Exit")
    TrayItemSetOnEvent(-1, "exit_now")

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

    ;GUI-Anzeigemodus (Standard) setzen
    $always_show_gui = False

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

    ;-----------------------------------------------------------------
    ;Kommandozeilen-Parameter (in beliebiger Reihenfolge)
    ;-----------------------------------------------------------------
    ;no_icon: Tray-Icon verstecken
    ;always_gui: GUI immer anzeigen, auch wenn nur ein Passwort in der Liste steht (sonst direkt durchloggen)

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

    If $CmdLine[0] >= 1 Then
    If _ArraySearch($CmdLine, "no_icon") <> -1 Then Opt("TrayIconHide", 1)
    If _ArraySearch($CmdLine, "always_gui") <> -1 Then $always_show_gui = True
    EndIf
    ;-----------------------------------------------------------------

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

    ;Passwort-Datei
    $password_file = @ScriptDir & "\passwords.txt"
    If Not FileExists($password_file) Then FileWrite($password_file, "Passwort 1:streng geheim" & @CRLF & "Passwort 2:auch streng geheim")

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

    ;Passwörter einlesen
    Dim $passwords
    _FileReadToArray($password_file, $passwords)

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

    If Not IsArray($passwords) Or (IsArray($passwords) And $passwords[0] = 0) Then
    MsgBox(64, "Fehler", "Es konnten keine Passwörter gefunden werden. Das Programm wird beendet.")
    Exit
    Else
    $anz_passwords = $passwords[0]

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

    ;Erste Zeile löschen und Array für Buttons dimensionieren
    _ArrayDelete($passwords, 0)
    Dim $buttons[$anz_passwords]

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

    EndIf

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

    ;Ggf. GUI erstellen
    If $anz_passwords > 1 Or $always_show_gui = True Then
    GUICreate("", 230, 120 + (25 * $anz_passwords), -1, -1, -1, $WS_EX_TOPMOST)
    GUISetBkColor(0xFEFFDF)
    GUICtrlCreateLabel("Bitte wählen Sie ein Passwort aus:", 10, 22, 220)
    GUICtrlSetFont(-1, 9)
    $line_counter = 0

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

    For $line In $passwords
    $couple = StringSplit($line, ":", 3)
    $buttons[$line_counter] = GUICtrlCreateButton($couple[0], 20, 60 + (37 * $line_counter), 190, 32)
    $line_counter += 1
    Next

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

    EndIf

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

    ;Auf das Login-Fenster warten
    While 1

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

    If ProcessExists("AcroRD32.exe") And WinExists("Kennwort") Then

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

    $pass_win_handle = WinGetHandle("Kennwort")

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

    If $anz_passwords = 1 And $always_show_gui = Not True Then

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

    $couple = StringSplit($passwords[0], ":", 3)
    $password = StringStripWS($couple[1], 3)

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

    WinActivate($pass_win_handle)
    Send($password)
    Send("{ENTER}")
    Sleep(2000)

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

    Else
    ;GUI anzeigen
    GUISetState()

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

    ;GUI überwachen
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE)
    WinWaitClose($pass_win_handle)

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

    Case $msg <> 0

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

    $shift = 4

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

    If $msg >= $shift And $msg <= $shift + $anz_passwords Then

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

    $couple = StringSplit($passwords[$msg - $shift], ":", 3)
    $password = StringStripWS($couple[1], 3)

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

    WinActivate($pass_win_handle)
    Send($password)
    Send("{ENTER}")
    GUISetState(@SW_HIDE)
    Sleep(2000)

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

    EndIf
    EndSelect

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

    EndIf

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

    EndIf

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

    Sleep(100)

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

    WEnd

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

    ;----------------------------------------
    Func exit_now()

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

    MsgBox(64, "Hinweis", "Das Programm wird nun beendet", 1)
    Exit

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

    EndFunc

    [/autoit]


    Gruß Trainer