Files
AH-Oil-Trader/tools/autologon_einrichten.ps1
T
Axel HocksandClaude Opus 5 da863371d3 .ps1 braucht ein BOM: Autologon-Skript brach unter powershell.exe 5.1
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>
2026-08-07 06:38:42 +02:00

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"