Serviceaccount - Interaktion mit User (Softwareverteilung)

  • Hallo zusammen

    Dank eurer Hilfe steht nun eine Abfrage, mit der ich in einem inifile die Programme übergeben kann, die der User zu schliessen hat - und er wird dazu via Messagebox aufgefordert.

    Das klappt wunderbar unter Usercontext, aber die Software (MSI, Setup.exe) können nur via "Admin und run-as" im Usercontext installiert werden:

    [ gelöst ] Offene Prozesse abfragen, MSGBox zum schliessen einblenden OK /Cancel - Errorlevel übergeben

    Wie erreiche ich nun, dass auch die Softwareverteilung via ServiceAccount klappt - und der User die Messagebox angezeigt bekommt?

    Wenn ich einen Dienst einrichte, mit srvany, type=interact - wird dem User ja die Messagebox angezeigt, wenn ich den Dienst aus einem anderen Usercontext heraus starte.

    Nur: wie bekomme ich ein Feedback zurückgeliefert, ob der User alle Prozesse geschlossen hat, und die Mesagebox verschwunden ist - oder - ob der User cancel gedrückt hat?

    Via Srvany verliere ich ja den Errorlevel - der ist nicht mehr abfragbar- in Context des Serviceaccounts.

    Also kann ich noch einen Regkey schreiben, oder einen Wert in ein Inifile stellen - und mir eine Funktion schreiben ala "WaitUntilRegkeyExists" oder "WaitUntilINIsectionhasValue" - oder ein File erstellen.

    Ich hoffe ihr habt ein paar zündende Ideen.

    Ziel ist nicht eine Softwareverteilungslösung, sondern eine Lösung den User aufzufordern, laufende Programme zu schliessen, vor der Installation - dem User aber auch die Möglichkeit zu geben - die Installation via Cancel auf später zu veschieben..

    Surfy

  • Vielleicht solltest du nochmal genauer erklären mit wievielen Teilscripten / seperaten Programmen wir es hier zutun haben. Ich hab das exit aus deinem anderen Thread sowieso nie verstanden.
    So wie ich dich verstehe läuft das so bei dir ab:

    main.exe als service
    main.exe startet user.exe welche die Prüfung auf laufende Prozesse durchführt und dann den User mit msgboxen "belästigt". Die User.exe läuft im usercontext oder läuft die auch als service?

    Wenn das so sein sollte sehe ich kein Problem. Du müsstest doch den Rückgabewert der gestarteten user.exe problemlos in der main.exe bekommen.

    [autoit]


    $pid = run("user.exe")
    processwaitclose($pid)
    $errorcode=@extended ; hier sollte dann deine 1 erscheinen oder wenn das Programm normal beendet wurde eine 0

    [/autoit]

    Oder aber ich hab dich total falsch verstanden und es gibt garkeine user.exe, sondern nur die main.exe.

    In dem Fall macht dein exit keinen Sinn. Stattdessen solltest du die Prozessprüfung in eine Funktion auslagern und die Funktion je nach Userantwort mit einem return $fehlercode verlassen. Danach kehrt dein Programm wieder in den Hauptteil zurück und kann entscheiden was zutun ist, zum Beispiel 4h nix tun und dann die Prüffunktion erneut aufrufen um den User zu nerven...

    Beispiel:

    [autoit]


    while 1
    $ergebnis = checkprocess()
    if $ergebnis = 0 then exit ; alles erledigt
    if $ergebnis = -1 then informadmin() ; per email oder logfile oder was weiss ich, danach wohl am ehesten noch ein exit
    if $ergebnis = 1 then sleep(300000) ; 5min warten und erneut prüfung starten...
    wend

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

    func checkprocess()
    ; hier halt deine Prüfung und die msgbox sache...
    if $cancelbutton then return 1 ; später installieren
    $success = install() ; startet die installation...
    if $success = 1 then return 0 ; alles lief gut und wurde intalliert
    if $sucess = -1 then return -1 ; programme wurden zwar geschlossen aber beim installieren gab es fehler...
    endfunc

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

    func install()
    ; programme installieren....
    if $allesgut = True then return 1
    if $allesgut = False then return -1
    endfunc

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

    func informadmin()
    ;lass dir was einfallen wie du auf fehlgeschlagene installationen reagieren willst
    exit
    endfunc

    [/autoit]

    Aber vielleicht hab ich dich immernoch nicht verstanden und liege mit meinen Vorschlägen total daneben...

  • Danke für deine erneute Hilfe! :thumbup:

    Leider habe ich mich zu ungenau ausgedrückt :wacko:

    Wir haben hier eine Software-Verteilung (Enteo Netinstall) - deren MsgBox Lösung so verbugt geworden ist, dass ich versuche einen Workarround zu basteln.

    Die Softwareverteilung trennt die Pakete in einen

    - Userteil (die Prozesse laufen im Syntax des eingeloggten Users)

    - Maschinenteil (laufen unter dem Permission des NetinStall-Users mit lokalen Adminrechten)

    Im Script eines Paketes kann ich angeben, welche EXE/Bat/MSI / Script Files - im Usercontest, und welche ausführbaren Dateien im Maschinencontext ausgeführt werden sollen.

    Mein Ziel wäre jetzt - eine Exe zu bauen - die im (Maschinenteil) Usercontext des Netinstall-users (also als ein RunAs Prozess) gestartet wird - die mit dem eingeloggten User kommunizieren kann.

    Dafür habe ich aus der Messagebox aus Thread 1 ein Service/Dienst gemacht - mithilfe von srvany.exe und installservice. Der Dienst ist so geflaggt, "interact with user" - dass ich durch das starten des Services erreichen kann - dass der User die MessageBox angezeigt bekommt - falls die abgefragten Prozesse offen sind.

    Die Frage ist nun, wie die Main-Exe, die via runAs am laufen ist - und den Service gestartet hat - nun erfahren kann, ob

    - Installiert werden kann, da keine der Prozesse laufen --> es darf installiert werden

    - der User Cancel gedrückt hat, weil er gerade nicht installieren will --> es darf NICHT installiert werden

    - der User die Prozesse geschlossen hat, und ok gedrückt hat --> es darf installiert werden

    Wenn ich im RunAs Prozess, dh der Main.exe eine andere Exe starte mit einer Messagebox, wird diese ja dann dem RunAs User angezeigt, und nicht dem eingeloggten User. Daher der von mir gewählte weg via Dienst/Service.

    Nur - wie erfährt nun die Main.exe - vie der User reagiert hat? Der Dienst beendet sich leider nicht von alleine, weil srvany das nicht checkt dass die Exe durchgelaufen ist. Andererseits könnte ich in der Messagebox.exe auch den eigenen laufenden Service beenden, falls die Antworten in Richtung "die Installation kann losgehen" deuten.

    Mhh, ein neuer Ansatz - aber erstmal ruft das Wochenende!!!!