diff --git a/homeassistant/installationspaket/install.ps1 b/homeassistant/installationspaket/install.ps1 index ccb1294..b98d072 100644 --- a/homeassistant/installationspaket/install.ps1 +++ b/homeassistant/installationspaket/install.ps1 @@ -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." }