@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "Automatisch=0"

if /I "%~1"=="--silent" (
    set "Automatisch=1"
)

title CSR-SOFTWARE - RustDesk Einrichtung

REM ============================================================
REM CSR-SOFTWARE RustDesk Installation / Update / Konfiguration
REM ============================================================

REM ============================================================
REM Administratorrechte
REM ============================================================

net session >nul 2>&1

if not "!errorlevel!"=="0" (
    echo Administratorrechte werden benoetigt...

    if "!Automatisch!"=="1" (
        powershell -NoProfile -ExecutionPolicy Bypass -Command ^
            "Start-Process -FilePath '%~f0' -ArgumentList '--silent' -Verb RunAs"
    ) else (
        powershell -NoProfile -ExecutionPolicy Bypass -Command ^
            "Start-Process -FilePath '%~f0' -Verb RunAs"
    )

    exit
)


REM ============================================================
REM CSR-Konfiguration
REM ============================================================

set "CSRServer=rustdesk.csr-software.de"
set "CSRKey=RND6YwDtE41mep5qkJH3009NNFWuZxNfRFO3e9lscfQ="

set "ArbeitsOrdner=%TEMP%\CSR_RustDesk"
set "RustDeskMSI=%ArbeitsOrdner%\RustDesk.msi"
set "InstallationsLog=%ArbeitsOrdner%\RustDesk_Installation.log"

if not exist "%ArbeitsOrdner%" mkdir "%ArbeitsOrdner%"


echo.
echo ============================================================
echo CSR-SOFTWARE - RustDesk Einrichtung
echo ============================================================
echo.


REM ============================================================
REM Aktuelle RustDesk-Version ermitteln
REM ============================================================

echo Ermittle aktuelle RustDesk-Version...

set "AktuelleVersion="

for /f "usebackq delims=" %%V in (`powershell -NoProfile -ExecutionPolicy Bypass -Command "$r=Invoke-RestMethod -Uri 'https://api.github.com/repos/rustdesk/rustdesk/releases/latest'; $r.tag_name.TrimStart('v')"`) do (
    set "AktuelleVersion=%%V"
)

if not defined AktuelleVersion (
    echo.
    echo FEHLER:
    echo Die aktuelle RustDesk-Version konnte nicht ermittelt werden.
    goto Fehler
)

echo Aktuelle Version: !AktuelleVersion!


REM ============================================================
REM RustDesk EXE suchen
REM ============================================================

echo.
echo Pruefe vorhandene RustDesk-Installation...

set "RustDeskPfad="
set "InstallierteVersion="
set "InstallationsTyp=NICHT_INSTALLIERT"


if exist "C:\Program Files\RustDesk\rustdesk.exe" (
    set "RustDeskPfad=C:\Program Files\RustDesk\rustdesk.exe"
)

if exist "C:\Program Files (x86)\RustDesk\rustdesk.exe" (
    set "RustDeskPfad=C:\Program Files (x86)\RustDesk\rustdesk.exe"
)


REM ============================================================
REM Version der vorhandenen EXE ermitteln
REM ============================================================

if defined RustDeskPfad (

    for /f "usebackq delims=" %%V in (`powershell -NoProfile -ExecutionPolicy Bypass -Command "(Get-Item '!RustDeskPfad!').VersionInfo.ProductVersion"`) do (
        set "InstallierteVersion=%%V"
    )

)


REM ============================================================
REM Pruefen, ob RustDesk per MSI installiert wurde
REM ============================================================

set "MSIInstalliert=0"

for /f "usebackq delims=" %%M in (`powershell -NoProfile -ExecutionPolicy Bypass -Command "$e=Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*','HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -like 'RustDesk*' -and (($_.WindowsInstaller -eq 1) -or ($_.UninstallString -match 'MsiExec')) } | Select-Object -First 1; if($e){'1'}else{'0'}"`) do (
    set "MSIInstalliert=%%M"
)


REM ============================================================
REM Installationstyp festlegen
REM ============================================================

if defined RustDeskPfad (

    if "!MSIInstalliert!"=="1" (
        set "InstallationsTyp=MSI"
    ) else (
        set "InstallationsTyp=EXE"
    )

) else (

    set "InstallationsTyp=NICHT_INSTALLIERT"

)


if defined InstallierteVersion (
    echo Installierte Version: !InstallierteVersion!
    echo Installationstyp:     !InstallationsTyp!
) else (
    echo RustDesk ist noch nicht installiert.
)


