Skip to content

v2.34.0 — Windows-Dienst-Installer und robuste DataProtection-Keys

Choose a tag to compare

@nikolausm nikolausm released this 19 Oct 08:39
· 11 commits to main since this release

Neu

  • Windows-Dienst-Installer in Minicon.SimpleAdmin.WebUI: SimpleAdminWebUIHost.RunAsync(args) erkennt die Subkommandos install / uninstall / start / stop am ersten Argument und delegiert an ServiceInstaller.Dispatch. Legt in einem Rutsch den Windows-Dienst (sc.exe create binPath=<EigeneEXE>, Autostart), die URL-ACL (netsh http add urlacl), eine Firewall-Regel (netsh advfirewall) und den DataProtection-Keys-Ordner C:\ProgramData\SimpleAdmin\dp-keys an und erteilt dem Dienstkonto per icacls dort Modify-Rechte (OI)(CI)M. Default-Konto LocalSystem; optional --account=DOMAIN\u mit Passwort-Prompt. Flags: --port=5080, --service-name, --display-name, --description, --keys-dir=…, --non-interactive, --purge (nur uninstall, löscht den Keys-Ordner mit).
  • Betrieb ohne IIS: Im Windows-Dienst-Modus hostet die Anwendung über HttpSys statt Kestrel, damit Negotiate weiterhin ohne IIS funktioniert. Interaktive Starts (Konsole) und IIS-Deployments bleiben auf Kestrel bzw. In-Process — kein Eingriff ins bestehende IIS-Setup nötig.
  • install.cmd als Ein-Klick-Starter neben der Host-EXE.

Geändert

  • Neuer Einzeiler-Einstieg für die Host-Anwendung: return await SimpleAdminWebUIHost.RunAsync(args); (parallel zu SimpleAdminWorkerHost.RunAsync). Die bisherige drei-Zeilen-Variante (CreateBuilder → AddSimpleAdminWebUI → UseSimpleAdminWebUI → Run) funktioniert unverändert.
  • Alle Package-Versionen im Lockstep auf 2.34.0 gezogen.

Behoben

  • DataProtection-Keys hingen am Benutzerprofil des AppPools / Dienstkontos. Nach AppPool-Recycle oder bei blockierter User-Profile-Load crashte die WebUI beim Start mit CryptographicException 0xe0434352 beim Entschlüsseln verwaister User-DPAPI-Keys. AddSimpleAdminWebUI persistiert die Keys jetzt in einem festen Dateisystem-Pfad (Default C:\ProgramData\SimpleAdmin\dp-keys) und verschlüsselt sie mit DPAPI im LocalMachine-Scope (ProtectKeysWithDpapi(protectToLocalMachine: true)). Overrides: DataProtection:KeysDirectory (anderer Pfad) bzw. DataProtection:Enabled = false (zurück zum Framework-Default). Lässt sich das Verzeichnis nicht anlegen, fällt der Host auf das Default-Verhalten zurück und loggt einen Hinweis.

Intern

  • Externe Prozessaufrufe des Installers (sc.exe, netsh, icacls) laufen über IProcessRunner; Unit-Tests mocken diese Schicht und decken Argumentparsing, Install-Reihenfolge und Uninstall-Pfad ab.
  • Testlauf lokal: 544 bestanden, 2 übersprungen (PowerShell-Integrationstests auf macOS).

🤖 Generated with Claude Code