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:
+25
-17
@@ -149,25 +149,33 @@ Unregister-ScheduledTask -TaskName $AufgabenName -Confirm:$false -ErrorAction Si
|
|||||||
$pwsh = (Get-Command pwsh.exe -ErrorAction SilentlyContinue).Source
|
$pwsh = (Get-Command pwsh.exe -ErrorAction SilentlyContinue).Source
|
||||||
if (-not $pwsh) { $pwsh = (Get-Command powershell.exe).Source }
|
if (-not $pwsh) { $pwsh = (Get-Command powershell.exe).Source }
|
||||||
|
|
||||||
$aktion = New-ScheduledTaskAction -Execute $pwsh `
|
# EIN VBS-STARTER ALS ZWISCHENSCHICHT, und der Umweg hat zwei Gruende.
|
||||||
-Argument "-NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File `"$skript`""
|
#
|
||||||
$ausloeser = New-ScheduledTaskTrigger -AtLogOn -User "$env:USERDOMAIN\$env:USERNAME"
|
# 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
|
$aktion = New-ScheduledTaskAction -Execute "$env:SystemRoot\System32\wscript.exe" -Argument "`"$starter`""
|
||||||
# "ein Fenster, das man versehentlich zumacht".
|
$ausloeser = New-ScheduledTaskTrigger -AtLogOn -User "$env:USERDOMAIN\$env:USERNAME"
|
||||||
#
|
# Interactive und NICHT S4U: S4U braucht Administratorrechte zum Eintragen.
|
||||||
# Bei -LogonType Interactive laeuft die Aufgabe IN der Anmeldesitzung. Ein
|
# Das Fenster verhindert der VBS-Starter, nicht der Anmeldetyp.
|
||||||
# Konsolenprogramm bekommt dort ein Fenster, und "-WindowStyle Hidden" hilft
|
$prinzipal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" -LogonType Interactive -RunLevel Limited
|
||||||
# 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
|
|
||||||
$optionen = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries `
|
$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 `
|
Register-ScheduledTask -TaskName $AufgabenName -Action $aktion -Trigger $ausloeser `
|
||||||
-Principal $prinzipal -Settings $optionen `
|
-Principal $prinzipal -Settings $optionen `
|
||||||
|
|||||||
Reference in New Issue
Block a user