REM ============================================================
REM Aktion festlegen
REM ============================================================

set "Aktion=KEINE"


if /I "!InstallationsTyp!"=="NICHT_INSTALLIERT" (
    set "Aktion=NEUINSTALLATION"
)


if /I "!InstallationsTyp!"=="EXE" (
    set "Aktion=MIGRATION"
)


if /I "!InstallationsTyp!"=="MSI" (

    powershell -NoProfile -ExecutionPolicy Bypass -Command "$Installiert='!InstallierteVersion!'.Split('+')[0]; $Aktuell='!AktuelleVersion!'.Split('+')[0]; if([version]$Installiert -lt [version]$Aktuell){exit 10}else{exit 0}"

    if "!errorlevel!"=="10" (
        set "Aktion=UPDATE"
    )
)


echo.

if /I "!Aktion!"=="KEINE" (
    echo RustDesk MSI ist bereits aktuell.
)

if /I "!Aktion!"=="NEUINSTALLATION" (
    echo RustDesk wird neu per MSI installiert.
)

if /I "!Aktion!"=="MIGRATION" (
    echo Vorhandene EXE-Installation wird auf MSI umgestellt.
)

if /I "!Aktion!"=="UPDATE" (
    echo RustDesk MSI wird aktualisiert.
)


REM ============================================================
REM MSI herunterladen
REM ============================================================

if /I not "!Aktion!"=="KEINE" (

    echo.
    echo Lade RustDesk !AktuelleVersion! MSI herunter...

    if exist "%RustDeskMSI%" del /q "%RustDeskMSI%" >nul 2>&1

    powershell -NoProfile -ExecutionPolicy Bypass -Command "$ErrorActionPreference='Stop'; $r=Invoke-RestMethod -Uri 'https://api.github.com/repos/rustdesk/rustdesk/releases/latest'; $a=$r.assets | Where-Object { $_.name -match 'x86_64\.msi$' } | Select-Object -First 1; if(-not $a){throw 'Keine x86_64 MSI gefunden'}; Invoke-WebRequest -Uri $a.browser_download_url -OutFile '%RustDeskMSI%'"

    if not exist "%RustDeskMSI%" (
        echo.
        echo FEHLER:
        echo Die aktuelle RustDesk-MSI konnte nicht heruntergeladen werden.
        goto Fehler
    )

    echo Download erfolgreich.

)


REM ============================================================
REM EXE -> MSI Migration
REM ============================================================

if /I "!Aktion!"=="MIGRATION" (

    echo.
    echo Beende RustDesk...

    taskkill /IM rustdesk.exe /F >nul 2>&1
    timeout /t 2 /nobreak >nul


    echo Deinstalliere bisherige EXE-Installation...

    "!RustDeskPfad!" --uninstall

    timeout /t 5 /nobreak >nul


    REM Dienst entfernen, falls noch vorhanden

    sc query RustDesk >nul 2>&1

    if "!errorlevel!"=="0" (

        sc stop RustDesk >nul 2>&1
        timeout /t 2 /nobreak >nul

        sc delete RustDesk >nul 2>&1
        timeout /t 2 /nobreak >nul

    )

)


REM ============================================================
REM MSI installieren / aktualisieren
REM ============================================================

if /I not "!Aktion!"=="KEINE" (

    echo.
    echo Installiere RustDesk MSI...

    msiexec.exe /i "%RustDeskMSI%" /qn /norestart INSTALLFOLDER="C:\Program Files\RustDesk" CREATESTARTMENUSHORTCUTS="Y" CREATEDESKTOPSHORTCUTS="Y" INSTALLPRINTER="Y" /l*v "%InstallationsLog%"

    set "MSIResult=!errorlevel!"

    echo MSI Rueckgabecode: !MSIResult!


    REM 0    = Erfolg
    REM 1641 = Erfolg / Neustart
    REM 3010 = Erfolg / Neustart erforderlich

    if not "!MSIResult!"=="0" (
        if not "!MSIResult!"=="1641" (
            if not "!MSIResult!"=="3010" (

                echo.
                echo FEHLER:
                echo MSI-Installation fehlgeschlagen.
                echo Fehlercode: !MSIResult!
                echo.
                echo Installationsprotokoll:
                echo %InstallationsLog%

                goto Fehler

            )
        )
    )

    timeout /t 5 /nobreak >nul

)


REM ============================================================
REM RustDesk nach Installation erneut suchen
REM ============================================================

