Das Skript liess sich nicht ausfuehren — "Schliessende ) fehlt", "Zeichenfolge hat kein Abschlusszeichen". Es war KEIN Syntaxfehler: Windows PowerShell 5.1 liest .ps1 als CP1252, wenn kein BOM da ist. Aus dem Gedankenstrich werden drei Zeichen, das darin enthaltene Anfuehrungszeichen schliesst den String vorzeitig, und der Fehler kaskadiert bis zum Dateiende. Der eigentliche Punkt ist, warum es beim Schreiben nicht auffiel: das hiesige PowerShell-Werkzeug ist pwsh 7, und das liest UTF-8 ohne BOM klaglos. Die Datei war in meiner Umgebung fehlerfrei und beim Nutzer kaputt — dieselbe Divergenz-Klasse wie der Deployment-Drift, nur eine Ebene tiefer: die Pruefumgebung war nicht die Laufumgebung. Behoben (UTF-8 MIT BOM) und mit dem ECHTEN 5.1-Parser gegengeprueft (Parser::ParseFile, 0 Fehler) — nicht mit pwsh 7, das den Fehler ja gerade nicht zeigt. Dabei ein zweiter Fall gefunden und mitbehoben: scripts/send_daily_report.ps1 (Umlaute, kein BOM). Der ist zwar dormant (Microsoft.Graph-Modul fehlt), haette aber genauso gebrochen. Dauerhaft abgesichert: tools/check_nfalle.py prueft es als Stufe C2 — .ps1 mit Nicht-ASCII und ohne BOM ist ab jetzt ein Befund. .bat ist nicht betroffen: cmd.exe verzeiht das in echo/Kommentaren (restart_server.bat enthaelt Sonderzeichen, bricht aber nicht). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
82 lines
4.5 KiB
PowerShell
82 lines
4.5 KiB
PowerShell
# Auto-Logon einrichten — schliesst die letzte Luecke der Boot-Pipeline.
|
|
#
|
|
# WOZU: `OilTradingServer` und `HyperliquidDashboard` haengen an einem LOGON-
|
|
# Trigger. Nach einem Windows-Update-Reboot laeuft nichts, bis sich jemand
|
|
# anmeldet — real in der Nacht zum 2026-07-20 passiert (Reboot 01:30, Server bis
|
|
# 07:42 tot, nur der broker-seitige SL schuetzte, -95,48 EUR). Ein Task ohne
|
|
# angemeldete Sitzung hilft NICHT: der Bot braucht das laufende MT5-TERMINAL,
|
|
# und das ist eine GUI-Anwendung — es braucht eine echte Desktop-Sitzung.
|
|
#
|
|
# ⚠⚠ WARUM DIESES SKRIPT UND NICHT DIE REGISTRY. Der verbreitete Weg schreibt
|
|
# das Passwort als `DefaultPassword` im KLARTEXT nach
|
|
# HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon — dort kann es
|
|
# jeder lokale Administrator und jedes Backup-Image lesen. Sysinternals
|
|
# `Autologon` legt es stattdessen als **verschluesseltes LSA-Secret** ab. Gleiche
|
|
# Wirkung, deutlich besseres Versteck. Die EXE ist von Microsoft signiert
|
|
# (geprueft: Status Valid, CN=Microsoft Corporation).
|
|
#
|
|
# ⚠ DAS RESTRISIKO BLEIBT und ist NICHT das Passwort: nach dem Reboot steht eine
|
|
# ANGEMELDETE Sitzung mit offenem MT5 und Live-Broker-Verbindung da. Wer physisch
|
|
# an den Rechner kommt, sitzt davor. Deshalb sperrt Schritt 2 den Bildschirm
|
|
# sofort wieder — die Sitzung laeuft (MT5 arbeitet), der Desktop ist zu.
|
|
#
|
|
# AUFRUF: dieses Fenster muss ALS ADMINISTRATOR laufen.
|
|
# powershell -ExecutionPolicy Bypass -File tools\autologon_einrichten.ps1
|
|
#
|
|
# ⚠ Das Passwort steht bewusst NICHT in dieser Datei und wird nirgends
|
|
# gespeichert — es wird im GUI-Dialog von Autologon eingegeben.
|
|
|
|
$ErrorActionPreference = 'Stop'
|
|
$id = [Security.Principal.WindowsIdentity]::GetCurrent()
|
|
if (-not (New-Object Security.Principal.WindowsPrincipal($id)).IsInRole(
|
|
[Security.Principal.WindowsBuiltInRole]::Administrator)) {
|
|
Write-Host " ABBRUCH: Dieses Fenster hat keine Administratorrechte." -ForegroundColor Red
|
|
Write-Host " PowerShell als Administrator oeffnen und erneut aufrufen."
|
|
exit 1
|
|
}
|
|
|
|
$hier = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
$exe = Join-Path $hier 'autologon\Autologon64.exe'
|
|
if (-not (Test-Path $exe)) { $exe = Join-Path $hier 'autologon\Autologon.exe' }
|
|
if (-not (Test-Path $exe)) {
|
|
Write-Host " ABBRUCH: Autologon.exe fehlt unter tools\autologon\." -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
Write-Host "=================================================================="
|
|
Write-Host " SCHRITT 1 — Auto-Logon aktivieren (verschluesseltes LSA-Secret)"
|
|
Write-Host "=================================================================="
|
|
Write-Host " Benutzer : $env:USERNAME"
|
|
Write-Host " Domaene : $env:COMPUTERNAME (lokales Konto)"
|
|
Write-Host " Es oeffnet sich der Autologon-Dialog. Passwort dort eintragen"
|
|
Write-Host " und auf Enable klicken."
|
|
Start-Process -FilePath $exe -ArgumentList '/accepteula' -Wait
|
|
|
|
# ── Ergebnis pruefen ────────────────────────────────────────────────────
|
|
$k = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon'
|
|
$an = (Get-ItemProperty -Path $k -Name AutoAdminLogon -EA SilentlyContinue).AutoAdminLogon
|
|
$klartext = (Get-ItemProperty -Path $k -Name DefaultPassword -EA SilentlyContinue).DefaultPassword
|
|
Write-Host ""
|
|
Write-Host " AutoAdminLogon : $an"
|
|
if ($klartext) {
|
|
Write-Host " ⚠ DefaultPassword steht im KLARTEXT in der Registry!" -ForegroundColor Yellow
|
|
Write-Host " (Autologon sollte das vermeiden — bitte pruefen.)"
|
|
} else {
|
|
Write-Host " DefaultPassword : nicht im Klartext ✅ (LSA-Secret)"
|
|
}
|
|
|
|
# ── Schritt 2: Sitzung sofort sperren ───────────────────────────────────
|
|
Write-Host ""
|
|
Write-Host "=================================================================="
|
|
Write-Host " SCHRITT 2 — Bildschirm nach dem Auto-Logon sofort sperren"
|
|
Write-Host "=================================================================="
|
|
$t = 'OilAutoLogonLock'
|
|
schtasks /Delete /TN $t /F 2>$null | Out-Null
|
|
schtasks /Create /TN $t /SC ONLOGON /RU "$env:USERNAME" /DELAY 0000:30 `
|
|
/TR "rundll32.exe user32.dll,LockWorkStation" /F | Out-Null
|
|
Write-Host " Aufgabe '$t' angelegt (30 s nach Anmeldung -> Sperrbildschirm)."
|
|
Write-Host " Die Sitzung LAEUFT weiter, MT5 und beide Server arbeiten."
|
|
Write-Host ""
|
|
Write-Host " Rueckgaengig: $exe /accepteula (Disable) und"
|
|
Write-Host " schtasks /Delete /TN $t /F"
|