diff --git a/CLAUDE.md b/CLAUDE.md index 3f9d57c..a2d8462 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -296,6 +296,17 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche: **`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. + ⚠⚠ **Der GUI-Weg führte zweimal zu nichts.** Diagnostiziert: der Dialog + **öffnet sich** (Fenstertitel „Autologon - Sysinternals", Prozess verifiziert) + — er muss aber mit **ENABLE** bestätigt werden; nur schließen tut nichts. + Deshalb gibt es jetzt **`-Direkt`**: Autologon 3.10 nimmt Benutzer/Domäne/ + Passwort als Argumente, das Skript fragt es per `Read-Host -AsSecureString` ab + (unsichtbar, nicht in der History) und ruft es ohne Dialog auf. + **➜ `powershell -ExecutionPolicy Bypass -File toolsutologon_einrichten.ps1 -Direkt`** + ⚠ Abwägung: bei `-Direkt` steht das Passwort für den Moment des Aufrufs in der + Kommandozeile des Kindprozesses (für Admins kurz sichtbar). Es landet **nicht** + in einer Datei, nicht in der Shell-History — und anschließend als + verschlüsseltes LSA-Secret, nicht im Klartext in der Registry. ⚠ **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** diff --git a/tools/autologon_einrichten.ps1 b/tools/autologon_einrichten.ps1 index afa11f8..281e20f 100644 --- a/tools/autologon_einrichten.ps1 +++ b/tools/autologon_einrichten.ps1 @@ -33,6 +33,21 @@ # ist `AutoAdminLogon = 1` die Bedingung, und erst danach wird ueberhaupt # ueber die Speicherart geurteilt. +# AUFRUF-VARIANTEN: +# ... -File tools\autologon_einrichten.ps1 GUI-Dialog (Standard) +# ... -File tools\autologon_einrichten.ps1 -Direkt ohne Dialog, Passwort +# wird hier abgefragt +# ⚠ `-Direkt` ist der zuverlaessige Weg. Der Dialog OEFFNET sich zwar +# (Fenstertitel "Autologon - Sysinternals", verifiziert), muss aber mit ENABLE +# bestaetigt werden — wird er nur geschlossen, passiert nichts. +# ⚠ Abwaegung bei `-Direkt`: Autologon 3.10 nimmt Benutzer/Domaene/Passwort als +# Argumente. Das Passwort steht damit fuer den Moment des Aufrufs in der +# Kommandozeile des Kindprozesses (fuer Administratoren kurz sichtbar). Es wird +# NICHT in eine Datei geschrieben, nicht in die PowerShell-History (Read-Host) +# und landet anschliessend als verschluesseltes LSA-Secret — nicht im Klartext +# in der Registry. +param([switch]$Direkt) + $ErrorActionPreference = 'Stop' $hier = Split-Path -Parent $MyInvocation.MyCommand.Path $k = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon' @@ -57,12 +72,32 @@ Write-Host " SCHRITT 1 - Auto-Logon aktivieren (verschluesseltes LSA-Secret)" Write-Host "==================================================================" 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 +if ($Direkt) { + # ⚠ Read-Host -AsSecureString: die Eingabe erscheint nicht auf dem Schirm + # und landet nicht in der PowerShell-History. + $sec = Read-Host " Passwort fuer $env:USERNAME (Eingabe bleibt unsichtbar)" -AsSecureString + $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($sec) + try { + $pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr) + if (-not $pw) { + Write-Host " ABBRUCH: kein Passwort eingegeben." -ForegroundColor Red + exit 1 + } + Write-Host " Aktiviere Auto-Logon ..." + $null = & $exe $env:USERNAME $env:COMPUTERNAME $pw /accepteula 2>&1 + } finally { + # Klartext so kurz wie moeglich im Speicher halten + [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr) + Remove-Variable pw -ErrorAction SilentlyContinue + } +} else { + Write-Host " Es oeffnet sich gleich der Autologon-Dialog." -ForegroundColor Cyan + Write-Host " --> Passwort eintragen und auf ENABLE klicken." -ForegroundColor Cyan + Write-Host " (Nur schliessen reicht NICHT - dann passiert nichts." + Write-Host " Zuverlaessiger: Skript mit -Direkt aufrufen.)" + Write-Host "" + Start-Process -FilePath $exe -ArgumentList '/accepteula' -Wait +} # ── Ergebnis ehrlich pruefen ──────────────────────────────────────────── $an = (Get-ItemProperty -Path $k -Name AutoAdminLogon -EA SilentlyContinue).AutoAdminLogon @@ -77,8 +112,14 @@ 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." + if ($Direkt) { + Write-Host " Autologon hat die Angaben nicht uebernommen —" + Write-Host " meist ein falsches Passwort. Nochmal versuchen." + } else { + Write-Host " Der Dialog wurde ohne 'Enable' geschlossen." + Write-Host " Zuverlaessiger Weg ohne Dialog:" -ForegroundColor Cyan + Write-Host " powershell -ExecutionPolicy Bypass -File tools\autologon_einrichten.ps1 -Direkt" -ForegroundColor Cyan + } Write-Host "" Write-Host " Schritt 2 wird uebersprungen - eine Sperr-Aufgabe ohne" Write-Host " Auto-Logon waere nur laestig."