Autologon-Skript: zwei Fehler behoben, die Erfolg meldeten wo keiner war
Der erste Lauf hat NICHTS eingerichtet — weder Auto-Logon noch die
Sperr-Aufgabe. Nachgeprueft: AutoAdminLogon, DefaultUserName und
OilAutoLogonLock allesamt nicht vorhanden.
(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. Jetzt wird vorher per /Query geprueft.
(2) Die Erfolgsmeldung log: ein fehlendes DefaultPassword wurde als
"LSA-Secret ✅" ausgegeben — dabei war gar nichts gesetzt, weil der
Autologon-Dialog ohne Enable geschlossen wurde. Abwesenheit eines
Klartext-Passworts beweist nicht, dass der sichere Weg genommen wurde; sie
ist auch mit "nichts passiert" vereinbar. Jetzt ist AutoAdminLogon = 1 die
Bedingung, und erst danach wird ueber die Speicherart geurteilt. Ohne
aktives Auto-Logon bricht das Skript mit Code 1 ab und ueberspringt
Schritt 2.
Dazu ein Design-Fehler, der erst beim Nachdenken auffiel: die Sperre haette bei
JEDER Anmeldung gefeuert — ein ONLOGON-Trigger unterscheidet nicht zwischen
Auto-Logon und manuellem Login. 30 s nach jedem normalen Anmelden waere der
Bildschirm zugefallen. Neu: tools/autologon_lock.ps1 prueft die Systemlaufzeit
und sperrt nur, wenn der Rechner < 3 min laeuft (= Auto-Logon nach Boot).
Trocken getestet: bei 1088 min Laufzeit -> sperrt nicht.
Beide .ps1 mit BOM geschrieben und mit dem echten 5.1-Parser gegengeprueft
(0 Fehler). check_nfalle.py Stufe C2 deckt alle drei Skripte ab.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
da863371d3
commit
eccc13f2cf
@@ -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
|
Passwort steht **nicht** im Skript und wird nirgends gespeichert; es wird im
|
||||||
Autologon-Dialog eingegeben. **Zurück:** `Autologon /accepteula` → Disable, und
|
Autologon-Dialog eingegeben. **Zurück:** `Autologon /accepteula` → Disable, und
|
||||||
`schtasks /Delete /TN OilAutoLogonLock /F`.
|
`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
|
- **⚠⚠ .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:
|
(2026-08-07, real passiert).** Das Autologon-Skript ließ sich nicht ausführen:
|
||||||
„Schließende ) fehlt", „Zeichenfolge hat kein Abschlusszeichen". Es war **kein**
|
„Schließende ) fehlt", „Zeichenfolge hat kein Abschlusszeichen". Es war **kein**
|
||||||
|
|||||||
@@ -7,35 +7,44 @@
|
|||||||
# angemeldete Sitzung hilft NICHT: der Bot braucht das laufende MT5-TERMINAL,
|
# angemeldete Sitzung hilft NICHT: der Bot braucht das laufende MT5-TERMINAL,
|
||||||
# und das ist eine GUI-Anwendung — es braucht eine echte Desktop-Sitzung.
|
# und das ist eine GUI-Anwendung — es braucht eine echte Desktop-Sitzung.
|
||||||
#
|
#
|
||||||
# ⚠⚠ WARUM DIESES SKRIPT UND NICHT DIE REGISTRY. Der verbreitete Weg schreibt
|
# ⚠⚠ WARUM SYSINTERNALS UND NICHT DIE REGISTRY. Der verbreitete Weg schreibt
|
||||||
# das Passwort als `DefaultPassword` im KLARTEXT nach
|
# das Passwort als `DefaultPassword` im KLARTEXT nach HKLM\...\Winlogon — dort
|
||||||
# HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon — dort kann es
|
# kann es jeder lokale Administrator und jedes Backup-Image lesen. Sysinternals
|
||||||
# jeder lokale Administrator und jedes Backup-Image lesen. Sysinternals
|
# `Autologon` legt es als verschluesseltes LSA-Secret ab.
|
||||||
# `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
|
# ⚠ RESTRISIKO, das bleibt: nach dem Reboot steht eine ANGEMELDETE Sitzung mit
|
||||||
# ANGEMELDETE Sitzung mit offenem MT5 und Live-Broker-Verbindung da. Wer physisch
|
# offenem MT5 und Live-Broker-Verbindung da. Schritt 2 sperrt deshalb den
|
||||||
# an den Rechner kommt, sitzt davor. Deshalb sperrt Schritt 2 den Bildschirm
|
# Bildschirm — aber nur nach einem Auto-Logon, nicht nach jeder Anmeldung
|
||||||
# sofort wieder — die Sitzung laeuft (MT5 arbeitet), der Desktop ist zu.
|
# (s. `autologon_lock.ps1`).
|
||||||
#
|
#
|
||||||
# AUFRUF: dieses Fenster muss ALS ADMINISTRATOR laufen.
|
# AUFRUF (Fenster muss ALS ADMINISTRATOR laufen):
|
||||||
# powershell -ExecutionPolicy Bypass -File tools\autologon_einrichten.ps1
|
# powershell -ExecutionPolicy Bypass -File tools\autologon_einrichten.ps1
|
||||||
#
|
#
|
||||||
# ⚠ Das Passwort steht bewusst NICHT in dieser Datei und wird nirgends
|
# ⚠ Das Passwort steht NICHT in dieser Datei und wird nirgends gespeichert —
|
||||||
# gespeichert — es wird im GUI-Dialog von Autologon eingegeben.
|
# 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'
|
$ErrorActionPreference = 'Stop'
|
||||||
|
$hier = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||||
|
$k = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon'
|
||||||
|
$t = 'OilAutoLogonLock'
|
||||||
|
|
||||||
$id = [Security.Principal.WindowsIdentity]::GetCurrent()
|
$id = [Security.Principal.WindowsIdentity]::GetCurrent()
|
||||||
if (-not (New-Object Security.Principal.WindowsPrincipal($id)).IsInRole(
|
if (-not (New-Object Security.Principal.WindowsPrincipal($id)).IsInRole(
|
||||||
[Security.Principal.WindowsBuiltInRole]::Administrator)) {
|
[Security.Principal.WindowsBuiltInRole]::Administrator)) {
|
||||||
Write-Host " ABBRUCH: Dieses Fenster hat keine Administratorrechte." -ForegroundColor Red
|
Write-Host " ABBRUCH: Dieses Fenster hat keine Administratorrechte." -ForegroundColor Red
|
||||||
Write-Host " PowerShell als Administrator oeffnen und erneut aufrufen."
|
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
$hier = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
||||||
$exe = Join-Path $hier 'autologon\Autologon64.exe'
|
$exe = Join-Path $hier 'autologon\Autologon64.exe'
|
||||||
if (-not (Test-Path $exe)) { $exe = Join-Path $hier 'autologon\Autologon.exe' }
|
if (-not (Test-Path $exe)) { $exe = Join-Path $hier 'autologon\Autologon.exe' }
|
||||||
if (-not (Test-Path $exe)) {
|
if (-not (Test-Path $exe)) {
|
||||||
@@ -44,38 +53,75 @@ if (-not (Test-Path $exe)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "=================================================================="
|
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 "=================================================================="
|
||||||
Write-Host " Benutzer : $env:USERNAME"
|
Write-Host " Benutzer: $env:USERNAME Domaene: $env:COMPUTERNAME (lokal)"
|
||||||
Write-Host " Domaene : $env:COMPUTERNAME (lokales Konto)"
|
Write-Host ""
|
||||||
Write-Host " Es oeffnet sich der Autologon-Dialog. Passwort dort eintragen"
|
Write-Host " Es oeffnet sich gleich der Autologon-Dialog." -ForegroundColor Cyan
|
||||||
Write-Host " und auf Enable klicken."
|
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
|
Start-Process -FilePath $exe -ArgumentList '/accepteula' -Wait
|
||||||
|
|
||||||
# ── Ergebnis pruefen ────────────────────────────────────────────────────
|
# ── Ergebnis ehrlich pruefen ────────────────────────────────────────────
|
||||||
$k = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon'
|
|
||||||
$an = (Get-ItemProperty -Path $k -Name AutoAdminLogon -EA SilentlyContinue).AutoAdminLogon
|
$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
|
$klartext = (Get-ItemProperty -Path $k -Name DefaultPassword -EA SilentlyContinue).DefaultPassword
|
||||||
|
$aktiv = ($an -eq '1')
|
||||||
|
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host " AutoAdminLogon : $an"
|
Write-Host " AutoAdminLogon : $(if ($an) { $an } else { '(nicht gesetzt)' })"
|
||||||
if ($klartext) {
|
Write-Host " DefaultUserName : $(if ($user) { $user } else { '(nicht gesetzt)' })"
|
||||||
Write-Host " ⚠ DefaultPassword steht im KLARTEXT in der Registry!" -ForegroundColor Yellow
|
|
||||||
Write-Host " (Autologon sollte das vermeiden — bitte pruefen.)"
|
if (-not $aktiv) {
|
||||||
} else {
|
Write-Host ""
|
||||||
Write-Host " DefaultPassword : nicht im Klartext ✅ (LSA-Secret)"
|
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 "=================================================================="
|
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 "=================================================================="
|
Write-Host "=================================================================="
|
||||||
$t = 'OilAutoLogonLock'
|
|
||||||
schtasks /Delete /TN $t /F 2>$null | Out-Null
|
# ⚠ Erst pruefen, dann loeschen. `schtasks /Delete` auf eine fehlende Aufgabe
|
||||||
schtasks /Create /TN $t /SC ONLOGON /RU "$env:USERNAME" /DELAY 0000:30 `
|
# schreibt nach stderr und wuerde unter $ErrorActionPreference='Stop' abbrechen.
|
||||||
/TR "rundll32.exe user32.dll,LockWorkStation" /F | Out-Null
|
$vorhanden = $false
|
||||||
Write-Host " Aufgabe '$t' angelegt (30 s nach Anmeldung -> Sperrbildschirm)."
|
try {
|
||||||
Write-Host " Die Sitzung LAEUFT weiter, MT5 und beide Server arbeiten."
|
$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 ""
|
||||||
Write-Host " Rueckgaengig: $exe /accepteula (Disable) und"
|
Write-Host " Rueckgaengig:"
|
||||||
Write-Host " schtasks /Delete /TN $t /F"
|
Write-Host " $exe /accepteula (dann Disable)"
|
||||||
|
Write-Host " schtasks /Delete /TN $t /F"
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user