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