set "RustDeskPfad="

if exist "C:\Program Files\RustDesk\rustdesk.exe" (
    set "RustDeskPfad=C:\Program Files\RustDesk\rustdesk.exe"
)

if exist "C:\Program Files (x86)\RustDesk\rustdesk.exe" (
    set "RustDeskPfad=C:\Program Files (x86)\RustDesk\rustdesk.exe"
)


if not defined RustDeskPfad (

    echo.
    echo FEHLER:
    echo RustDesk wurde nach der Installation nicht gefunden.
    goto Fehler

)


REM ============================================================
REM Dienst sicherstellen
REM ============================================================

echo.
echo Pruefe RustDesk-Dienst...

sc query RustDesk >nul 2>&1

if not "!errorlevel!"=="0" (

    echo Installiere RustDesk-Dienst...

    "!RustDeskPfad!" --install-service

    timeout /t 5 /nobreak >nul

)

sc start RustDesk >nul 2>&1


REM ============================================================
REM CSR Serverkonfiguration
REM ============================================================

echo.
echo Setze CSR-SOFTWARE Serverkonfiguration...

"!RustDeskPfad!" --config "host=%CSRServer%,key=%CSRKey%,"

timeout /t 2 /nobreak >nul


REM ============================================================
REM CSR Optionen
REM ============================================================

echo Setze CSR-SOFTWARE Berechtigungen...

"!RustDeskPfad!" --option enable-file-transfer Y
"!RustDeskPfad!" --option enable-remote-restart Y
"!RustDeskPfad!" --option enable-record-session Y
"!RustDeskPfad!" --option enable-block-input Y
"!RustDeskPfad!" --option enable-privacy-mode Y
"!RustDeskPfad!" --option allow-remote-config-modification Y
"!RustDeskPfad!" --option allow-auto-update Y


REM ============================================================
REM RustDesk neu starten
REM ============================================================

echo.
echo Starte RustDesk neu...

taskkill /IM rustdesk.exe /F >nul 2>&1

timeout /t 2 /nobreak >nul

sc start RustDesk >nul 2>&1

start "" "!RustDeskPfad!"

timeout /t 4 /nobreak >nul


REM ============================================================
REM Endgueltige Version
REM ============================================================

set "InstallierteVersionNachher="

for /f "usebackq delims=" %%V in (`powershell -NoProfile -ExecutionPolicy Bypass -Command "(Get-Item '!RustDeskPfad!').VersionInfo.ProductVersion"`) do (
    set "InstallierteVersionNachher=%%V"
)


REM ============================================================
REM RustDesk-ID
REM ============================================================

set "RustDeskID="

for /f "usebackq delims=" %%I in (`"!RustDeskPfad!" --get-id`) do (
    set "RustDeskID=%%I"
)

REM ============================================================
REM RustDesk-ID fuer PfiffiX speichern
REM ============================================================

if defined RustDeskID (
    reg add "HKCU\Software\CSR-SOFTWARE\PfiffiX" ^
        /v RustDeskID ^
        /t REG_SZ ^
        /d "!RustDeskID!" ^
        /f >nul 2>&1
)

REM ============================================================
REM Temporaere MSI entfernen
REM ============================================================

if exist "%RustDeskMSI%" (
    del /q "%RustDeskMSI%" >nul 2>&1
)


REM ============================================================
REM Erfolg
REM ============================================================

echo.
echo ============================================================
echo CSR-SOFTWARE RustDesk erfolgreich eingerichtet
echo ============================================================
echo.
echo Server:
echo %CSRServer%
echo.
echo RustDesk-Version:
echo !InstallierteVersionNachher!
echo.
echo Installation:
echo MSI
echo.

if defined RustDeskID (
    echo RustDesk-ID:
    echo !RustDeskID!
    echo.
)

echo Remote-Konfigurationsaenderung: EIN
echo Automatische Updates:          EIN
echo.
echo Fertig.
echo.

if "!Automatisch!"=="0" (
    pause
)

exit /b 0


REM ============================================================
REM Fehler
REM ============================================================

:Fehler

echo.
echo ============================================================
echo FEHLER BEI DER RUSTDESK-EINRICHTUNG
echo ============================================================
echo.
echo Bitte die Meldungen oben pruefen.
echo.

if exist "%InstallationsLog%" (
    echo MSI-Protokoll:
    echo %InstallationsLog%
    echo.
)

if "!Automatisch!"=="0" (
    pause
)

exit /b 1