#SysAdmin #NetAdmin

Nextcloud – Script autoupdate client

N

Le client Nextcloud pour Windows possède un système de mise à jour automatique, mais le problème c’est que l’utilisateur doit avoir les droits d’installations ce qui n’est pas toujours le cas. Pour contourner le problème, on va utiliser un script PowerShell qui se chargera de l’installation en tant que compte « Système ».

Descriptif

Script

# VARIABLES
$Site = "https://download.nextcloud.com/desktop/releases/Windows/"
$Uri = "https://download.nextcloud.com/desktop/releases/Windows/latest"
$FilePath = "C:\Nextcloud-Update\Nextcloud.msi"
$LogPath = "C:\Nextcloud-Update\Nextcloud-Update-Log.txt"
$MSIArguments = @(
    "/i"
    "$FilePath"
    "SKIPAUTOUPDATE=1"
    "REBOOT=ReallySuppress"
    "/qn"
)
$StopNextCloud = {Stop-Process -Name "nextcloud" -Force}
$StartNextCloud = {Start-Process -FilePath "nextcloud.exe" -WorkingDirectory "$env:ProgramFiles\Nextcloud"}
$Notification = {
    Add-Type -AssemblyName System.Windows.Forms
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    Remove-Event BalloonClosed_event -ea SilentlyContinue
    Unregister-Event -SourceIdentifier BalloonClosed_event -ea silentlycontinue
    $global:balloon = New-Object System.Windows.Forms.NotifyIcon
    $SysTrayIconPath = "C:\Program Files\Nextcloud\nextcloud.exe"
    $balloon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($SysTrayIconPath)
    $balloon.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Info
    $balloon.BalloonTipTitle = "NextCloud" 
    $balloon.BalloonTipText = "Mise à jour en cours de l'application."
    $balloon.Visible = $true
    $balloon.ShowBalloonTip(5000)
    }

# SCRIPT
Clear-Host
Remove-Item $LogPath -Verbose -ErrorAction Ignore
Start-Transcript -Path $LogPath
if ( -not (Get-InstalledModule "RunAsUser" -ErrorAction SilentlyContinue)) {
    Install-PackageProvider -Name NuGet -Force -Scope CurrentUser
    Install-Module -Name RunAsUser -Force -Scope CurrentUser
}
if (Test-Connection -ComputerName $Site.Split("/")[2] -Count 4 -quiet) {
	Write-Host "Serveur distant: ACCESSIBLE"
    $HttpContent = Invoke-WebRequest -Uri $Site -UseBasicParsing
    $FileLastVersion = $HttpContent.Links | Where-Object {$_.href -like "*.msi"} | Select-Object -Last 1 -ExpandProperty href
    $OnlineVersion = $FileLastVersion.Split("-")[1]
    Write-Host "Online version: $OnlineVersion"
    $InstalledVersionBuild = Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall","HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | Get-ItemProperty | Where-Object {$_.DisplayName -match 'Nextcloud' } | Select-Object -ExpandProperty DisplayVersion
    $InstalledVersion = $InstalledVersionBuild.Substring(0, $InstalledVersionBuild.LastIndexOf("."))
    Write-Host "Local version: $InstalledVersion"
    if ($OnlineVersion -ne $InstalledVersion) {
        Write-Host "Nouvelle version détectée. Téléchargement en cours..."
        try {
            Invoke-WebRequest -Uri $Uri -OutFile $FilePath -UseBasicParsing
            Write-Host "Fichier téléchargé. Lancement de la maj de Nextcloud."
            Invoke-AsCurrentUser -Scriptblock $Notification
            Invoke-AsCurrentUser -Scriptblock $StopNextCloud
            Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow
            Write-Host "Installation terminée."
            Invoke-AsCurrentUser -Scriptblock $StartNextCloud
            Remove-Item $FilePath -Verbose -ErrorAction Ignore
        } catch {
            $StatusCode = $_.Exception.Response.StatusCode.value__
            Write-Host "Erreur: $StatusCode"
        }
    } else {
        Write-Host "Version identique. Pas de traitement."
    }
} else {
    Write-Host "Serveur distant INACCESSIBLE. Pas de traitement."
}
Stop-Transcript

Exécution

Il ne reste plus qu’à créer une tâche planifiée sur le poste pour procéder à l’exécution du script de manière automatique et quotidienne :

$TaskName = "Nextcloud-Update"
$User= "NT AUTHORITY\SYSTEM"
$Trigger= New-ScheduledTaskTrigger -Daily -At 12:30 
$Action= New-ScheduledTaskAction -Execute "powershell" -Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\AdminTools\Nextcloud-Update\Nextcloud-Update.ps1"'
$Settings= New-ScheduledTaskSettingsSet -Compatibility Win8 -WakeToRun -RestartInterval "00:10:00" -restartCount 3 -ExecutionTimeLimit "01:00:00" -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable
Register-ScheduledTask -TaskName $TaskName -Trigger $Trigger -User $User -Action $Action -Settings $Settings -RunLevel Highest -Force
par Nathan
#SysAdmin #NetAdmin