#requires -RunAsAdministrator <# ============================================================================== BrowserDesk KnowledgeBase — Client reparieren (Wipe & Neu-Provisionieren) ============================================================================== KB-ID : KB-0001 Zweck : Einen BrowserDesk-Client, der auf einer alten Version haengt oder sich seltsam verhaelt ("Altlast"), komplett bereinigen und mit der aktuellen Version frisch installieren + an browserdesk.de anmelden. Symptome: haengt auf Altversion, Autoupdate wirkungslos, Host kommt nach Login/Reboot nicht sauber online, doppelte/streuende Installation. Ziel : Windows-Client. ADMINISTRATOR-Rechte noetig. Aufruf (auf dem Zielrechner, PowerShell als Admin): .\repair-browserdesk-client.ps1 # aktuelle Version, frische ID .\repair-browserdesk-client.ps1 -Version 20260714.2 .\repair-browserdesk-client.ps1 -KeepIdentity # gleiche Geraete-ID behalten Was passiert: 1) Tasks BrowserDeskUnattended + BrowserDeskWatchdog stoppen + loeschen 2) Prozesse killen (BrowserDesk / browserdesk_client / bd-watchdog / bd-uia) 3) Programm-, Daten- und warp-Cache-Verzeichnisse loeschen (pro Benutzer UND im SYSTEM-Profil — der warp-Cache ist die haeufigste Altlast) 4) Aktuelle EXE ueber den Relay-Proxy laden (sauberes https, kein 503) 5) --install-service: nach Program Files kopieren, Task anlegen, --service starten -> Client registriert sich an wss://browserdesk.de:443 Hinweis Geraete-ID: Ohne -KeepIdentity wird %ProgramData%\BrowserDesk geloescht -> der Rechner bekommt eine NEUE ID + neues Zugriffs-Passwort (taucht als NEUES Geraet in der Admin auf; das alte kann geloescht / per CleanUp entfernt werden). Mit -KeepIdentity bleiben Identitaet/Passwort erhalten (gleiche ID). ============================================================================== #> param( # "latest" = die aktuelle Version aus dem Feed. KEINE feste Nummer als Vorgabe: dieses Skript ist der # Weg, den man geht, wenn nichts mehr laeuft — es darf nicht selbst eine Altversion installieren und # sich dann auf genau das Autoupdate verlassen, das gerade defekt ist. [string]$Version = "latest", [string]$Url = "", [switch]$KeepIdentity ) if (-not $Url) { $Url = "https://browserdesk.de/dl/client/$Version" } $ErrorActionPreference = "SilentlyContinue" function Say($m){ Write-Host "==> $m" -ForegroundColor Cyan } # ---------- 1) STOPPEN + WIPE --------------------------------------------------------- Say "Scheduled Tasks stoppen + entfernen" foreach ($t in @("BrowserDeskUnattended","BrowserDeskWatchdog")) { schtasks /End /TN $t 2>$null | Out-Null schtasks /Delete /TN $t /F 2>$null | Out-Null } Get-ScheduledTask -ErrorAction SilentlyContinue | Where-Object { $_.TaskName -like "*BrowserDesk*" } | ForEach-Object { schtasks /End /TN $_.TaskName 2>$null; schtasks /Delete /TN $_.TaskName /F 2>$null } | Out-Null Say "Prozesse beenden" foreach ($p in @("BrowserDesk","browserdesk_client","bd-watchdog","bd-uia")) { Get-Process -Name $p -ErrorAction SilentlyContinue | Stop-Process -Force } Start-Sleep -Seconds 2 Say "Verzeichnisse loeschen (Programm, Daten, warp-Cache)" $dirs = @("$env:ProgramFiles\BrowserDesk") if (-not $KeepIdentity) { $dirs += "$env:ProgramData\BrowserDesk" } else { Say " -KeepIdentity: %ProgramData%\BrowserDesk bleibt erhalten (gleiche ID)" } $localRoots = @() Get-ChildItem "C:\Users" -Directory -ErrorAction SilentlyContinue | ForEach-Object { $localRoots += "$($_.FullName)\AppData\Local" } $localRoots += "C:\Windows\System32\config\systemprofile\AppData\Local" $localRoots += "C:\Windows\SysWOW64\config\systemprofile\AppData\Local" foreach ($lr in $localRoots) { $dirs += "$lr\BrowserDesk" Get-ChildItem "$lr\warp\packages" -ErrorAction SilentlyContinue | Where-Object { $_.Name -like "*BrowserDesk*" } | ForEach-Object { $dirs += $_.FullName } } $dirs | Select-Object -Unique | ForEach-Object { if (Test-Path $_) { Remove-Item -LiteralPath $_ -Recurse -Force; Write-Host " geloescht: $_" } } Say "Wipe fertig." # ---------- 2) NEU INSTALLIEREN ------------------------------------------------------- $tmp = "$env:TEMP\BrowserDesk-$Version.exe" Say "Download $Version von $Url" [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 Invoke-WebRequest -Uri $Url -OutFile $tmp -UseBasicParsing $mb = [math]::Round((Get-Item $tmp).Length/1MB,1) if ($mb -lt 5) { throw "Download zu klein ($mb MB) - Abbruch." } Say "Geladen: $tmp ($mb MB)" Say "Signatur pruefen" $sig = Get-AuthenticodeSignature $tmp Write-Host " Status=$($sig.Status) Signer=$($sig.SignerCertificate.Subject)" if ($sig.Status -ne 'Valid') { Write-Warning "Signatur NICHT gueltig - trotzdem fortfahren? (Abbruch mit Strg+C)"; Start-Sleep 5 } Say "Dienst installieren (--install-service) + starten" $p = Start-Process -FilePath $tmp -ArgumentList "--install-service" -Wait -PassThru Write-Host " ExitCode=$($p.ExitCode)" Start-Sleep -Seconds 5 Say "Verifikation" schtasks /Query /TN BrowserDeskUnattended /FO LIST 2>$null | Select-String "Taskname|TaskName|Status" Get-Process -Name "browserdesk_client","BrowserDesk" -ErrorAction SilentlyContinue | Select-Object Name, Id | Format-Table -Auto Say "Fertig. In der Admin (browserdesk.de/admin) sollte in ~30-60s ein Geraet online erscheinen."