From eea0a0ee53e10cda04e8a885e450c193d6b1d0da Mon Sep 17 00:00:00 2001 From: romanitho <96626929+Romanitho@users.noreply.github.com> Date: Mon, 6 Feb 2023 19:16:01 +0100 Subject: [PATCH] draft --- Winget-AutoUpdate-Install.ps1 | 7 --- Winget-AutoUpdate/User-Run.ps1 | 21 ++++++-- Winget-AutoUpdate/Winget-Upgrade.ps1 | 28 +++++++++-- .../functions/Invoke-UserApproval.ps1 | 50 +++++++++++++++++++ 4 files changed, 91 insertions(+), 15 deletions(-) create mode 100644 Winget-AutoUpdate/functions/Invoke-UserApproval.ps1 diff --git a/Winget-AutoUpdate-Install.ps1 b/Winget-AutoUpdate-Install.ps1 index 3371863..f46041b 100644 --- a/Winget-AutoUpdate-Install.ps1 +++ b/Winget-AutoUpdate-Install.ps1 @@ -271,13 +271,6 @@ function Install-WingetAutoUpdate { # Set regkeys for notification name, icon and actions & reg add "HKCR\AppUserModelId\Windows.SystemToast.Winget.Notification" /v DisplayName /t REG_EXPAND_SZ /d "Application Update" /f | Out-Null & reg add "HKCR\AppUserModelId\Windows.SystemToast.Winget.Notification" /v IconUri /t REG_EXPAND_SZ /d %SystemRoot%\system32\@WindowsUpdateToastIcon.png /f | Out-Null - $WAUClass = "HKLM:\Software\Classes\WAU" - $WAUClassRun = "Wscript.exe ""$WingetUpdatePath\Invisible.vbs"" ""C:\Windows\System32\schtasks.exe /run /tn Winget-AutoUpdate""" - New-Item "$WAUClass\shell\open\command" -Force -ErrorAction SilentlyContinue | Out-Null - New-ItemProperty -LiteralPath $WAUClass -Name 'URL Protocol' -Value '' -PropertyType String -Force -ErrorAction SilentlyContinue | Out-Null - New-ItemProperty -LiteralPath $WAUClass -Name '(default)' -Value "URL:$($ActionType)" -PropertyType String -Force -ErrorAction SilentlyContinue | Out-Null - New-ItemProperty -LiteralPath $WAUClass -Name 'EditFlags' -Value '2162688' -PropertyType DWord -Force -ErrorAction SilentlyContinue | Out-Null - New-ItemProperty -LiteralPath "$WAUClass\shell\open\command" -Name '(default)' -Value $WAUClassRun -PropertyType String -Force -ErrorAction SilentlyContinue | Out-Null # Settings for the scheduled task for Updates $taskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$($WingetUpdatePath)\winget-upgrade.ps1`"" diff --git a/Winget-AutoUpdate/User-Run.ps1 b/Winget-AutoUpdate/User-Run.ps1 index f60560f..2cf94b9 100644 --- a/Winget-AutoUpdate/User-Run.ps1 +++ b/Winget-AutoUpdate/User-Run.ps1 @@ -1,6 +1,6 @@ <# .SYNOPSIS -Handle user interaction from shortcuts and show a Toast +Handle user interaction from shortcuts and Toast .DESCRIPTION Act on shortcut run (DEFAULT: Check for updated Apps) @@ -20,7 +20,9 @@ https://github.com/Romanitho/Winget-AutoUpdate [CmdletBinding()] param( [Parameter(Mandatory = $False)] [Switch] $Logs = $false, - [Parameter(Mandatory = $False)] [Switch] $Help = $false + [Parameter(Mandatory = $False)] [Switch] $Help = $false, + [Parameter(Mandatory = $False)] [Switch] $NotifApprovedAsSystem = $false, + [Parameter(Mandatory = $False)] [Switch] $NotifApprovedAsUser = $false ) function Test-WAUisRunning { @@ -44,9 +46,6 @@ Get-NotifLocale #Set common variables $OnClickAction = "$WorkingDir\logs\updates.log" $Button1Text = $NotifLocale.local.outputs.output[11].message -$Title = "Winget-AutoUpdate (WAU)" -$Balise = "Winget-AutoUpdate (WAU)" -$UserRun = $True if ($Logs) { if (Test-Path "$WorkingDir\logs\updates.log") { @@ -62,6 +61,18 @@ if ($Logs) { elseif ($Help) { Start-Process "https://github.com/Romanitho/Winget-AutoUpdate" } +elseif ($NotifApprovedAsUser){ + #Create tag if user approve notif for requested updates + $WAUNotifApprovedPath = "$WingetUpdatePath\config\NotifApproved.txt" + New-Item $WAUNotifApprovedPath -Force + Get-ScheduledTask -TaskName "Winget-AutoUpdate-UserContext" -ErrorAction SilentlyContinue | Start-ScheduledTask -ErrorAction SilentlyContinue +} +elseif ($NotifApprovedAsSystem){ + #Create tag if user approve notif for requested updates + $WAUNotifApprovedPath = "$WingetUpdatePath\config\NotifApproved.txt" + New-Item $WAUNotifApprovedPath -Force + Get-ScheduledTask -TaskName "Winget-AutoUpdate" -ErrorAction SilentlyContinue | Start-ScheduledTask -ErrorAction SilentlyContinue +} else { try { #Check if WAU is currently running diff --git a/Winget-AutoUpdate/Winget-Upgrade.ps1 b/Winget-AutoUpdate/Winget-Upgrade.ps1 index 55a2e24..a08d2f8 100644 --- a/Winget-AutoUpdate/Winget-Upgrade.ps1 +++ b/Winget-AutoUpdate/Winget-Upgrade.ps1 @@ -41,7 +41,7 @@ if ($IsSystem) { else { [int32] $MaxLogFiles = $MaxLogFiles } - + # Maximum size of log file. $MaxLogSize = $WAUConfig.WAU_MaxLogSize if (!$MaxLogSize) { @@ -136,7 +136,7 @@ if (Test-Network) { } } } - + #Get External ModsPath if run as System if ($WAUConfig.WAU_ModsPath) { Write-Log "WAU uses External Mods from: $($WAUConfig.WAU_ModsPath.TrimEnd(" ", "\", "/"))" @@ -219,6 +219,28 @@ if (Test-Network) { $Log | out-file -filepath $LogFile -Append } + #Ask for user if configured + if ($WAUConfig.WAU_UserApproval -eq 1){ + Write-Log "User Approval feature enabled." + #Check for approved tag + $WAUNotifApproved = "$WorkingDir/Config/NotifApproved.txt" + + if (!(Test-Path $WAUNotifApproved)) { + $UserApprovalReturn = Invoke-UserApproval $outdated + if ($UserApprovalReturn -eq 0){ + Write-Log "-> User approval requested. Waiting for user to approve available updates..." + #Closing job, waiting for user approval + Exit 0 + } + else{ + Write-log "-> No update to request to user." + } + } + else { + Write-Log "-> User approved notification." + } + } + #Count good update installations $Script:InstallOK = 0 @@ -297,7 +319,7 @@ if (Test-Network) { elseif (!$UserScheduledTask){ Write-Log "User context execution not installed..." } - } + } } } else { diff --git a/Winget-AutoUpdate/functions/Invoke-UserApproval.ps1 b/Winget-AutoUpdate/functions/Invoke-UserApproval.ps1 new file mode 100644 index 0000000..ee9f986 --- /dev/null +++ b/Winget-AutoUpdate/functions/Invoke-UserApproval.ps1 @@ -0,0 +1,50 @@ +#Function to ask user consent before updating apps + +function Invoke-UserApproval ($outdated){ + + #Create / Update WAU Class for notification action + $WAUClass = "HKLM:\Software\Classes\WAU" + $WAUClassCmd = "$WAUClass\shell\open\command" + if ($IsSystem){ + $WAUClassRun = "Wscript.exe ""$WingetUpdatePath\Invisible.vbs"" ""powershell.exe -NoProfile -ExecutionPolicy Bypass -File '$WingetUpdatePath\User-Run.ps1' -NotifApprovedAsSystem" + } + else{ + $WAUClassRun = "Wscript.exe ""$WingetUpdatePath\Invisible.vbs"" ""powershell.exe -NoProfile -ExecutionPolicy Bypass -File '$WingetUpdatePath\User-Run.ps1' -NotifApprovedAsUser" + } + New-Item $WAUClassCmd -Force -ErrorAction SilentlyContinue | Out-Null + New-ItemProperty -LiteralPath $WAUClass -Name 'URL Protocol' -Value '' -PropertyType String -Force -ErrorAction SilentlyContinue | Out-Null + New-ItemProperty -LiteralPath $WAUClass -Name '(default)' -Value "URL:$($ActionType)" -PropertyType String -Force -ErrorAction SilentlyContinue | Out-Null + New-ItemProperty -LiteralPath $WAUClass -Name 'EditFlags' -Value '2162688' -PropertyType DWord -Force -ErrorAction SilentlyContinue | Out-Null + New-ItemProperty -LiteralPath $WAUClassCmd -Name '(default)' -Value $WAUClassRun -PropertyType String -Force -ErrorAction SilentlyContinue | Out-Null + + $OutdatedApps = @() + #If White List + if ($WAUConfig.WAU_UseWhiteList -eq 1) { + $toUpdate = Get-IncludedApps + foreach ($app in $Outdated) { + if (($toUpdate -contains $app.Id) -and $($app.Version) -ne "Unknown") { + $OutdatedApps += $app.Name + } + } + } + #If Black List or default + else { + $toSkip = Get-ExcludedApps + foreach ($app in $Outdated) { + if (-not ($toSkip -contains $app.Id) -and $($app.Version) -ne "Unknown") { + $OutdatedApps += $app.Name + } + } + } + + $body = $OutdatedApps | Out-String + if ($body) { + #Ask user to update apps + Start-NotifTask -Title "New available updates" -Message "Do you want to update these apps ?" -Body $body -ButtonDismiss -Button1Text "Yes" -Button1Action "wau:1" -MessageType "info" + Return 0 + } + else { + Return 1 + } + +} \ No newline at end of file