Script PowerShell ufficiale per gli IT Manager

Il seguente script ha scopo di esempio: si può utilizzare tal quale e pianificarne l'esecuzione (es. ogni 2/3 settimane) sulle macchine aziendali, oppure può essere usato come riferimento per mettere a punto la propria procedura di automazione.

NOTA IMPORTANTE: Se usi Intune/SCCM come package manager nativo, considera di distribuire l'MSI direttamente tramite la soluzione endpoint management (questo script potrebbe non servire).

Se invece usi questo script in ambiente enterprise con molte workstation:

  • SCONSIGLIATO: scaricare da S3 su ogni macchina;
  • CONSIGLIATO: centralizzare su un server locale.

Opzioni consigliate:

  1. Share UNC: $UrlMsi = "\\server-repository\ipdoor-releases\$NOME_FILE_MSI"
  2. Server HTTP interno: sincronizza da S3 una sola volta.
# ==============================================================================
# SCRIPT UFFICIALE IPDOOR: MIGRAZIONE EXE -> MSI E AGGIORNAMENTO AUTOMATICO VIA S3
# ==============================================================================

# CONFIGURAZIONE
$BASE_URL_S3    = "https://ipdoor-concierge-releases.s3.eu-west-1.amazonaws.com/production"
$URL_LATEST_YML = "$BASE_URL_S3/latest.yml"
$NOME_APP       = "ipdoor-concierge"
$NOME_FILE_MSI  = "$NOME_APP-Setup.msi"

$CartellaInstallazione = "${env:ProgramFiles}\$NOME_APP"
$PercorsoExe           = "$CartellaInstallazione\$NOME_APP.exe"
$OldExeUninstaller     = "$CartellaInstallazione\Uninstall $NOME_APP.exe"

# --- FASE 1: GESTIONE MIGRAZIONE (SOLO AL PRIMO AVVIO) ---
if (Test-Path $OldExeUninstaller) {
    Write-Host "Rilevato installer EXE precedente. Avvio migrazione a MSI..."
    Stop-Process -Name $NOME_APP -Force -ErrorAction SilentlyContinue
    Start-Process -FilePath $OldExeUninstaller -ArgumentList "/S" -Wait
    Write-Host "Vecchia versione EXE rimossa con successo."
}

# --- FASE 2: CONTROLLO VERSIONI VIA S3 ---
if (Test-Path $PercorsoExe) {
    $VersioneInstallata = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($PercorsoExe).FileVersion
} else {
    $VersioneInstallata = "0.0.0"
}

try {
    $ContenutoYml = Invoke-RestMethod -Uri $URL_LATEST_YML -UseBasicParsing

    # Estrae solo il numero di versione dal file YAML (es. 1.0.0)
    if ($ContenutoYml -match 'version:\s*([0-9\.]+)') {
        $VersioneOnline = $Matches[1]
    } else {
        Write-Error "Impossibile leggere il numero di versione dal file latest.yml."
        exit 1
    }
} catch {
    Write-Error "Errore durante il recupero dei dati da S3: $_"
    exit 1
}

Write-Host "Versione Locale: $VersioneInstallata"
Write-Host "Versione su S3: $VersioneOnline"

# --- FASE 3: INSTALLAZIONE O AGGIORNAMENTO MSI ---
if ([System.Version]$VersioneOnline -gt [System.Version]$VersioneInstallata) {
    Write-Host "Nuova versione disponibile ($VersioneOnline). Avvio download..."

    $UrlMsi = "$BASE_URL_S3/$NOME_FILE_MSI"
    $NomeFileTemporaneo = "$NOME_APP-$VersioneOnline.msi"
    $PathTemporaneo = Join-Path $env:TEMP $NomeFileTemporaneo

    # elimina un eventuale file già presente con lo stesso nome
    if (Test-Path $PathTemporaneo) { Remove-Item -Path $PathTemporaneo -Force }
    try {
        Start-BitsTransfer -Source $UrlMsi -Destination $PathTemporaneo -DisplayName "Scarico ipdoor-concierge" -Priority High -ErrorAction Stop
        Write-Host "Download completato"
    } catch {
        Write-Error "Errore BITS Transfer: $_"
        exit 1
    }
    Stop-Process -Name $NOME_APP -Force -ErrorAction SilentlyContinue

    Write-Host "Esecuzione msiexec per $NomeFileTemporaneo..."
    $ArgomentiMSI = "/i `"$PathTemporaneo`" /qn /norestart"
    $Processo = Start-Process -FilePath "msiexec.exe" -ArgumentList $ArgomentiMSI -Wait -NoNewWindow -PassThru

    if ($Processo.ExitCode -eq 0) {
        Write-Host "Applicazione installata/aggiornata alla versione $VersioneOnline!"
    } else {
        Write-Error "Errore MSI. Codice d'uscita: $($Processo.ExitCode)"
    }

    Remove-Item -Path $PathTemporaneo -Force
} else {
    Write-Host "L'applicazione è già aggiornata all'ultima versione."
}