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

Fragen zu WAPT-Paketen / Anfragen und Hilfe bezüglich WAPT-Paketen.
Forumregeln
Community-Forumregeln
* Englischer Support auf www.reddit.com/r/wapt
* Französischer Community-Support ist in diesem Forum verfügbar.
* Bitte kennzeichnen Sie gelöste Themen mit [GELÖST].
* Bitte bearbeiten Sie keine Themen, die mit [GELÖST] markiert sind. Erstellen Sie stattdessen ein neues Thema und verweisen Sie auf das alte.
* Geben Sie die installierte WAPT-Version, die vollständige Versionsnummer und die Build-Nummer (2.2.1.11957 / 2.2.2.12337 / usw.) sowie die Enterprise-/Discovery-Edition an.
* Versionen 1.8.2 und älter werden nicht mehr unterstützt. Fragen zu Version 1.8.2 werden nur beantwortet, wenn sie sich auf ein Upgrade auf eine unterstützte Version (2.1, 2.2 usw.) beziehen.
* Geben Sie das Server-Betriebssystem (Linux/Windows) und die Version (Debian Buster/Bullseye – CentOS 7 – Windows Server 2012/2016/2019) an.
* Geben Sie gegebenenfalls das Betriebssystem des Administrations-/Paketerstellungsrechners und des Rechners mit dem problematischen Agenten an (Windows 7/10/11/Debian 11/etc.).
* Vermeiden Sie es, mehrere Fragen in einem Thema zu stellen, da diese sonst möglicherweise ignoriert werden. Falls mehrere Themen relevant sind, erstellen Sie bitte separate Themen, vorzugsweise nacheinander und nicht gleichzeitig (d. h. vermeiden Sie Spam im Forum).
* Fügen Sie Code-Snippets, Screenshots und andere Bilder direkt in Ihren Beitrag ein. Links zu Pastebin, Bitly und anderen Drittanbieterseiten werden systematisch entfernt.
* Wie in jedem Community-Forum erfolgt die Unterstützung freiwillig durch die Mitglieder. Für kommerziellen Support kontaktieren Sie bitte den Vertrieb von Tranquil IT unter +44 2 40 97 57 55.
Gesperrt
Mikael S
Nachrichten: 26
Anmeldung: 20. Januar 2025 – 15:54 Uhr

20. Januar 2025 – 16:08 Uhr

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
Benutzeravatar
Sfonteneau
WAPT-Experte
Nachrichten: 2322
Registriert: 10. Juli 2014 - 23:52 Uhr
Kontakt:

20. Januar 2025 – 16:39 Uhr

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
Mikael S
Nachrichten: 26
Anmeldung: 20. Januar 2025 – 15:54 Uhr

24. Januar 2025 – 13:10 Uhr

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.
Benutzeravatar
Sfonteneau
WAPT-Experte
Nachrichten: 2322
Registriert: 10. Juli 2014 - 23:52 Uhr
Kontakt:

24. Januar 2025 – 14:06 Uhr

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
Mikael S
Nachrichten: 26
Anmeldung: 20. Januar 2025 – 15:54 Uhr

4. Februar 2025 - 10:22 Uhr

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.
Benutzeravatar
dcardon
WAPT-Experte
Nachrichten: 1953
Anmeldung: 18. Juni 2014 - 09:58 Uhr
Ort: Saint Sébastien sur Loire
Kontakt:

4. Februar 2025 - 11:59 Uhr

Hallo Mikaël,

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

Denis
Denis Cardon – Tranquil IT
Teilen Sie Ihre Erfahrungen auf WAPT! Senden Sie uns Ihre Blog- und Artikel-URLs im „Ihre Meinung des Forums, und wir werden sie auf der WAPT-
Gesperrt