Exe aus Script heraus erstellen mit eigenen Parametern

  • Hallo Au3 Freunde

    Ziel:
    - eine .exe Datei erstellen, durch Übergabe von Parametern soll sie einmalig werden
    - diese Parameter sollen also "hardcoded" sein

    Sinn und Zweck:
    Ich möchte "personengebundene" Exefiles erstellen. Um das Ganze so einfach wie möglich zu halten, möchte ich das eigentliche Script
    als Template verwenden und per Buttonklick die "personengebundenen Daten" als Parameter an das Template übergeben.

    Fortschritt:
    Das Erstellen der Exe funktioniert, aber nicht wie ich es will.

    Hier mein TestScript


    Was muss ich anders machen, damit einfach nur eine test.exe entsteht, in der die Parameter erfolgreich übergeben wurden?
    Wenn die test.exe erstellt wurde, lass ich mir per _ArrayDisplay() die Parameter anzeigen, bekomm aber immer nur ein leeres Array angezeigt :S

    Könnt ihr mir weiterhelfen?

    Mfg Lo..

  • So wie ich das verstanden habe ist dein Ansatz falsch.
    Kommandozeilenparameter werden zur Laufzeit eines Programmes ausgelesen. Sie werden beim erstellen des Programmes nicht "dauerhaft" übergeben, sondern jedesmal beim start.
    (Zum Beispiel Bei einer Verknüpfung: "D:\Spiele\Activision\Call of Duty 4\iw3mp.exe" connect 148.251.81.10:28938)

    Wenn du (z.B.) einen Labeltext ändern willst würde ich es dir so empfehlen: Vergebe für alles was Personalisiert werden soll eine EINDEUTIGE ID (Text).
    Dann kopierst du das Script, führst eine Textersetzung der EINDEUTIGEN IDs durch, compilierst das und löscht das kopierte Script dann (Kannst es ja auch mit FileInstall in dein Script packen).
    Die Variablen für die Textersetzung kannst du ja auch je Script als Kommentar an den Anfang packen
    z.B.:

    AutoIt
    #cs
    #SCRIPTCREATION PARAMETERS
    EINDEUTIGEID1::#::INPUT1
    EINDEUTIGEID2::#::INPUT2
    EINDEUTIGEID3::#::INPUT3
    #ENDSCRIPTCREATION PARAMETERS
    #ce

    und dann mit _StringBetween,... Ich denke, du weißt, was ich meine.

    Theoretisch kannst du den kram auch an dein Script anhängen, nachdem es Kompiliert wurde, und es dann dort auch mit deinem Programm auslesen.

    ;Nach Kompilieren
    FileWrite(FileRead("test.exe")&@crlf&$vars)
    ;In dem Script:
    $data=FileRead(@ScriptName)
    _StringBetween($data,"#SCRIPTCREATION PARAMETER","#ENDSCRIPTCREATION PARAMETER")
    ;...

    MfG Kanashius

  • Genau. So wirklich verstanden habe ich auch nicht was du eigentlich erreichen bzw. im Script dynamisch ersetzen möchtest. Wenn du sowas schon machen willst/musst arbeite mit eindeutigen Strings im Template, welche vom Compilerscript ausgetauscht werden, so wie Kanashius das beschrieben hat. Dabei muss man aber vorsichtig sein. Deine Platzhalterstrings müssen wirklich eindeutig sein und dürfen nicht mit anderen Scriptbestandteilen identisch sein. Die Frage bleibt aber warum du das überhaupt tun musst/willst. Es wäre doch viel praktischer wenn deine Exe nur einmal kompiliert werden müsste und trotzdem individualisiert wäre. Je nach Aufgabe kann man das sicher sehr viel geschickter realisieren. Nebenbei gäbe es noch die Möglichkeit deine Individualisierung im Exe-Dateiheader zu verstecken und diesen im Hauptcompilat durch Bearbeiten der EXE auf Binärebene zu ändern. Das Script müsste diese Versteckte Information dann aber ebenso zur Laufzeit aus der eigenen Binärdatei auslesen.

  • Okay, das klappt. Danke @Kanashius für den Wink in die richtige Richtung

    @misterspeed ich bau grad ein Server-Client Tool, bei dem es nötig ist, dass ich die Clienten eindeutig identifizieren muss/soll. Dabei will ich Mogeleien
    so gut es geht ausschliessen/ verhindern. Ja, ich weiss, dass wenn man will und das KnowHow hat, man alles umgehen kann, aber Otto NormalUser wird das hoffentlich nicht drauf haben.
    Bei festgestellten Mogelversuchen wird die Serververbindung getrennt. Beim 2. mal wird der User gesperrt und beim 3. mal löscht sich die Client.exe.

    Das wird mein 1. Projekt, mit dem ich was verdienen möchte ^^

  • Und wo ist hier das Problem? Wenn du Clients identifizieren willst dann arbeite mit einem "Lizenzserver". Jeder berechtigte Client bekommt von dir eine Lizenzdatei (oder eben nur einen Lizenzschlüssel) und muss diesen bei jeder Programmnutzung zunächst an den Server übermitteln. Wenn der Server den Schlüssel nicht kennt oder dieser nicht mehr gültig ist, dann sagt er dem Client, dass er Pech hat und sich meinetwegen selbst löschen soll. Anstatt jedem seine eigene EXE zu geben musst du nur jedem einen Schlüssel in die Hand drücken, welchen du jederzeit am Server zurückziehen/sperren kannst.

    EDIT:

    Um die Weitergabe eines gültigen Schlüssels zu verhindern kannst du diesen individuell an die Hardware/Software des berechtigten Client PCs koppeln (z.B. die MAC Adresse der Netzwerkkarte, den Windows Key, Windows HardwareID oder sonstige eindeutige Merkmale). Beispiele zu mehr oder weniger durchdachten Lizenzserver Scripten findest du hier und im englischen Forum sicher einige.

    2 Mal editiert, zuletzt von misterspeed (15. Februar 2016 um 20:28)