diff --git a/CLAUDE.md b/CLAUDE.md index a814eb4..3f9d57c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -284,6 +284,22 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche: Passwort steht **nicht** im Skript und wird nirgends gespeichert; es wird im Autologon-Dialog eingegeben. **Zurück:** `Autologon /accepteula` → Disable, und `schtasks /Delete /TN OilAutoLogonLock /F`. + ⚠⚠ **ZWEI FEHLER IM ERSTEN VERSUCH (07.08., beide behoben) — beide von der + Sorte, die Erfolg meldet, wo keiner war:** + **(1)** `$ErrorActionPreference = 'Stop'` PLUS `schtasks /Delete` auf eine noch + nicht existierende Aufgabe → native Programme schreiben nach stderr, PowerShell + macht daraus unter `Stop` einen **Abbruch**. Das Skript endete, BEVOR `/Create` + lief; die Sperr-Aufgabe existierte nie. Jetzt wird vorher per `/Query` geprüft. + **(2)** Die Erfolgsmeldung **log**: ein fehlendes `DefaultPassword` wurde als + „LSA-Secret ✅" ausgegeben — dabei war schlicht **gar nichts** gesetzt (der + Autologon-Dialog war ohne *Enable* geschlossen worden). Jetzt ist + **`AutoAdminLogon = 1` die Bedingung**, und erst danach wird über die + Speicherart geurteilt; ohne aktives Auto-Logon bricht das Skript mit Code 1 ab + und überspringt Schritt 2. + ⚠ **Und ein Design-Fehler: die Sperre hätte bei JEDER Anmeldung gefeuert.** Ein + `ONLOGON`-Trigger unterscheidet nicht. Deshalb prüft `tools/autologon_lock.ps1` + jetzt die **Systemlaufzeit** — gesperrt wird nur, wenn der Rechner **< 3 min** + läuft (= Auto-Logon nach Boot). Nach manueller Anmeldung passiert nichts. - **⚠⚠ .ps1 MIT NICHT-ASCII BRAUCHT EIN BOM — sonst bricht `powershell.exe` 5.1 (2026-08-07, real passiert).** Das Autologon-Skript ließ sich nicht ausführen: „Schließende ) fehlt", „Zeichenfolge hat kein Abschlusszeichen". Es war **kein** diff --git a/tools/autologon_einrichten.ps1 b/tools/autologon_einrichten.ps1 index daccd9f..afa11f8 100644 --- a/tools/autologon_einrichten.ps1 +++ b/tools/autologon_einrichten.ps1 @@ -7,35 +7,44 @@ # 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). +# ⚠⚠ WARUM SYSINTERNALS UND NICHT DIE REGISTRY. Der verbreitete Weg schreibt +# das Passwort als `DefaultPassword` im KLARTEXT nach HKLM\...\Winlogon — dort +# kann es jeder lokale Administrator und jedes Backup-Image lesen. Sysinternals +# `Autologon` legt es als verschluesseltes LSA-Secret ab. # -# ⚠ 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. +# ⚠ RESTRISIKO, das bleibt: nach dem Reboot steht eine ANGEMELDETE Sitzung mit +# offenem MT5 und Live-Broker-Verbindung da. Schritt 2 sperrt deshalb den +# Bildschirm — aber nur nach einem Auto-Logon, nicht nach jeder Anmeldung +# (s. `autologon_lock.ps1`). # -# AUFRUF: dieses Fenster muss ALS ADMINISTRATOR laufen. -# powershell -ExecutionPolicy Bypass -File tools\autologon_einrichten.ps1 +# AUFRUF (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. +# ⚠ Das Passwort steht NICHT in dieser Datei und wird nirgends gespeichert — +# es wird im GUI-Dialog von Autologon eingegeben. +# +# ⚠⚠ ZWEI FEHLER AUS DEM ERSTEN VERSUCH (2026-08-07), hier behoben: +# 1. `$ErrorActionPreference = 'Stop'` PLUS `schtasks /Delete` auf eine noch +# nicht existierende Aufgabe = das Skript brach ab, BEVOR /Create lief. +# Native Programme schreiben nach stderr, und PowerShell macht daraus unter +# 'Stop' einen Abbruch. Jetzt wird vorher geprueft, ob es sie ueberhaupt gibt. +# 2. Die Erfolgsmeldung log: fehlendes `DefaultPassword` wurde als +# "LSA-Secret ✅" gemeldet — dabei war schlicht GAR NICHTS gesetzt. Jetzt +# ist `AutoAdminLogon = 1` die Bedingung, und erst danach wird ueberhaupt +# ueber die Speicherart geurteilt. $ErrorActionPreference = 'Stop' +$hier = Split-Path -Parent $MyInvocation.MyCommand.Path +$k = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon' +$t = 'OilAutoLogonLock' + $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)) { @@ -44,38 +53,75 @@ if (-not (Test-Path $exe)) { } Write-Host "==================================================================" -Write-Host " SCHRITT 1 — Auto-Logon aktivieren (verschluesseltes LSA-Secret)" +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." +Write-Host " Benutzer: $env:USERNAME Domaene: $env:COMPUTERNAME (lokal)" +Write-Host "" +Write-Host " Es oeffnet sich gleich der Autologon-Dialog." -ForegroundColor Cyan +Write-Host " --> Passwort eintragen und auf ENABLE klicken." -ForegroundColor Cyan +Write-Host " (Wird der Dialog nur geschlossen, passiert NICHTS - das Skript" +Write-Host " sagt es dann auch.)" +Write-Host "" Start-Process -FilePath $exe -ArgumentList '/accepteula' -Wait -# ── Ergebnis pruefen ──────────────────────────────────────────────────── -$k = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon' +# ── Ergebnis ehrlich pruefen ──────────────────────────────────────────── $an = (Get-ItemProperty -Path $k -Name AutoAdminLogon -EA SilentlyContinue).AutoAdminLogon +$user = (Get-ItemProperty -Path $k -Name DefaultUserName -EA SilentlyContinue).DefaultUserName $klartext = (Get-ItemProperty -Path $k -Name DefaultPassword -EA SilentlyContinue).DefaultPassword +$aktiv = ($an -eq '1') + 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)" +Write-Host " AutoAdminLogon : $(if ($an) { $an } else { '(nicht gesetzt)' })" +Write-Host " DefaultUserName : $(if ($user) { $user } else { '(nicht gesetzt)' })" + +if (-not $aktiv) { + Write-Host "" + Write-Host " ==> AUTO-LOGON IST NICHT AKTIV." -ForegroundColor Yellow + Write-Host " Der Dialog wurde offenbar ohne 'Enable' geschlossen." + Write-Host " Skript einfach erneut aufrufen und auf Enable klicken." + Write-Host "" + Write-Host " Schritt 2 wird uebersprungen - eine Sperr-Aufgabe ohne" + Write-Host " Auto-Logon waere nur laestig." + exit 1 } -# ── Schritt 2: Sitzung sofort sperren ─────────────────────────────────── +if ($klartext) { + Write-Host " DefaultPassword : ⚠ KLARTEXT in der Registry!" -ForegroundColor Yellow +} else { + Write-Host " DefaultPassword : nicht im Klartext (LSA-Secret) ✅" -ForegroundColor Green +} + +# ── Schritt 2: Bildschirmsperre nach dem Auto-Logon ───────────────────── Write-Host "" Write-Host "==================================================================" -Write-Host " SCHRITT 2 — Bildschirm nach dem Auto-Logon sofort sperren" +Write-Host " SCHRITT 2 - Bildschirm nach dem Auto-Logon 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." + +# ⚠ Erst pruefen, dann loeschen. `schtasks /Delete` auf eine fehlende Aufgabe +# schreibt nach stderr und wuerde unter $ErrorActionPreference='Stop' abbrechen. +$vorhanden = $false +try { + $null = & schtasks /Query /TN $t 2>&1 + $vorhanden = ($LASTEXITCODE -eq 0) +} catch { $vorhanden = $false } +if ($vorhanden) { + $null = & schtasks /Delete /TN $t /F 2>&1 + Write-Host " alte Aufgabe entfernt" +} + +$lock = Join-Path $hier 'autologon_lock.ps1' +$cmd = "powershell -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$lock`"" +$null = & schtasks /Create /TN $t /SC ONLOGON /RU "$env:USERNAME" /DELAY 0000:30 /TR $cmd /F 2>&1 +if ($LASTEXITCODE -eq 0) { + Write-Host " Aufgabe '$t' angelegt." -ForegroundColor Green + Write-Host " Sperrt 30 s nach der Anmeldung - aber NUR, wenn der Rechner" + Write-Host " gerade gebootet hat. Nach manueller Anmeldung passiert nichts." + Write-Host " Die Sitzung laeuft weiter: MT5 und beide Server arbeiten." +} else { + Write-Host " ⚠ Aufgabe konnte nicht angelegt werden (Code $LASTEXITCODE)." -ForegroundColor Yellow +} + Write-Host "" -Write-Host " Rueckgaengig: $exe /accepteula (Disable) und" -Write-Host " schtasks /Delete /TN $t /F" +Write-Host " Rueckgaengig:" +Write-Host " $exe /accepteula (dann Disable)" +Write-Host " schtasks /Delete /TN $t /F" diff --git a/tools/autologon_lock.ps1 b/tools/autologon_lock.ps1 new file mode 100644 index 0000000..764cbef --- /dev/null +++ b/tools/autologon_lock.ps1 @@ -0,0 +1,19 @@ +# Sperrt den Bildschirm — aber NUR nach einem Auto-Logon, nicht nach einer +# manuellen Anmeldung. +# +# ⚠ WARUM DIE UNTERSCHEIDUNG: ein Task mit ONLOGON-Trigger feuert bei JEDER +# Anmeldung. Ohne diese Pruefung wuerde der Bildschirm auch 30 s nach jedem +# normalen Login zufallen — eine taegliche Schikane fuer ein Problem, das nur +# nach einem unbeaufsichtigten Reboot besteht. +# +# Unterscheidungsmerkmal: ein Auto-Logon passiert unmittelbar nach dem Boot. +# Liegt der Systemstart laenger zurueck, hat sich ein Mensch angemeldet — +# dann wird nicht gesperrt. + +$grenzeMin = 3 +$boot = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime +$seitBootMin = ((Get-Date) - $boot).TotalMinutes + +if ($seitBootMin -lt $grenzeMin) { + rundll32.exe user32.dll,LockWorkStation +}