Seite 1 von 1

[GELÖST] Anzeige eines Auswahlfensters während der Installation

Veröffentlicht: 20. Januar 2025 – 16:08 Uhr
von Mikael S
Hallo,

für eine spezielle Aufgabe benötige ich einen Dialog zur Auswahl einer Aktion während der Paketinstallation auf dem Zielrechner.

Bisher habe ich `waptguihelper.grid_dialog` verwendet. Dies funktioniert zwar mit PyScripter, aber nur, weil es sich um meine Sitzung handelt. Die Installation von Paketen über die Konsole funktioniert nicht.

Ich kenne den Trick für ausführbare Dateien mit `get_active_sessions` und anschließend `start_interactive_process`. `grid_dialog` hat jedoch keinen Sitzungsparameter.

Gibt es eine Möglichkeit, diesen Dialog für die aktive Sitzung zu generieren und die ausgewählte Aktion abzurufen?




Mit freundlichen Grüßen

Betreff: Anzeige eines Auswahlfensters während der Installation

Veröffentlicht: 20. Januar 2025 – 16:39 Uhr
von Sfonteneau
Guten Morgen

Wir können die Sitzung auffordern, Folgendes auszuführen:

Code: Alle auswählen

waptpython -c "import json;import waptguihelper;waptguihelper.grid_dialog('hello',json.dumps({'hello':'hello'}))"
Das Problem ist, dass der aktuelle Code den Ausgabewert meines Wissens nicht abrufen kann. Wir müssten das genauer untersuchen; es wäre eine interessante Option

Betreff: Anzeige eines Auswahlfensters während der Installation

Veröffentlicht: 24. Januar 2025 – 13:10 Uhr
von Mikael S
Tatsächlich gibt es kein Zurück mehr.

Ich habe versucht, die Ausgabe mit `print` abzurufen, aber auf den ersten Blick scheint es mit der Funktion `win32process.CreateProcess` nicht so einfach zu sein.

Wahrscheinlich werde ich sie in eine Datei schreiben und vom Hauptprogramm auslesen. Im Moment sehe ich keinen einfacheren Weg.

Betreff: Anzeige eines Auswahlfensters während der Installation

Veröffentlicht: 24. Januar 2025 - 14:06 Uhr
von Sfonteneau
Ich habe nachgesehen, ich habe etwas, das funktioniert ;)

Code: Alle auswählen

# -*- coding: utf-8 -*-
from setuphelpers import *

import os
import win32api
import win32con
import win32process
import win32security
import win32ts
import win32profile
import win32pipe
import win32file

try:
    from waptenterprise.waptservice.enterprise import get_active_sessions
except:
    from waptservice.enterprise import get_active_sessions


def start_interactive_process2(app_filename, cmdline=None, session_id=None, hide=True, minimize=False):

    if session_id is None:
        session_id = win32ts.WTSGetActiveConsoleSessionId()
    if session_id == 0xffffffff:
        return None

    CREATE_BREAKAWAY_FROM_JOB = 0x1000000
    priority = win32con.NORMAL_PRIORITY_CLASS | win32con.CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB
    startup = win32process.STARTUPINFO()
    startup.lpDesktop = None
    startup.dwFlags = win32con.STARTF_USESTDHANDLES | win32con.STARTF_USESHOWWINDOW
    startup.wShowWindow = win32con.SW_HIDE

    token = win32ts.WTSQueryUserToken(session_id)


    saAttr = win32security.SECURITY_ATTRIBUTES()
    saAttr.bInheritHandle = True

    read_pipe, write_pipe = win32pipe.CreatePipe(saAttr, 0)
    win32api.SetHandleInformation(read_pipe, win32con.HANDLE_FLAG_INHERIT, 0)


    startup.hStdOutput = write_pipe
    startup.hStdError = write_pipe
    startup.hStdInput = win32api.GetStdHandle(win32api.STD_INPUT_HANDLE)

    if cmdline is None:
        cmd = f'"{app_filename}"'
    else:
        cmd = f'"{app_filename}" {cmdline}'

    working_directory = "C:\\Windows\\System32"

    environment = win32profile.CreateEnvironmentBlock(token, False)
    new_token = win32security.DuplicateTokenEx(token, win32security.SecurityDelegation, win32security.TOKEN_ALL_ACCESS, win32security.TokenPrimary)

    process_info = win32process.CreateProcessAsUser(
        new_token,
        None,
        f'cmd.exe /c {cmd}',
        None, None,
        True,
        priority,
        environment,
        working_directory,
        startup
    )

    win32api.CloseHandle(token)
    win32api.CloseHandle(new_token)

    win32file.CloseHandle(write_pipe)

    output = b""
    while True:
        try:
            chunk = win32file.ReadFile(read_pipe, 4096)[1]
            if not chunk:
                break
            output += chunk
        except Exception:
            break

    win32file.CloseHandle(read_pipe)

    return output.decode("utf-8", errors="ignore")




def install():
    list_session = get_active_sessions()
    for s in list_session:
        output = start_interactive_process2('''waptpythonw -c "import json;import waptguihelper;print(waptguihelper.grid_dialog('hello',json.dumps({'hello':'hello'})))"''',session_id=s)
        print(output)
Allerdings liegt es in Ihrer Verantwortung, die while-Schleife so zu gestalten, dass eine unendliche Wartezeit vermieden wird

Betreff: Anzeige eines Auswahlfensters während der Installation

Veröffentlicht: 4. Februar 2025 - 10:22 Uhr
von Mikael S
Okay, das funktioniert. Es war etwas kompliziert, alle Argumente in Anführungszeichen zu setzen und die Werte abzurufen, insbesondere da es sich um eine Liste von Werten handelt, die ich sende.

Für alle Interessierten hier ein Teil des Codes

Code: Alle auswählen

titre = "'Choix'"
json_list_backup = json.dumps(list_choix).replace('"', "'")

command_line = f'import json;import waptguihelper;print(waptguihelper.grid_dialog({titre},{json_list}, waptguihelper.GRT_SELECTED))'
list_session = get_active_sessions()
for s in list_session:
    selected_backup = ast.literal_eval(start_interactive_process2(f'waptpythonw -c "{command_line}"', session_id=s))
Die Schleife scheint mir jedoch in Ordnung zu sein. Ich sehe nicht, in welchem ​​Szenario sie ein Problem verursachen könnte.

Betreff: Anzeige eines Auswahlfensters während der Installation

Veröffentlicht: 4. Februar 2025 - 11:59 Uhr
von dcardon
Hallo Mikaël,

danke für das Feedback :-). Ich markiere das Thema als GELÖST.

Denis