fix: kein Fenster OHNE Administratorrechte -- VBS-Starter statt S4U

Der S4U-Weg aus dem letzten Commit war richtig gedacht und praktisch unbrauchbar:
das Eintragen einer S4U-Aufgabe braucht erhoehte Rechte, und in einem
gewoehnlichen PowerShell-Fenster scheitert es mit "Zugriff verweigert". Ein
Werkzeug, das Administratorrechte verlangt, benutzt am Ende niemand -- und
genau darum ging es ja: was umstaendlich ist, wird umgangen.

Jetzt startet die Aufgabe wscript.exe mit einem winzigen VBS, und dessen
Run-Aufruf hat den Fenstermodus 0. Das heisst wirklich unsichtbar, im
Unterschied zu "-WindowStyle Hidden", das bei Konsolenprogrammen in einer
interaktiven Sitzung nur halb wirkt. Besondere Rechte braucht es nicht, weil
nichts Besonderes passiert.

Der Anmeldetyp bleibt damit Interactive; das Fenster verhindert der Starter und
nicht der Anmeldetyp.

Das Protokoll aus dem letzten Commit bleibt und wird jetzt erst recht gebraucht:
sichtbar ist nichts mehr, also muss nachlesbar sein, was ssh sagt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-13 01:33:03 +02:00
co-authored by Claude Opus 5
parent a494f472d1
commit a36fcec57e
+25 -17
View File
@@ -149,25 +149,33 @@ Unregister-ScheduledTask -TaskName $AufgabenName -Confirm:$false -ErrorAction Si
$pwsh = (Get-Command pwsh.exe -ErrorAction SilentlyContinue).Source
if (-not $pwsh) { $pwsh = (Get-Command powershell.exe).Source }
$aktion = New-ScheduledTaskAction -Execute $pwsh `
-Argument "-NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File `"$skript`""
$ausloeser = New-ScheduledTaskTrigger -AtLogOn -User "$env:USERDOMAIN\$env:USERNAME"
# EIN VBS-STARTER ALS ZWISCHENSCHICHT, und der Umweg hat zwei Gruende.
#
# 1. "-WindowStyle Hidden" versteckt ein Konsolenprogramm nur halb. Die Aufgabe
# lief interaktiv in der Anmeldesitzung, bekam dort ein Fenster -- und wer
# es zumacht, kappt den Tunnel, ohne zu wissen was er tut.
# 2. Der naheliegende Ausweg, die Aufgabe per S4U ausserhalb der Sitzung laufen
# zu lassen, braucht erhoehte Rechte. In einem gewoehnlichen Fenster
# scheitert das Eintragen mit "Zugriff verweigert" -- und ein Werkzeug, das
# Administratorrechte verlangt, benutzt am Ende niemand.
#
# wscript.exe startet mit Fenstermodus 0, und das heisst wirklich unsichtbar.
# Es braucht keine besonderen Rechte, weil nichts Besonderes passiert.
$starter = Join-Path $ordner 'tunnel.vbs'
@"
' Erzeugt von tunnel-einrichten.ps1. Startet den Tunnel OHNE Fenster.
' Die 0 im Run-Aufruf ist der ganze Trick: Fenstermodus "unsichtbar".
Set sh = CreateObject("WScript.Shell")
sh.Run """$pwsh"" -NoProfile -NonInteractive -ExecutionPolicy Bypass -File ""$skript""", 0, False
"@ | Set-Content -Path $starter -Encoding ASCII
# S4U statt Interactive -- DAS ist der Unterschied zwischen "kein Fenster" und
# "ein Fenster, das man versehentlich zumacht".
#
# Bei -LogonType Interactive laeuft die Aufgabe IN der Anmeldesitzung. Ein
# Konsolenprogramm bekommt dort ein Fenster, und "-WindowStyle Hidden" hilft
# nur halb: es blieb sichtbar, und wer es schliesst, kappt den Tunnel, ohne zu
# wissen was er tut. Genau so ist es passiert.
#
# S4U ("Service for User") laeuft ausserhalb der Sitzung -- es gibt gar keinen
# Bildschirm, auf dem etwas erscheinen koennte. Auf lokale Dateien darf es
# weiterhin zugreifen, und mehr braucht der Schluessel unter %USERPROFILE%
# nicht. Ein Passwort muss dafuer nirgends gespeichert werden.
$prinzipal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" -LogonType S4U -RunLevel Limited
$aktion = New-ScheduledTaskAction -Execute "$env:SystemRoot\System32\wscript.exe" -Argument "`"$starter`""
$ausloeser = New-ScheduledTaskTrigger -AtLogOn -User "$env:USERDOMAIN\$env:USERNAME"
# Interactive und NICHT S4U: S4U braucht Administratorrechte zum Eintragen.
# Das Fenster verhindert der VBS-Starter, nicht der Anmeldetyp.
$prinzipal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" -LogonType Interactive -RunLevel Limited
$optionen = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries `
-ExecutionTimeLimit ([TimeSpan]::Zero) -RestartCount 999 -RestartInterval (New-TimeSpan -Minutes 1)
-ExecutionTimeLimit ([TimeSpan]::Zero)
Register-ScheduledTask -TaskName $AufgabenName -Action $aktion -Trigger $ausloeser `
-Principal $prinzipal -Settings $optionen `