install.ps1: Zugangsdaten direkt nach der Pfadeingabe abfragen

Bisher wurde nach dem manuell eingegebenen config-Pfad erst ein
Erreichbarkeits-Test versucht (der ohne bestehende SMB-Sitzung fast immer
scheitert) und erst danach nach Benutzername/Kennwort gefragt. Jetzt folgt
die Abfrage direkt auf die Pfadeingabe. Die Anmeldelogik selbst ist dafür
in die Funktion SambaAnmelden ausgelagert, die weiterhin auch als
Rückfallebene für automatisch gefundene oder per -Ziel übergebene Pfade
dient.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-24 10:43:15 +02:00
parent 3c28c771fd
commit 5ff33c92d9
+35 -22
View File
@@ -82,6 +82,29 @@ function Gut($text) { Write-Host " [ok] $text" -ForegroundColor Green }
function Info($text) { Write-Host " [info] $text" -ForegroundColor DarkGray }
function Warnung($text) { Write-Host " [!] $text" -ForegroundColor Yellow }
# Test-Path fragt nie nach einer Anmeldung: ohne eine bereits bestehende
# SMB-Sitzung zu diesem Server liefert es bei einem passwortgeschützten Share
# einfach "false" - ganz ohne Fehlermeldung oder Passwortabfrage. Diese
# Funktion baut die Sitzung selbst auf, statt das als manuellen Vorschritt
# vorauszusetzen.
function SambaAnmelden($pfad) {
$nutzer = Read-Host " Benutzername [homeassistant]"
if (-not $nutzer) { $nutzer = "homeassistant" }
$kennwortSicher = Read-Host " Kennwort" -AsSecureString
$kennwort = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto(
[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($kennwortSicher))
# Eine tote Verbindung von einem vorherigen Versuch würde den Neuaufbau
# blockieren - leise entfernen, falls vorhanden. "Nichts zu löschen" ist
# dabei der Normalfall, meldet sich aber als Fehler - mit
# $ErrorActionPreference "Stop" würde das sonst das ganze Skript
# abbrechen, deshalb hier abgefangen statt nur umgeleitet.
try { & net use $pfad /delete /y *> $null } catch { }
& net use $pfad /user:$nutzer $kennwort
$kennwort = $null
}
$restliste = New-Object System.Collections.ArrayList
Write-Host ""
@@ -155,35 +178,25 @@ if (-not $Ziel) {
Write-Host ""
$Ziel = Read-Host " config-Pfad"
if (-not $Ziel) { throw "Kein Ziel angegeben - Abbruch." }
# Direkt nach der Pfadeingabe fragen, nicht erst nach einem
# (ohne bestehende Sitzung fast immer erfolglosen) Erreichbarkeits-
# Test - siehe SambaAnmelden oben.
if ($Ziel -match '^\\\\') {
Write-Host ""
SambaAnmelden $Ziel
}
}
}
if (-not (Test-Path $Ziel)) {
# Test-Path fragt nie nach einer Anmeldung: ohne eine bereits bestehende
# SMB-Sitzung zu diesem Server liefert es bei einem passwortgeschützten
# Share einfach "false" - ganz ohne Fehlermeldung oder Passwortabfrage.
# Wer den Pfad vorher nicht schon per Explorer oder "net use" verbunden
# hatte, bekam deshalb einen irreführenden "nicht erreichbar"-Fehler, auch
# wenn Pfad und Zugangsdaten korrekt waren. Deshalb hier selbst nachfragen
# und die Sitzung aufbauen, statt das als manuellen Vorschritt vorauszusetzen.
# Automatisch gefundene oder per -Ziel übergebene Pfade durchlaufen
# SambaAnmelden oben nicht - hier derselbe Weg als Rückfallebene, falls
# auch für sie eine Anmeldung fehlt.
if ($Ziel -match '^\\\\') {
Warnung "Kein Zugriff auf $Ziel - vermutlich fehlt die Anmeldung am Samba-Share."
Write-Host ""
$nutzer = Read-Host " Benutzername [homeassistant]"
if (-not $nutzer) { $nutzer = "homeassistant" }
$kennwortSicher = Read-Host " Kennwort" -AsSecureString
$kennwort = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto(
[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($kennwortSicher))
# Eine tote Verbindung von einem vorherigen Versuch würde den
# Neuaufbau blockieren - leise entfernen, falls vorhanden. "Nichts zu
# löschen" ist dabei der Normalfall, meldet sich aber als Fehler -
# mit $ErrorActionPreference "Stop" würde das sonst das ganze Skript
# abbrechen, deshalb hier abgefangen statt nur umgeleitet.
try { & net use $Ziel /delete /y *> $null } catch { }
& net use $Ziel /user:$nutzer $kennwort
$kennwort = $null
SambaAnmelden $Ziel
if ($LASTEXITCODE -ne 0 -or -not (Test-Path $Ziel)) {
throw "Ziel nicht erreichbar: $Ziel - Anmeldung fehlgeschlagen oder Pfad falsch."
}