From e343aee026122d8724d8acd17b16b20a9c9fa368 Mon Sep 17 00:00:00 2001 From: Tim Eertmoed Date: Wed, 2 Sep 2026 21:58:02 +0200 Subject: [PATCH] Dateifeld sichtbar machen, RPC-Fehler verstaendlich melden Der Knopf im Dateifeld kommt vom Browser und ignoriert jede Aussenfarbe: im dunklen Thema ein hellgraues Kaestchen mit dunkler Schrift, kaum zu lesen und passend zu nichts. Jetzt explizit wie ein Sekundaerknopf gestaltet -- einmal zentral, denn es betrifft vier Felder (Sicherung, Lizenz, Profilbild, Dateifreigaben). Dazu zwei neue Hinweise fuer den Windows-Neustart. "Could not initialise pipe winreg / NT_STATUS_OBJECT_NAME_NOT_FOUND" liest sich wie ein technisches Detail, hat aber fast immer eine Ursache: das Konto ist auf dem Zielgeraet kein Administrator. An einem echten Fall nachgemessen -- die Anmeldung gelang, aber schon "net rpc info" und der Dienstmanager antworteten mit ACCESS_DENIED. Ein Standardkonto bekommt die winreg-Pipe gar nicht zu sehen. Die Meldung sagt das jetzt und nennt den Pruefbefehl. Co-Authored-By: Claude Opus 5 --- apps/tesm/src/tesm/services/windowsops.py | 18 ++++++++++ .../static/tesm_core/css/components.css | 34 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/apps/tesm/src/tesm/services/windowsops.py b/apps/tesm/src/tesm/services/windowsops.py index 3e57468..95dbcf4 100644 --- a/apps/tesm/src/tesm/services/windowsops.py +++ b/apps/tesm/src/tesm/services/windowsops.py @@ -73,6 +73,24 @@ HINTS: tuple[tuple[str, str], ...] = ( "NT_STATUS_HOST_UNREACHABLE", "Das Geraet ist nicht erreichbar.", ), + # Diese Meldung liest sich wie ein technisches Detail, hat aber fast immer + # eine einzige Ursache: das Konto ist auf dem Zielgeraet kein Administrator. + # Nachgemessen an einem echten Fall -- die Anmeldung gelang, aber schon + # "net rpc info" und der Dienstmanager antworteten mit ACCESS_DENIED, also + # bekommt ein Standardkonto die winreg-Pipe gar nicht zu sehen. + ( + "pipe winreg", + "Das Konto hat auf diesem Geraet keine Administratorrechte. Ein Neustart ueber " + "RPC braucht sie: die Pipe, ueber die er laeuft, ist fuer Standardkonten nicht " + "sichtbar. Ein Konto der lokalen Administratoren hinterlegen -- pruefen laesst " + "sich das mit 'net rpc service status RemoteRegistry'.", + ), + ( + "NT_STATUS_OBJECT_NAME_NOT_FOUND", + "Der benoetigte RPC-Dienst antwortet auf dem Geraet nicht. Meist fehlen dem " + "Konto die Administratorrechte; sonst ist der Dienst 'Remoteregistrierung' " + "gestoppt.", + ), ) diff --git a/packages/tesm-core/src/tesm_core/static/tesm_core/css/components.css b/packages/tesm-core/src/tesm_core/static/tesm_core/css/components.css index 62e3c1d..b79c77d 100644 --- a/packages/tesm-core/src/tesm_core/static/tesm_core/css/components.css +++ b/packages/tesm-core/src/tesm_core/static/tesm_core/css/components.css @@ -161,6 +161,40 @@ border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); } + /* Der Knopf im Dateifeld kommt vom Browser und ignoriert jede Aussenfarbe: + im dunklen Thema ein hellgraues Kaestchen mit dunkler Schrift, das weder + zum Feld noch zu den uebrigen Knoepfen passt und kaum zu lesen war. + Deshalb explizit wie ein Sekundaerknopf gestaltet -- und weil vier Felder + betroffen sind (Sicherung, Lizenz, Profilbild, Freigaben), einmal hier. */ + .input[type="file"] { + padding: 5px 6px; + display: flex; + align-items: center; + gap: var(--sp-3); + cursor: pointer; + color: var(--text-muted); + } + .input[type="file"]::file-selector-button { + padding: 5px 12px; + margin-right: var(--sp-1); + border: 1px solid var(--border-strong); + border-radius: var(--r-sm); + background: var(--surface-2); + color: var(--text); + font-family: inherit; + font-size: var(--fs-sm); + font-weight: 570; + cursor: pointer; + transition: background var(--dur-fast), border-color var(--dur-fast); + } + .input[type="file"]:hover::file-selector-button { + background: var(--surface-3); + border-color: var(--text-faint); + } + .input[type="file"]:focus-visible::file-selector-button { + border-color: var(--accent); + } + .input[readonly], .input[disabled], .select[disabled], .textarea[disabled] { background: var(--surface-inset); color: var(--text-muted);