Outlook automatisierung mit .exe kompilierung

  • Hallo allerseits,


    ich habe folgende Problem und hoffe, ihr könnt mir helfen.

    Wir sind jetzt zwecks Domänenzusammenführung mit unserem Exchange Server auf eine andere Domäne als auf unserem Active Directory umgezogen. Das AD folgt erst in ca. 2 Jahren. Solange unsere User jetzt in 2 Domänen hängen, kommt bei jedem Outlook Start die Abfrage wegen Kennwort und Benutzername. Die Passwort speichern Funktion von Windows ist eher sehr unzuverlässig. die geht 3 mal und 2 mal nicht...

    Also hab ich ein Programm geschrieben, das ich an die User weitergebe. Das Programm macht dann folgendes:

    -einen Ordner unter C:/admin erstellen

    -Aut2Exe reinkopieren (das vorher schon per Fileinstall eingebunden war)

    -eine GUI erstellen, wo der Benutzer seine Anmeldedaten eingeben kann

    -Aus diesen Daten dann eine .au3 file erstellen

    -diese File dann per Aut2Exe in eine .exe umwandeln.

    Diese Exe sollte dann Outlook aufrufen, bleibt im Hintergrund in einer Schleife und gibt, falls das Abfragefenster kommt, die Anmeldeinfos ein.

    Das klappt auch alles ganz gut, nur beim Kompilieren kommt ab und zu der Fehler Unable to open the Script File. Wenn ich das ganze dann auf einem anderen Rechner versuche, klappt es natürlich. Bei Win XP hat es bis jetzt immer funktioniert. Nur Win7 bereitet ab und zu Probleme. Kann jedoch leider nicht sagen woran genau es liegt. Einen Fehler im Script schließe ich eigentlich aus, da es ja meistens funktioniert.

    Muss ich bei Windows 7 weiter Parameter an den Kompiler eingeben oder gibt es sogar eine bessere Möglichkeit und auf einem Rechner wo kein AutoIT installiert ist, eine Exe zu erstellen und ich bin auf dem völlig falschen Lösungsweg?

    Danke schon mal für eure Hilfe.

    Spoiler anzeigen


    Die auskommentieren Bereiche könnt ihr einfach Ignorieren, da muss ich noch was umschreiben.


    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=outlook.ico
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <file.au3>
    #include <comboconstants.au3>
    #include <windowsconstants.au3>
    #include <guiconstantsex.au3>
    ;----------------------------------Variablen------------------------------------------
    Global $Ordner = "c:\admin\autoit_Outlook"
    DirCreate($Ordner) ;ordner anlegen
    Global $file = FileOpen($Ordner & "unkompiled.au3", 10)
    ;Global $Wartezeit = 60
    ;----------------------------------Variablen Ende------------------------------------------
    ;----------------------------------Dateien zum kompilieren kopieren------------------------------------------
    FileInstall("C:\Daten\ScriptingProgrammierung\autoit\AutoIT_Outlook\Aut2exe.exe", $Ordner & "aut2exe.exe", 1)
    FileInstall("C:\Daten\ScriptingProgrammierung\autoit\AutoIT_Outlook\OUTLOOK_2007.ico", $Ordner & "OUTLOOK_2007.ico", 1)
    FileInstall("C:\Daten\ScriptingProgrammierung\autoit\AutoIT_Outlook\OUTLOOK_2010.ico", $Ordner & "OUTLOOK_2010.ico", 1)
    ;----------------------------------------------------------------------------------------------
    ;----------------------------------GUI Erstellung------------------------------------------
    $gui = GUICreate("neue Outlook.exe erstellen", 500,250)
    $combo = GUICtrlCreateCombo("Windows7 - Outlook 2010", 270, 30, 200, 25, BitOR($cbs_dropdownlist, $cbs_autohscroll, $ws_vscroll))
    GUICtrlSetData(-1, "win XP - Outlook2010|Win XP oder Win 7 - outlook 2007")
    $labelCombo = GUICtrlCreateLabel("Windows/Outlook kombination auswählen:", 20, 30, 220, 25)
    $labelUser = GUICtrlCreateLabel("Benutzername eingeben:", 20, 60, 200, 25)
    $inputUser = GUICtrlCreateInput("", 270, 60, 200, 25)
    $labelPW = GUICtrlCreateLabel("Kennwort eingeben", 20, 90, 200, 25)
    $inputPW = GUICtrlCreateInput("", 270, 90, 200, 25, 0x0020)
    $btnStart = GUICtrlCreateButton("Start", 225, 130, 50, 25)
    GUISetState(@SW_SHOW)
    ;----------------------------------Ende GUI Erstellung------------------------------------------
    ;----------------------------------Hauptschleife------------------------------------------
    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case -3 ;event wird über x geschlossen
    Exit
    Case $btnStart
    $combotext = GUICtrlRead($combo)
    Switch $combotext
    Case ("Windows7 - Outlook 2010")
    win7_out2010()
    kompile2010()
    info2()
    Sleep(2000)
    info3()
    exekopie()
    Sleep (2000)
    ;delete()
    ;InfoMsg()
    Exit
    Case ("win XP - Outlook2010")
    winXP_out2010()
    kompile2010()
    info2()
    Sleep(2000)
    info3()
    exekopie()
    Sleep (2000)
    ;delete()
    ;InfoMsg()
    Exit
    Case ("Win XP oder Win 7 - outlook 2007")
    Out2007()
    kompile2007()
    info2()
    Sleep(2000)
    info3()
    exekopie()
    Sleep (2000)
    ;delete()
    ;InfoMsg()
    Exit
    #cs
    case ("Outlook Web Access")
    OutlookWebAccess()
    kompile2010()
    info2()
    Sleep(2000)
    info3()
    exekopie()
    Sleep (2000)
    ;delete()
    ;InfoMsg()
    Exit
    #ce
    EndSwitch
    EndSwitch
    WEnd
    ;---------------------------------Hauptschleife Ende----------------------------------------
    ;----------------------------------Funktionen----------------------------------------------------
    Func win7_out2010()
    $user = GUICtrlRead($inputUser)
    $pw = GUICtrlRead($inputPW)
    FileWrite($file, "Opt('WinDetectHiddenText',1)"& @CRLF)
    FileWrite($file, "opt('SendKeyDelay',30)"& @CRLF)
    FileWrite($file, "ShellExecute (@ProgramFilesDir&'\Microsoft Office\Office14\outlook.exe')" & @CRLF)
    FileWrite($file, "do"& @CRLF)
    FileWrite($file, "if WinExists ('Windows-Sicherheit','Anmeldedaten speiche') Then"& @CRLF)
    FileWrite($file, "sleep (200)"& @CRLF)
    FileWrite($file, "Send('{DOWN}{DOWN}')"& @CRLF)
    FileWrite($file, "sleep (200)"& @CRLF)
    FileWrite($file, "Send('xxxxx.xxxxx"&$user&"')"& @CRLF)
    FileWrite($file, "sleep (200)"& @CRLF)
    FileWrite($file, "Send('{TAB}')"& @CRLF)
    FileWrite($file, "sleep (200)"& @CRLF)
    FileWrite($file, "Send('"&$pw&"')"& @CRLF)
    FileWrite($file, "sleep (200)"& @CRLF)
    FileWrite($file, "Send('{ENTER}')"& @CRLF)
    FileWrite($file, "EndIf"& @CRLF)
    FileWrite($file, "until ProcessExists ('outlook.exe') = False"& @CRLF)
    FileWrite($file, 'msgbox(0,"","Prozess AutoIT beendet")' & @CRLF)
    EndFunc ;==>win7_out2010
    #cs
    Func winXP_out2010()
    $user = GUICtrlRead($inputUser)
    $pw = GUICtrlRead($inputPW)
    FileWrite($file, "$i = 0" & @CRLF)
    FileWrite($file, "if FileExists (@ProgramFilesDir&'\Microsoft Office\Office14\outlook.exe') Then" & @CRLF)
    FileWrite($file, "ShellExecute (@ProgramFilesDir&'\Microsoft Office\Office14\outlook.exe')" & @CRLF)
    FileWrite($file, "Sleep (50)" & @CRLF)
    FileWrite($file, "While WinExists ('Verbindung zu xxxx.xxxx herstellen','') = False" & @CRLF)
    FileWrite($file, 'msgbox(0,"","hängt in schleife")' & @CRLF)
    FileWrite($file, "Sleep (1000)" & @CRLF)
    FileWrite($file, "$i = $i + 1" & @CRLF)
    FileWrite($file, "If $i = "&$Wartezeit&" Then" & @CRLF)
    FileWrite($file, 'msgbox(0,"","Fenster geht nicht auf - Programmende")' & @CRLF)
    FileWrite($file, "Exit" & @CRLF)
    FileWrite($file, "Else" & @CRLF)
    FileWrite($file, "EndIf" & @CRLF)
    FileWrite($file, "WEnd" & @CRLF)
    FileWrite($file, "if WinExists ('Verbindung zu xxxx.xxxx herstellen','') Then" & @CRLF)
    FileWrite($file, "WinActivate ('Verbindung zu xxxx.xxxx herstellen')" & @CRLF)
    FileWrite($file, "Send ('+{tab}')" & @CRLF)
    FileWrite($file, "Sleep (50)" & @CRLF)
    FileWrite($file, "send ('lxxxxx.xxxx" & $user & "')" & @CRLF)
    FileWrite($file, "send ('{tab}')" & @CRLF)
    FileWrite($file, "send ('" & $pw & "')" & @CRLF)
    FileWrite($file, "send ('{enter}')" & @CRLF)
    FileWrite($file, 'msgbox(0,"","alles passt - Programmende")' & @CRLF)
    FileWrite($file, "exit" & @CRLF)
    FileWrite($file, "else" & @CRLF)
    FileWrite($file, 'msgbox(0,"","nichts wird gefunden - Programmende")' & @CRLF)
    FileWrite($file, "exit" & @CRLF)
    FileWrite($file, "endif"& @CRLF)
    FileWrite($file, "endif")
    FileClose($file)
    EndFunc ;==>winXP_out2010
    #ce
    Func Out2007()
    $user = GUICtrlRead($inputUser)
    $pw = GUICtrlRead($inputPW)
    FileWrite($file, "Opt('WinDetectHiddenText',1)"& @CRLF)
    FileWrite($file, "opt('SendKeyDelay',30)"& @CRLF)
    FileWrite($file, "ShellExecute (@ProgramFilesDir&'\Microsoft Office\Office12\outlook.exe')" & @CRLF)
    FileWrite($file, "do"& @CRLF)
    FileWrite($file, "if WinExists ('Verbindung mit xxxx.xxxx herstellen','Kennwort &speichern') Then"& @CRLF)
    FileWrite($file, "sleep (200)"& @CRLF)
    FileWrite($file, "Send('{SHIFTDOWN}{TAB}{SHIFTUP}')"& @CRLF)
    FileWrite($file, "sleep (200)"& @CRLF)
    FileWrite($file, "Send('xxxx.xxxx"&$user&"')"& @CRLF)
    FileWrite($file, "sleep (200)"& @CRLF)
    FileWrite($file, "Send('{TAB}')"& @CRLF)
    FileWrite($file, "sleep (200)"& @CRLF)
    FileWrite($file, "Send('"&$pw&"')"& @CRLF)
    FileWrite($file, "sleep (200)"& @CRLF)
    FileWrite($file, "Send('{ENTER}')"& @CRLF)
    FileWrite($file, "EndIf"& @CRLF)
    FileWrite($file, "until ProcessExists ('outlook.exe') = False"& @CRLF)
    FileWrite($file, 'msgbox(0,"","Prozess AutoIT beendet")' & @CRLF)
    EndFunc ;==>Out2007
    #cs
    func OutlookWebAccess()
    $user = GUICtrlRead($inputUser)
    $pw = GUICtrlRead($inputPW)
    FileWrite($file, "#include <ie.au3>" & @CRLF)
    FileWrite($file, "$oiezus = _IECreate ('https://owa.xxxx.com/owa')" & @CRLF)
    ;FileWrite($file, "if IsObj (_IECreate ('https://owa.xxxx.com/owa')) then" & @CRLF)
    FileWrite($file, "_IELoadWait($oiezus)" & @CRLF)
    FileWrite($file, "WinActivate ($oiezus)" & @CRLF)
    FileWrite($file, "WinSetState('Outlook Web App - Windows Internet Explorer','',@SW_MAXIMIZE)" & @CRLF)
    FileWrite($file, "send ('xxxx.xxxxx"&$user&"')" & @CRLF)
    FileWrite($file, "send ('{tab}')" & @CRLF)
    FileWrite($file, "Sleep (200)" & @CRLF)
    FileWrite($file, "Send ('"&$pw&"')" & @CRLF)
    FileWrite($file, "Sleep (200)" & @CRLF)
    FileWrite($file, "send ('{enter}')" & @CRLF)
    ;FileWrite($file, "EndIf" & @CRLF)
    EndFunc
    #ce
    Func exekopie()
    FileCreateShortcut ($Ordner & "outlook.exe", @DesktopDir&"\outlook.exe")
    FileCreateShortcut ($Ordner & "outlook.exe", @StartupDir&"\outlook.exe")
    EndFunc ;==>exekopie
    Func kompile2010()
    FileChangeDir($Ordner)
    Run(@ComSpec & " /c " & 'aut2exe.exe /in ' & $Ordner & 'unkompiled.au3 /out ' & $Ordner & 'outlook.exe /icon ' & $Ordner & 'OUTLOOK_2010.ico', "", @SW_HIDE)
    EndFunc ;==>kompile2010
    Func kompile2007()
    FileChangeDir($Ordner)
    Run(@ComSpec & " /c " & 'aut2exe.exe /in ' & $Ordner & 'unkompiled.au3 /out ' & $Ordner & 'outlook.exe /icon ' & $Ordner & 'OUTLOOK_2007.ico', "", @SW_HIDE)
    EndFunc ;==>kompile2007
    func delete()
    FileDelete ($Ordner &"OUTLOOK_2007.ico")
    FileDelete ($Ordner &"OUTLOOK_2010.ico")
    FileDelete ($Ordner &"unkompiled.au3")
    FileDelete ($Ordner &"aut2exe.exe")
    EndFunc
    func info2()
    $labelInfo2 = GUICtrlCreateLabel ("Ordner "&$Ordner&" wird erstellt", 150, 190, 250, 25,-1)
    EndFunc
    func info3()
    $labelInfo3 = GUICtrlCreateLabel ("Outlook.exe und Verknüpfungen werden erstellt", 150, 220, 250, 25)
    EndFunc
    func InfoMsg()
    MsgBox (0,"INFO", " - Auf dem Desktop und im Autostart wurde eine Verknüpfung erstellt "& @crlf & @crlf &" - das Outlook-Symbol aus der Taskleiste / Schnellstartleiste muss evtl. noch entfernt werden "& @crlf & @crlf &" - bei manchen Systemen ist Outlook im Autostart bei "& @crlf &"C:\Dokumente und einstellungen\ALL USERS\autostart -> hier werden Admin Rechte zum entfernen benötigt")
    EndFunc
    ;----------------------------------Funktionen-ENDE-----------------------------------------

    [/autoit]

    Einmal editiert, zuletzt von Curtys (28. August 2014 um 08:11)

  • Keine Ahnung ob ich eure Situation richtig verstehe, aber die Lösung erscheint mir dann doch etwas seltsam. Zum einen sollte die PW speichern Funktion des Emailclients immer funktionieren, also würde ich zunächst dort ansetzen und prüfen warum das bei manchen eurer User nicht der Fall ist. Zum anderen hat die PW speichern Funktion ja nichts damit zu tun wo nun euer Exchange Server steht oder in welcher Domäne sich der Rechner befindet.

    Wie dem auch sei... deine Frickellösung ist nicht nur umständlich sondern auch unsicher. Jeder kann eine Autoit exe Datei leicht dekompilieren. Die Passwörter sind also alles andere als sicher gespeichert, das selbe gilt natürlich auch für die Speicherung im Mailclient. Es gibt genügend Tools um gespeicherte Passwörter in gägnigen Mailclients und Browsern auszulesen. Da deine Lösung also ohnehin unsicher ist würde ich sie zumindestens einfacher gestalten. Wozu soll das PW in der exe selbst gespeichert werden? Schreib einfach dein Automatisierungsscript und speichere bzw. lese das gespeicherte PW in /aus einer verschlüsselten Datei. Passende crypt Funktionen bietet dir Autoit jedenfalls. Ein Angreifer muss dann zunächst deinen Quellcode dekompilieren, das MasterPW und den Verschlüsselungsalgorithmus finden und kann danach erst das gespeicherte PW entschlüsseln. Ist natürlich genauso unsicher und nur minimal mehr Aufwand für den Angreifer, aber wenigstens brauchst du dir selbst keinen Abbrechen um das ganze halbwegs sicher zu realisieren.

    Zum Automatisierungsteil deines Scriptes:

    Du solltest auf send() verzichten. Zum einen kann es Probleme mit Sonderzeichen geben, zum anderen ist send() langsam und fehleranfällig wenn Benutzerinteraktion dazwischen kommt. Verwende besser contrlsend oder controlsettext und zum bestätigen des Dialogs controlclick. Details zu den Funktionen entnimmst du der Hilfe oder der Forensuche.

  • Danke für die Antwort,

    habe das Script jetzt wie empfohlen umgebaut, funktioniert jetzt auch ganz gut. Nur das Masterpasswort zum Entschlüsseln muss ja auch in beiden Exe sein. Oder sehe ich das falsch?

    mit dieser Funktion erstelle ich die Dateien aus den Eingaben von einem GUI:

    Spoiler anzeigen
    [autoit]


    func encryptFile()
    ; die Datei C:\admin\Outlook\User.txt wird erstellt und mit dem eingegebenen Benutzernamen befüllt
    $fileDeCryptUser = "C:\admin\Outlook\User.txt"
    FileOpen ($fileDeCryptUser, 2)
    FileWrite ($fileDeCryptUser, GUICtrlRead($inputUser))
    FileClose ($fileDeCryptUser)
    ; selbes mit KW.txt
    $fileDeCryptKW = "C:\admin\Outlook\KW.txt"
    FileOpen ($fileDeCryptKW, 2)
    FileWrite ($fileDeCryptKW, GUICtrlRead($inputPW))
    FileClose ($fileDeCryptKW)
    ; die Dateien werden mit RC4 und dem Kennwort xxxx verschlüsselt und unter C:\admin\Outlook\Encrypt abgelegt, wo sie später von der OutlookExe gelesen werden
    _Crypt_EncryptFile($fileDeCryptUser, "C:\admin\Outlook\Encrypt\User.txt", "PasswortZumVerschlüsseln", $CALG_RC4)
    _Crypt_EncryptFile($fileDeCryptKW, "C:\admin\Outlook\Encrypt\KW.txt", "PasswortZumVerschlüsseln", $CALG_RC4)
    ; die Dateien mit den Benutzerangaben im Klartext werden gelöscht
    FileDelete ($fileDeCryptUser)
    FileDelete ($fileDeCryptKW)
    EndFunc

    [/autoit]


    und so werden sie wieder von der anderen Exe verarbeitet:

    Spoiler anzeigen
    [autoit]


    $UserEncrypt = FileRead ("C:\Admin\Encrypt\user.txt")
    $user = BinaryToString(_Crypt_DecryptData($UserEncrypt, "PasswortZumVerschlüsseln",$CALG_RC4))
    $kwEncrypt = FileRead ("C:\Admin\Encrypt\kw.txt")
    $kw = BinaryToString(_Crypt_DecryptData($kwEncrypt, "PasswortZumVerschlüsseln", $CALG_RC4))

    [/autoit]

    Kann ich das mit dem Masterpasswort auch anders Lösen? So ist das PW ja in beiden EXE´s. Für einen evtl. Angreifer ja sehr leicht zu durchschauen.

    Und zum Thema PW speichern: im Netz findet man haufenweise solche Probleme aber nicht viele Lösungen, wahrscheinlich liegts am Autodiscover oder am Trust. Aber unser Netzwerkadmin ist im Moment ziemlich ausgelastet und kann der Sache nicht genau auf den Grund gehen. Solange muss es halt mit der gebastelten Lösung gehen.

  • Warum speicherst du die Daten erst unverschlüsselt und verschlüsselst sie dann im Anschluss? Verwende doch einfach das hier und schreibe gleich den verschlüsselten String in eine Datei:

    [autoit]


    #include <String.au3>
    _stringencrypt()

    [/autoit]

    Du verwendest fileopen / filewrite und fileclose im übrigen falsch.

    Filewrite nimmt entweder ein handle einer Datei oder den Pfad zu einer Datei entgegen. Übergibst du nur einen Pfad wird automatisch ein fileopen und ein fileclose durchgeführt, allerdings eben mit der entsprechenden Standardeinstellung für fileopen. Wenn du einen bestimmten Lese oder Schreibmodus erzwingen willst musst du das fileopen selbst durchführen und statt einem Pfad das handle von fileopen an die filewrite Funktion übergeben, in diesem Fall muss das fileclose ebenfalls selbst durchgeführt werden. Fileclose erwartet immer ein file handle und kann garnichts mit Pfaden anfangen. Ein weiterer Grund fileopen und fileclose selbst durchzuführen wäre wenn du mehrmals in die gleiche Datei schreiben willst. Dadurch minimierst du dann die IO Last, da die Datei solange geöffnet bleiben kann bis du fertig mit deinen Schreibvorgängen bist.

    Richtig wäre also sowas hier:

    [autoit]


    $pfad = "C:\test.txt"
    $handle = fileopen($pfad,...dein gewünschter modus...)
    $schreibergebnis = filewrite($handle,"test")
    fileclose($handle)

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

    ; oder eben nur so
    filewrite($pfad,"test")

    [/autoit]
    Zitat

    Kann ich das mit dem Masterpasswort auch anders Lösen? So ist das PW ja in beiden EXE´s. Für einen evtl. Angreifer ja sehr leicht zu durchschauen.

    Nunja wie oben erwähnt macht es aus Sicherheitssicht keinen Unterschied ob du dir nun einen abbrichst und das richtige Benutzerpw in einer userspezifischen exe speicherst oder ob du ein masterpw darin speicherst. Beides kann man mit dem nötigen Wissen leicht aus der exe extrahieren. Der Weg über die verschlüsselte Datei macht für den Angreifer nur ein klein wenig mehr Arbeit, schützt aber auch nicht wirklich besser. Dafür ist es aber für dich leichter umzusetzen.

    Prinzipiell könntest du das Masterpw aber auch dynamisch erzeugen und so an die HW des PCs binden. Hat jemand nun nur Zugriff auf dein Script und die Datei des Benutzers so benötigt er zusätzlich noch die verwendeten HW Daten die du zur Erzeugung des Masterpw nutzt. Er kann die Datei also sehr wahrscheinlich nur auf dem betreffenden Rechner entschlüsseln, was einen Angriff schwieriger machen dürfte.

    Hier mal ein Beispiel wie du einen Masterkey erzeugen kannst der auf jedem Rechner und für jeden angemeldeten Benutzer am Rechner anderst wäre:

    [autoit]


    $key = @computername & @username & getMAC() & "alles was dir sonst noch an eindeutigen Merkmalen einfällt"
    func getMAC()
    ; google danach wie man die MAC der primären Netzwerkkarte ermittelt
    endfunc

    [/autoit]

    Einmal editiert, zuletzt von misterspeed (27. August 2014 um 21:32)