diff --git a/Winget-AutoUpdate-Install.ps1 b/Winget-AutoUpdate-Install.ps1 index 79d3261..bc1db00 100644 --- a/Winget-AutoUpdate-Install.ps1 +++ b/Winget-AutoUpdate-Install.ps1 @@ -91,78 +91,107 @@ #> [CmdletBinding()] -param( - [Alias('S')] [Switch] $Silent = $false, - [Alias('Path')] [String] $WingetUpdatePath = "$env:ProgramData\Winget-AutoUpdate", - [Alias('List')] [String] $ListPath, - [Alias('Mods')] [String] $ModsPath, - [Alias('AzureBlobURL')] [String] $AzureBlobSASURL, - [Switch] $DoNotUpdate = $false, - [Switch] $DisableWAUAutoUpdate = $false, - [Switch] $RunOnMetered = $false, - [Switch] $Uninstall = $false, - [Switch] $NoClean = $false, - [Switch] $DesktopShortcut = $false, - [Switch] $StartMenuShortcut = $false, - [Switch] $UseWhiteList = $false, - [ValidateSet('Full', 'SuccessOnly', 'None')] [String] $NotificationLevel = 'Full', - [Switch] $UpdatesAtLogon = $false, - [ValidateSet('Daily', 'BiDaily', 'Weekly', 'BiWeekly', 'Monthly', 'Never')] [String] $UpdatesInterval = 'Daily', - [DateTime] $UpdatesAtTime = ('06am'), - [Switch] $BypassListForUsers = $false, - [Switch] $InstallUserContext = $false, - [ValidateRange(0, 99)] [int] $MaxLogFiles = 3, - [long] $MaxLogSize = 1048576 # in bytes, default is 1048576 = 1 MB +param ( + [Alias('S')] + [Switch] + $Silent = $false, + [Alias('Path')] + [String] + $WingetUpdatePath = "$env:ProgramData\Winget-AutoUpdate", + [Alias('List')] + [String] + $ListPath, + [Alias('Mods')] + [String] + $ModsPath, + [Alias('AzureBlobURL')] + [String] + $AzureBlobSASURL, + [Switch] + $DoNotUpdate = $false, + [Switch] + $DisableWAUAutoUpdate = $false, + [Switch] + $RunOnMetered = $false, + [Switch] + $Uninstall = $false, + [Switch] + $NoClean = $false, + [Switch] + $DesktopShortcut = $false, + [Switch] + $StartMenuShortcut = $false, + [Switch] + $UseWhiteList = $false, + [ValidateSet('Full', 'SuccessOnly', 'None')] + [String] + $NotificationLevel = 'Full', + [Switch] + $UpdatesAtLogon = $false, + [ValidateSet('Daily', 'BiDaily', 'Weekly', 'BiWeekly', 'Monthly', 'Never')] + [String] + $UpdatesInterval = 'Daily', + [DateTime] + $UpdatesAtTime = ('06am'), + [Switch] + $BypassListForUsers = $false, + [Switch] + $InstallUserContext = $false, + [ValidateRange(0, 99)] + [int] + $MaxLogFiles = 3, + [long] + $MaxLogSize = 1048576 # in bytes, default is 1048576 = 1 MB ) <# FUNCTIONS #> -function Install-Prerequisites -{ +function Install-Prerequisites +{ Write-Host -Object "`nChecking prerequisites..." -ForegroundColor Yellow - + #Check if Visual C++ 2019 or 2022 installed $Visual2019 = 'Microsoft Visual C++ 2015-2019 Redistributable*' $Visual2022 = 'Microsoft Visual C++ 2015-2022 Redistributable*' $path = Get-Item HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object -FilterScript { - $_.GetValue('DisplayName') -like $Visual2019 -or $_.GetValue('DisplayName') -like $Visual2022 + $_.GetValue('DisplayName') -like $Visual2019 -or $_.GetValue('DisplayName') -like $Visual2022 } - + #If not installed, ask for installation - if (!($path)) + if (!($path)) { #If -silent option, force installation - if ($Silent) + if ($Silent) { $InstallApp = 1 } - else + else { #Ask for installation $MsgBoxTitle = 'Winget Prerequisites' $MsgBoxContent = 'Microsoft Visual C++ 2015-2022 is required. Would you like to install it?' $MsgBoxTimeOut = 60 $MsgBoxReturn = (New-Object -ComObject 'Wscript.Shell').Popup($MsgBoxContent, $MsgBoxTimeOut, $MsgBoxTitle, 4 + 32) - if ($MsgBoxReturn -ne 7) + if ($MsgBoxReturn -ne 7) { $InstallApp = 1 } - else + else { $InstallApp = 0 } } #Install if approved - if ($InstallApp -eq 1) + if ($InstallApp -eq 1) { - try + try { - if ((Get-CimInstance Win32_OperatingSystem).OSArchitecture -like '*64*') + if ((Get-CimInstance Win32_OperatingSystem).OSArchitecture -like '*64*') { $OSArch = 'x64' } - else + else { $OSArch = 'x86' } @@ -176,247 +205,247 @@ function Install-Prerequisites Remove-Item $Installer -ErrorAction Ignore Write-Host -Object 'MS Visual C++ 2015-2022 installed successfully' -ForegroundColor Green } - catch + catch { Write-Host -Object 'MS Visual C++ 2015-2022 installation failed.' -ForegroundColor Red Start-Sleep -Seconds 3 } } - else + else { Write-Host -Object '-> MS Visual C++ 2015-2022 will not be installed.' -ForegroundColor Magenta } } - else + else { Write-Host -Object 'Prerequisites checked. OK' -ForegroundColor Green } } -function Install-WinGet -{ +function Install-WinGet +{ Write-Host -Object "`nChecking if Winget is installed" -ForegroundColor Yellow - + #Check Package Install $TestWinGet = Get-AppxProvisionedPackage -Online | Where-Object -FilterScript { - $_.DisplayName -eq 'Microsoft.DesktopAppInstaller' + $_.DisplayName -eq 'Microsoft.DesktopAppInstaller' } - + #Current: v1.5.2201 = 1.20.2201.0 = 2023.808.2243.0 - If ([Version]$TestWinGet.Version -ge '2023.808.2243.0') + if ([Version]$TestWinGet.Version -ge '2023.808.2243.0') { Write-Host -Object 'Winget is Installed' -ForegroundColor Green } - Else - { + else + { Write-Host -Object '-> Winget is not installed:' - + #Check if $WingetUpdatePath exist - if (!(Test-Path $WingetUpdatePath)) + if (!(Test-Path $WingetUpdatePath)) { $null = New-Item -ItemType Directory -Force -Path $WingetUpdatePath } - + #Downloading and Installing Dependencies in SYSTEM context - if (!(Get-AppxPackage -Name 'Microsoft.UI.Xaml.2.7')) + if (!(Get-AppxPackage -Name 'Microsoft.UI.Xaml.2.7')) { Write-Host -Object '-> Downloading Microsoft.UI.Xaml.2.7...' $UiXamlUrl = 'https://www.nuget.org/api/v2/package/Microsoft.UI.Xaml/2.7.0' $UiXamlZip = "$WingetUpdatePath\Microsoft.UI.XAML.2.7.zip" Invoke-RestMethod -Uri $UiXamlUrl -OutFile $UiXamlZip Expand-Archive -Path $UiXamlZip -DestinationPath "$WingetUpdatePath\extracted" -Force - try + try { Write-Host -Object '-> Installing Microsoft.UI.Xaml.2.7...' $null = Add-AppxProvisionedPackage -Online -PackagePath "$WingetUpdatePath\extracted\tools\AppX\x64\Release\Microsoft.UI.Xaml.2.7.appx" -SkipLicense Write-Host -Object 'Microsoft.UI.Xaml.2.7 installed successfully' -ForegroundColor Green } - catch + catch { Write-Host -Object 'Failed to intall Wicrosoft.UI.Xaml.2.7...' -ForegroundColor Red } Remove-Item -Path $UiXamlZip -Force Remove-Item -Path "$WingetUpdatePath\extracted" -Force -Recurse } - - if (!(Get-AppxPackage -Name 'Microsoft.VCLibs.140.00.UWPDesktop')) + + if (!(Get-AppxPackage -Name 'Microsoft.VCLibs.140.00.UWPDesktop')) { Write-Host -Object '-> Downloading Microsoft.VCLibs.140.00.UWPDesktop...' $VCLibsUrl = 'https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx' $VCLibsFile = "$WingetUpdatePath\Microsoft.VCLibs.x64.14.00.Desktop.appx" Invoke-RestMethod -Uri $VCLibsUrl -OutFile $VCLibsFile - try + try { Write-Host -Object '-> Installing Microsoft.VCLibs.140.00.UWPDesktop...' $null = Add-AppxProvisionedPackage -Online -PackagePath $VCLibsFile -SkipLicense Write-Host -Object 'Microsoft.VCLibs.140.00.UWPDesktop installed successfully' -ForegroundColor Green } - catch + catch { Write-Host -Object 'Failed to intall Microsoft.VCLibs.140.00.UWPDesktop...' -ForegroundColor Red } Remove-Item -Path $VCLibsFile -Force } - + #Download WinGet MSIXBundle Write-Host -Object '-> Downloading Winget MSIXBundle for App Installer...' $WinGetURL = 'https://github.com/microsoft/winget-cli/releases/download/v1.5.2201/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle' $WebClient = New-Object -TypeName System.Net.WebClient $WebClient.DownloadFile($WinGetURL, "$WingetUpdatePath\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle") - + #Install WinGet MSIXBundle in SYSTEM context - try + try { Write-Host -Object '-> Installing Winget MSIXBundle for App Installer...' $null = Add-AppxProvisionedPackage -Online -PackagePath "$WingetUpdatePath\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle" -SkipLicense Write-Host -Object 'Winget MSIXBundle for App Installer installed successfully' -ForegroundColor Green } - catch + catch { Write-Host -Object 'Failed to intall Winget MSIXBundle for App Installer...' -ForegroundColor Red } - + #Remove WinGet MSIXBundle Remove-Item -Path "$WingetUpdatePath\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle" -Force -ErrorAction Continue } } -function Install-WingetAutoUpdate -{ +function Install-WingetAutoUpdate +{ Write-Host -Object "`nInstalling WAU..." -ForegroundColor Yellow - - try + + try { #Copy files to location (and clean old install) - if (!(Test-Path $WingetUpdatePath)) + if (!(Test-Path $WingetUpdatePath)) { $null = New-Item -ItemType Directory -Force -Path $WingetUpdatePath } - else + else { - if (!$NoClean) + if (!$NoClean) { Remove-Item -Path "$WingetUpdatePath\*" -Exclude *.log -Recurse -Force } - else + else { #Keep critical files Get-ChildItem -Path $WingetUpdatePath -Exclude *.txt, mods, logs | Remove-Item -Recurse -Force } } Copy-Item -Path "$PSScriptRoot\Winget-AutoUpdate\*" -Destination $WingetUpdatePath -Recurse -Force -ErrorAction SilentlyContinue - + #White List or Black List apps - if ($UseWhiteList) + if ($UseWhiteList) { - if (!$NoClean) + if (!$NoClean) { - if ((Test-Path -Path "$PSScriptRoot\included_apps.txt")) + if ((Test-Path -Path "$PSScriptRoot\included_apps.txt")) { Copy-Item -Path "$PSScriptRoot\included_apps.txt" -Destination $WingetUpdatePath -Recurse -Force -ErrorAction SilentlyContinue } - else + else { - if (!$ListPath) + if (!$ListPath) { $null = New-Item -Path $WingetUpdatePath -Name 'included_apps.txt' -ItemType 'file' -ErrorAction SilentlyContinue } } } - elseif (!(Test-Path -Path "$WingetUpdatePath\included_apps.txt")) + elseif (!(Test-Path -Path "$WingetUpdatePath\included_apps.txt")) { - if ((Test-Path -Path "$PSScriptRoot\included_apps.txt")) + if ((Test-Path -Path "$PSScriptRoot\included_apps.txt")) { Copy-Item -Path "$PSScriptRoot\included_apps.txt" -Destination $WingetUpdatePath -Recurse -Force -ErrorAction SilentlyContinue } - else + else { - if (!$ListPath) + if (!$ListPath) { $null = New-Item -Path $WingetUpdatePath -Name 'included_apps.txt' -ItemType 'file' -ErrorAction SilentlyContinue } } } } - else + else { - if (!$NoClean) + if (!$NoClean) { Copy-Item -Path "$PSScriptRoot\excluded_apps.txt" -Destination $WingetUpdatePath -Recurse -Force -ErrorAction SilentlyContinue } - elseif (!(Test-Path -Path "$WingetUpdatePath\excluded_apps.txt")) + elseif (!(Test-Path -Path "$WingetUpdatePath\excluded_apps.txt")) { Copy-Item -Path "$PSScriptRoot\excluded_apps.txt" -Destination $WingetUpdatePath -Recurse -Force -ErrorAction SilentlyContinue } } - + # Set dummy regkeys for notification name and icon $null = & "$env:windir\system32\reg.exe" add 'HKCR\AppUserModelId\Windows.SystemToast.Winget.Notification' /v DisplayName /t REG_EXPAND_SZ /d 'Application Update' /f $null = & "$env:windir\system32\reg.exe" add 'HKCR\AppUserModelId\Windows.SystemToast.Winget.Notification' /v IconUri /t REG_EXPAND_SZ /d %SystemRoot%\system32\@WindowsUpdateToastIcon.png /f - + # Settings for the scheduled task for Updates $taskAction = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$($WingetUpdatePath)\winget-upgrade.ps1`"" $taskTriggers = @() - if ($UpdatesAtLogon) + if ($UpdatesAtLogon) { $taskTriggers += New-ScheduledTaskTrigger -AtLogOn } - if ($UpdatesInterval -eq 'Daily') + if ($UpdatesInterval -eq 'Daily') { $taskTriggers += New-ScheduledTaskTrigger -Daily -At $UpdatesAtTime } - elseif ($UpdatesInterval -eq 'BiDaily') + elseif ($UpdatesInterval -eq 'BiDaily') { $taskTriggers += New-ScheduledTaskTrigger -Daily -At $UpdatesAtTime -DaysInterval 2 } - elseif ($UpdatesInterval -eq 'Weekly') + elseif ($UpdatesInterval -eq 'Weekly') { $taskTriggers += New-ScheduledTaskTrigger -Weekly -At $UpdatesAtTime -DaysOfWeek 2 } - elseif ($UpdatesInterval -eq 'BiWeekly') + elseif ($UpdatesInterval -eq 'BiWeekly') { $taskTriggers += New-ScheduledTaskTrigger -Weekly -At $UpdatesAtTime -DaysOfWeek 2 -WeeksInterval 2 } - elseif ($UpdatesInterval -eq 'Monthly') + elseif ($UpdatesInterval -eq 'Monthly') { $taskTriggers += New-ScheduledTaskTrigger -Weekly -At $UpdatesAtTime -DaysOfWeek 2 -WeeksInterval 4 } $taskUserPrincipal = New-ScheduledTaskPrincipal -UserId S-1-5-18 -RunLevel Highest $taskSettings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -ExecutionTimeLimit 03:00:00 - + # Set up the task, and register it - if ($taskTriggers) + if ($taskTriggers) { $task = New-ScheduledTask -Action $taskAction -Principal $taskUserPrincipal -Settings $taskSettings -Trigger $taskTriggers } - else + else { $task = New-ScheduledTask -Action $taskAction -Principal $taskUserPrincipal -Settings $taskSettings } - + $null = Register-ScheduledTask -TaskName 'Winget-AutoUpdate' -InputObject $task -Force - - if ($InstallUserContext) + + if ($InstallUserContext) { # Settings for the scheduled task in User context $taskAction = New-ScheduledTaskAction -Execute 'wscript.exe' -Argument "`"$($WingetUpdatePath)\Invisible.vbs`" `"powershell.exe -NoProfile -ExecutionPolicy Bypass -File `"`"`"$($WingetUpdatePath)\winget-upgrade.ps1`"`"" $taskUserPrincipal = New-ScheduledTaskPrincipal -GroupId S-1-5-11 $taskSettings = New-ScheduledTaskSettingsSet -Compatibility Win8 -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -ExecutionTimeLimit 03:00:00 - + # Set up the task for user apps $task = New-ScheduledTask -Action $taskAction -Principal $taskUserPrincipal -Settings $taskSettings $null = Register-ScheduledTask -TaskName 'Winget-AutoUpdate-UserContext' -InputObject $task -Force } - + # Settings for the scheduled task for Notifications $taskAction = New-ScheduledTaskAction -Execute 'wscript.exe' -Argument "`"$($WingetUpdatePath)\Invisible.vbs`" `"powershell.exe -NoProfile -ExecutionPolicy Bypass -File `"`"`"$($WingetUpdatePath)\winget-notify.ps1`"`"" $taskUserPrincipal = New-ScheduledTaskPrincipal -GroupId S-1-5-11 $taskSettings = New-ScheduledTaskSettingsSet -Compatibility Win8 -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -ExecutionTimeLimit 00:05:00 - + # Set up the task, and register it $task = New-ScheduledTask -Action $taskAction -Principal $taskUserPrincipal -Settings $taskSettings $null = Register-ScheduledTask -TaskName 'Winget-AutoUpdate-Notify' -InputObject $task -Force - + #Set task readable/runnable for all users $scheduler = New-Object -ComObject 'Schedule.Service' $scheduler.Connect() @@ -424,7 +453,7 @@ function Install-WingetAutoUpdate $sec = $task.GetSecurityDescriptor(0xF) $sec = $sec + '(A;;GRGX;;;AU)' $task.SetSecurityDescriptor($sec, 0) - + # Configure Reg Key $regPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate' $null = New-Item $regPath -Force @@ -443,67 +472,67 @@ function Install-WingetAutoUpdate { $null = New-ItemProperty $regPath -Name WAU_UpdatePrerelease -Value 1 -PropertyType DWord -Force } - else + else { $null = New-ItemProperty $regPath -Name WAU_UpdatePrerelease -Value 0 -PropertyType DWord -Force } $null = New-ItemProperty $regPath -Name WAU_PostUpdateActions -Value 0 -PropertyType DWord -Force $null = New-ItemProperty $regPath -Name WAU_MaxLogFiles -Value $MaxLogFiles -PropertyType DWord -Force $null = New-ItemProperty $regPath -Name WAU_MaxLogSize -Value $MaxLogSize -PropertyType DWord -Force - if ($DisableWAUAutoUpdate) + if ($DisableWAUAutoUpdate) { $null = New-ItemProperty $regPath -Name WAU_DisableAutoUpdate -Value 1 -Force } - if ($UseWhiteList) + if ($UseWhiteList) { $null = New-ItemProperty $regPath -Name WAU_UseWhiteList -Value 1 -PropertyType DWord -Force } - if (!$RunOnMetered) + if (!$RunOnMetered) { $null = New-ItemProperty $regPath -Name WAU_DoNotRunOnMetered -Value 1 -PropertyType DWord -Force } - if ($ListPath) + if ($ListPath) { $null = New-ItemProperty $regPath -Name WAU_ListPath -Value $ListPath -Force } - if ($ModsPath) + if ($ModsPath) { $null = New-ItemProperty $regPath -Name WAU_ModsPath -Value $ModsPath -Force } - if ($AzureBlobSASURL) + if ($AzureBlobSASURL) { $null = New-ItemProperty $regPath -Name WAU_AzureBlobSASURL -Value $AzureBlobSASURL -Force } - if ($BypassListForUsers) + if ($BypassListForUsers) { $null = New-ItemProperty $regPath -Name WAU_BypassListForUsers -Value 1 -PropertyType DWord -Force } - + #Log file and symlink initialization . "$WingetUpdatePath\functions\Start-Init.ps1" Start-Init - + #Security check Write-Host -Object "`nChecking Mods Directory:" -ForegroundColor Yellow . "$WingetUpdatePath\functions\Invoke-ModsProtect.ps1" $Protected = Invoke-ModsProtect "$WingetUpdatePath\mods" - if ($Protected -eq $True) + if ($Protected -eq $True) { Write-Host -Object "The mods directory is now secured!`n" -ForegroundColor Green } - elseif ($Protected -eq $false) + elseif ($Protected -eq $false) { Write-Host -Object "The mods directory was already secured!`n" -ForegroundColor Green } - else + else { Write-Host -Object "Error: The mods directory couldn't be verified as secured!`n" -ForegroundColor Red } - + #Create Shortcuts - if ($StartMenuShortcut) + if ($StartMenuShortcut) { - if (!(Test-Path -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)")) + if (!(Test-Path -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)")) { $null = New-Item -ItemType Directory -Force -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)" } @@ -511,19 +540,19 @@ function Install-WingetAutoUpdate Add-Shortcut 'wscript.exe' "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)\WAU - Open logs.lnk" "`"$($WingetUpdatePath)\Invisible.vbs`" `"powershell.exe -NoProfile -ExecutionPolicy Bypass -File `"`"`"$($WingetUpdatePath)\user-run.ps1`" -Logs`"" "${env:SystemRoot}\System32\shell32.dll,-16763" 'Open existing WAU logs...' Add-Shortcut 'wscript.exe' "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)\WAU - Web Help.lnk" "`"$($WingetUpdatePath)\Invisible.vbs`" `"powershell.exe -NoProfile -ExecutionPolicy Bypass -File `"`"`"$($WingetUpdatePath)\user-run.ps1`" -Help`"" "${env:SystemRoot}\System32\shell32.dll,-24" 'Help for WAU...' } - - if ($DesktopShortcut) + + if ($DesktopShortcut) { Add-Shortcut 'wscript.exe' "${env:Public}\Desktop\WAU - Check for updated Apps.lnk" "`"$($WingetUpdatePath)\Invisible.vbs`" `"powershell.exe -NoProfile -ExecutionPolicy Bypass -File `"`"`"$($WingetUpdatePath)\user-run.ps1`"`"" "${env:SystemRoot}\System32\shell32.dll,-16739" 'Manual start of Winget-AutoUpdate (WAU)...' } - + Write-Host -Object 'WAU Installation succeeded!' -ForegroundColor Green Start-Sleep -Seconds 1 - + #Run Winget ? Start-WingetAutoUpdate } - catch + catch { Write-Host -Object 'WAU Installation failed! Run me with admin rights' -ForegroundColor Red Start-Sleep -Seconds 1 @@ -531,31 +560,31 @@ function Install-WingetAutoUpdate } } -function Uninstall-WingetAutoUpdate -{ +function Uninstall-WingetAutoUpdate +{ Write-Host -Object "`nUninstalling WAU..." -ForegroundColor Yellow - - try + + try { #Get registry install location $InstallLocation = Get-ItemPropertyValue -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate\' -Name InstallLocation - + #Check if installed location exists and delete - if (Test-Path ($InstallLocation)) - { - if (!$NoClean) + if (Test-Path ($InstallLocation)) + { + if (!$NoClean) { Remove-Item $InstallLocation -Force -Recurse - if (Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-updates.log") + if (Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-updates.log") { $null = Remove-Item -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-updates.log" -Force -ErrorAction SilentlyContinue } - if (Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-install.log") + if (Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-install.log") { $null = Remove-Item -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-install.log" -Force -ErrorAction SilentlyContinue } } - else + else { #Keep critical files Get-ChildItem -Path $InstallLocation -Exclude *.txt, mods, logs | Remove-Item -Recurse -Force @@ -565,94 +594,90 @@ function Uninstall-WingetAutoUpdate Get-ScheduledTask -TaskName 'Winget-AutoUpdate-UserContext' -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm:$false $null = & "$env:windir\system32\reg.exe" delete 'HKCR\AppUserModelId\Windows.SystemToast.Winget.Notification' /f $null = & "$env:windir\system32\reg.exe" delete 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate' /f - - if ((Test-Path -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)")) + + if ((Test-Path -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)")) { $null = Remove-Item -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)" -Recurse -Force } - - if ((Test-Path -Path "${env:Public}\Desktop\WAU - Check for updated Apps.lnk")) + + if ((Test-Path -Path "${env:Public}\Desktop\WAU - Check for updated Apps.lnk")) { $null = Remove-Item -Path "${env:Public}\Desktop\WAU - Check for updated Apps.lnk" -Force } - + Write-Host -Object 'Uninstallation succeeded!' -ForegroundColor Green Start-Sleep -Seconds 1 } - else + else { Write-Host -Object "$InstallLocation not found! Uninstallation failed!" -ForegroundColor Red } } - catch + catch { Write-Host -Object 'Uninstallation failed! Run as admin ?' -ForegroundColor Red Start-Sleep -Seconds 1 } } -function Start-WingetAutoUpdate +function Start-WingetAutoUpdate { #If -DoNotUpdate is true, skip. - if (!($DoNotUpdate)) + if (!($DoNotUpdate)) { #If -Silent, run Winget-AutoUpdate now - if ($Silent) + if ($Silent) { $RunWinget = 1 } #Ask for WingetAutoUpdate - else + else { $MsgBoxTitle = 'Winget-AutoUpdate' $MsgBoxContent = 'Would you like to run Winget-AutoUpdate now?' $MsgBoxTimeOut = 60 $MsgBoxReturn = (New-Object -ComObject 'Wscript.Shell').Popup($MsgBoxContent, $MsgBoxTimeOut, $MsgBoxTitle, 4 + 32) - if ($MsgBoxReturn -ne 7) + if ($MsgBoxReturn -ne 7) { $RunWinget = 1 } - else + else { $RunWinget = 0 } } - if ($RunWinget -eq 1) + if ($RunWinget -eq 1) { - try + try { Write-Host -Object "`nRunning Winget-AutoUpdate..." -ForegroundColor Yellow Get-ScheduledTask -TaskName 'Winget-AutoUpdate' -ErrorAction SilentlyContinue | Start-ScheduledTask -ErrorAction SilentlyContinue - while ((Get-ScheduledTask -TaskName 'Winget-AutoUpdate').State -ne 'Ready') + while ((Get-ScheduledTask -TaskName 'Winget-AutoUpdate').State -ne 'Ready') { Start-Sleep -Seconds 1 } } - catch + catch { Write-Host -Object 'Failed to run Winget-AutoUpdate...' -ForegroundColor Red } } } - else + else { Write-Host -Object 'Skip running Winget-AutoUpdate' } } -function Add-Shortcut -{ +function Add-Shortcut +{ [CmdletBinding()] param ( $Target, - $Shortcut, - $Arguments, - $Icon, - $Description ) $WScriptShell = New-Object -ComObject WScript.Shell @@ -673,12 +698,12 @@ $WAUVersion = Get-Content -Path "$PSScriptRoot\Winget-AutoUpdate\Version.txt" -E <# MAIN #> #If running as a 32-bit process on an x64 system, re-launch as a 64-bit process -if ("$env:PROCESSOR_ARCHITEW6432" -ne 'ARM64') +if ("$env:PROCESSOR_ARCHITEW6432" -ne 'ARM64') { - if (Test-Path -Path "$($env:windir)\SysNative\WindowsPowerShell\v1.0\powershell.exe") + if (Test-Path -Path "$($env:windir)\SysNative\WindowsPowerShell\v1.0\powershell.exe") { Start-Process -FilePath "$($env:windir)\SysNative\WindowsPowerShell\v1.0\powershell.exe" -Wait -NoNewWindow -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command $($MyInvocation.line)" - Exit $lastexitcode + exit $lastexitcode } } @@ -695,14 +720,14 @@ Write-Host -Object "`t Winget-AutoUpdate $WAUVersion`n" -Foregro Write-Host -Object "`t https://github.com/Romanitho/Winget-AutoUpdate`n" -ForegroundColor Magenta Write-Host -Object "`t________________________________________________________`n`n" -if (!$Uninstall) +if (!$Uninstall) { Write-Host -Object "Installing WAU to $WingetUpdatePath\" Install-Prerequisites Install-WinGet Install-WingetAutoUpdate } -else +else { Write-Host -Object 'Uninstalling WAU...' Uninstall-WingetAutoUpdate diff --git a/Winget-AutoUpdate/User-Run.ps1 b/Winget-AutoUpdate/User-Run.ps1 index bec2dea..07910ed 100644 --- a/Winget-AutoUpdate/User-Run.ps1 +++ b/Winget-AutoUpdate/User-Run.ps1 @@ -18,16 +18,18 @@ #> [CmdletBinding()] -param( - [Switch] $Logs = $False, - [Switch] $Help = $False +param ( + [Switch] + $Logs = $False, + [Switch] + $Help = $False ) -function Test-WAUisRunning +function Test-WAUisRunning { - If (((Get-ScheduledTask -TaskName 'Winget-AutoUpdate' -ErrorAction SilentlyContinue).State -eq 'Running') -or ((Get-ScheduledTask -TaskName 'Winget-AutoUpdate-UserContext' -ErrorAction SilentlyContinue).State -eq 'Running')) + if (((Get-ScheduledTask -TaskName 'Winget-AutoUpdate' -ErrorAction SilentlyContinue).State -eq 'Running') -or ((Get-ScheduledTask -TaskName 'Winget-AutoUpdate-UserContext' -ErrorAction SilentlyContinue).State -eq 'Running')) { - Return $True + return $True } } @@ -47,13 +49,13 @@ Get-NotifLocale $OnClickAction = ('{0}\logs\updates.log' -f $WorkingDir) $Button1Text = $NotifLocale.local.outputs.output[11].message -if ($Logs) +if ($Logs) { - if (Test-Path -Path ('{0}\logs\updates.log' -f $WorkingDir)) + if (Test-Path -Path ('{0}\logs\updates.log' -f $WorkingDir)) { Invoke-Item -Path ('{0}\logs\updates.log' -f $WorkingDir) } - else + else { #Not available yet $Message = $NotifLocale.local.outputs.output[5].message @@ -61,16 +63,16 @@ if ($Logs) Start-NotifTask -Message $Message -MessageType $MessageType -UserRun } } -elseif ($Help) +elseif ($Help) { Start-Process -FilePath 'https://github.com/Romanitho/Winget-AutoUpdate' } -else +else { - try + try { # Check if WAU is currently running - if (Test-WAUisRunning) + if (Test-WAUisRunning) { $Message = $NotifLocale.local.outputs.output[8].message $MessageType = 'warning' @@ -84,13 +86,13 @@ else $MessageType = 'info' Start-NotifTask -Message $Message -MessageType $MessageType -Button1Text $Button1Text -Button1Action $OnClickAction -ButtonDismiss -UserRun # Sleep until the task is done - While (Test-WAUisRunning) + while (Test-WAUisRunning) { Start-Sleep -Seconds 3 } - + # Test if there was a list_/winget_error - if (Test-Path -Path ('{0}\logs\error.txt' -f $WorkingDir) -ErrorAction SilentlyContinue) + if (Test-Path -Path ('{0}\logs\error.txt' -f $WorkingDir) -ErrorAction SilentlyContinue) { $MessageType = 'error' $Critical = Get-Content -Path ('{0}\logs\error.txt' -f $WorkingDir) -Raw @@ -98,14 +100,14 @@ else $Critical = $Critical.Substring(0, [Math]::Min($Critical.Length, 50)) $Message = ("Critical:`n{0}..." -f $Critical) } - else + else { $MessageType = 'success' $Message = $NotifLocale.local.outputs.output[9].message } Start-NotifTask -Message $Message -MessageType $MessageType -Button1Text $Button1Text -Button1Action $OnClickAction -ButtonDismiss -UserRun } - catch + catch { # Check failed - Just send notification $Message = $NotifLocale.local.outputs.output[7].message diff --git a/Winget-AutoUpdate/WAU-Uninstall.ps1 b/Winget-AutoUpdate/WAU-Uninstall.ps1 index c715a9a..089a2a6 100644 --- a/Winget-AutoUpdate/WAU-Uninstall.ps1 +++ b/Winget-AutoUpdate/WAU-Uninstall.ps1 @@ -14,8 +14,9 @@ #> [CmdletBinding()] -param( - [Switch] $NoClean = $false +param ( + [Switch] + $NoClean = $false ) Write-Host -Object "`n" @@ -31,21 +32,21 @@ Write-Host -Object "`t Winget-AutoUpdate`n" -ForegroundColor Write-Host -Object "`t https://github.com/Romanitho/Winget-AutoUpdate`n" -ForegroundColor Magenta Write-Host -Object "`t________________________________________________________`n`n" -try +try { Write-Host -Object 'Uninstalling WAU...' -ForegroundColor Yellow - + # Get registry install location $InstallLocation = (Get-ItemPropertyValue -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate\' -Name InstallLocation) - + # Check if installed location exists and delete - if (Test-Path -Path ($InstallLocation)) + if (Test-Path -Path ($InstallLocation)) { - if (!$NoClean) + if (!$NoClean) { $null = (Remove-Item -Path ('{0}\*' -f $InstallLocation) -Force -Confirm:$false -Recurse -Exclude '*.log') } - else + else { # Keep critical files $null = (Get-ChildItem -Path $InstallLocation -Exclude *.txt, mods, logs | Remove-Item -Recurse -Force -Confirm:$false -ErrorAction SilentlyContinue) @@ -55,40 +56,40 @@ try $null = (Get-ScheduledTask -TaskName 'Winget-AutoUpdate-UserContext' -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm:$false) $null = & "$env:windir\system32\reg.exe" delete 'HKCR\AppUserModelId\Windows.SystemToast.Winget.Notification' /f $null = & "$env:windir\system32\reg.exe" delete 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate' /f - - if (Test-Path -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate' -ErrorAction SilentlyContinue) + + if (Test-Path -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate' -ErrorAction SilentlyContinue) { $null = & "$env:windir\system32\reg.exe" delete 'HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate' /f } - - if ((Test-Path -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)")) + + if ((Test-Path -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)")) { $null = (Remove-Item -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)" -Recurse -Force -Confirm:$false) } - - if ((Test-Path -Path "${env:Public}\Desktop\WAU - Check for updated Apps.lnk")) + + if ((Test-Path -Path "${env:Public}\Desktop\WAU - Check for updated Apps.lnk")) { $null = (Remove-Item -Path "${env:Public}\Desktop\WAU - Check for updated Apps.lnk" -Force -Confirm:$false) } - + # Remove Intune Logs if they are existing - if (Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-updates.log") + if (Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-updates.log") { $null = (Remove-Item -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-updates.log" -Force -Confirm:$false -ErrorAction SilentlyContinue) } - if (Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-install.log" -ErrorAction SilentlyContinue) + if (Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-install.log" -ErrorAction SilentlyContinue) { $null = (Remove-Item -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-install.log" -Force -Confirm:$false -ErrorAction SilentlyContinue) } - + Write-Host -Object 'Uninstallation succeeded!' -ForegroundColor Green } - else + else { Write-Host -Object ('{0} not found! Uninstallation failed!' -f $InstallLocation) -ForegroundColor Red } } -catch +catch { Write-Host -Object "`nUninstallation failed! Run as admin ?" -ForegroundColor Red } diff --git a/Winget-AutoUpdate/Winget-Notify.ps1 b/Winget-AutoUpdate/Winget-Notify.ps1 index e6036cf..4164a6f 100644 --- a/Winget-AutoUpdate/Winget-Notify.ps1 +++ b/Winget-AutoUpdate/Winget-Notify.ps1 @@ -4,7 +4,7 @@ $WAUinstalledPath = (Get-ItemPropertyValue -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate\' -Name InstallLocation) [xml]$NotifConf = (Get-Content -Path "$WAUinstalledPath\config\notif.xml" -Encoding UTF8 -ErrorAction SilentlyContinue) -if (!($NotifConf)) +if (!($NotifConf)) { break } diff --git a/Winget-AutoUpdate/Winget-Upgrade.ps1 b/Winget-AutoUpdate/Winget-Upgrade.ps1 index f36eb8e..1a9eb3d 100644 --- a/Winget-AutoUpdate/Winget-Upgrade.ps1 +++ b/Winget-AutoUpdate/Winget-Upgrade.ps1 @@ -4,7 +4,9 @@ $Script:WorkingDir = $PSScriptRoot # Get Functions -Get-ChildItem -Path "$WorkingDir\functions" | ForEach-Object { . $_.FullName } +Get-ChildItem -Path "$WorkingDir\functions" | ForEach-Object { + . $_.FullName +} <# MAIN #> @@ -18,55 +20,66 @@ Start-Init $Script:WAUConfig = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate') #Log running context and more... -if ($IsSystem) { - Write-ToLog 'Running in System context' - - #Get and set Domain/Local Policies (GPO) - $ActivateGPOManagement, $ChangedSettings = Get-Policies - if ($ActivateGPOManagement) { - Write-ToLog 'Activated WAU GPO Management detected, comparing...' - if ($null -ne $ChangedSettings -and $ChangedSettings -ne 0) { - Write-ToLog 'Changed settings detected and applied' 'Yellow' - } - else { - Write-ToLog 'No Changed settings detected' 'Yellow' - } - } - - # Maximum number of log files to keep. Default is 3. Setting MaxLogFiles to 0 will keep all log files. - $MaxLogFiles = $WAUConfig.WAU_MaxLogFiles - if ($null -eq $MaxLogFiles) { - [int] $MaxLogFiles = 3 - } - else { - [int] $MaxLogFiles = $MaxLogFiles - } - - # Maximum size of log file. - $MaxLogSize = $WAUConfig.WAU_MaxLogSize - if (!$MaxLogSize) { - [long] $MaxLogSize = 1048576 # in bytes, default is 1048576 = 1 MB - } - else { - [long] $MaxLogSize = $MaxLogSize - } - - #LogRotation if System - $LogRotate = Invoke-LogRotation $LogFile $MaxLogFiles $MaxLogSize - if ($LogRotate -eq $False) { - Write-ToLog 'An Exception occured during Log Rotation...' - } - - #Run post update actions if necessary if run as System - if (!($WAUConfig.WAU_PostUpdateActions -eq 0)) { - Invoke-PostUpdateActions - } - #Run Scope Machine funtion if run as System - $SettingsPath = "$Env:windir\system32\config\systemprofile\AppData\Local\Microsoft\WinGet\Settings\defaultState\settings.json" - Add-ScopeMachine $SettingsPath +if ($IsSystem) +{ + Write-ToLog 'Running in System context' + + #Get and set Domain/Local Policies (GPO) + $ActivateGPOManagement, $ChangedSettings = Get-Policies + if ($ActivateGPOManagement) + { + Write-ToLog 'Activated WAU GPO Management detected, comparing...' + if ($null -ne $ChangedSettings -and $ChangedSettings -ne 0) + { + Write-ToLog 'Changed settings detected and applied' 'Yellow' + } + else + { + Write-ToLog 'No Changed settings detected' 'Yellow' + } + } + + # Maximum number of log files to keep. Default is 3. Setting MaxLogFiles to 0 will keep all log files. + $MaxLogFiles = $WAUConfig.WAU_MaxLogFiles + if ($null -eq $MaxLogFiles) + { + [int]$MaxLogFiles = 3 + } + else + { + [int]$MaxLogFiles = $MaxLogFiles + } + + # Maximum size of log file. + $MaxLogSize = $WAUConfig.WAU_MaxLogSize + if (!$MaxLogSize) + { + [long]$MaxLogSize = 1048576 # in bytes, default is 1048576 = 1 MB + } + else + { + [long]$MaxLogSize = $MaxLogSize + } + + #LogRotation if System + $LogRotate = Invoke-LogRotation $LogFile $MaxLogFiles $MaxLogSize + if ($LogRotate -eq $False) + { + Write-ToLog 'An Exception occured during Log Rotation...' + } + + #Run post update actions if necessary if run as System + if (!($WAUConfig.WAU_PostUpdateActions -eq 0)) + { + Invoke-PostUpdateActions + } + #Run Scope Machine funtion if run as System + $SettingsPath = "$Env:windir\system32\config\systemprofile\AppData\Local\Microsoft\WinGet\Settings\defaultState\settings.json" + Add-ScopeMachine $SettingsPath } -else { - Write-ToLog 'Running in User context' +else +{ + Write-ToLog 'Running in User context' } #Get Notif Locale function @@ -74,270 +87,331 @@ $LocaleDisplayName = Get-NotifLocale Write-ToLog "Notification Level: $($WAUConfig.WAU_NotificationLevel). Notification Language: $LocaleDisplayName" 'Cyan' #Check network connectivity -if (Test-Network) { - #Check if Winget is installed and get Winget cmd - $TestWinget = Get-WingetCmd - - if ($TestWinget) { - #Get Current Version - $WAUCurrentVersion = $WAUConfig.DisplayVersion - Write-ToLog "WAU current version: $WAUCurrentVersion" - if ($IsSystem) { - #Check if WAU update feature is enabled or not if run as System - $WAUDisableAutoUpdate = $WAUConfig.WAU_DisableAutoUpdate - #If yes then check WAU update if run as System - if ($WAUDisableAutoUpdate -eq 1) { - Write-ToLog 'WAU AutoUpdate is Disabled.' 'Gray' +if (Test-Network) +{ + #Check if Winget is installed and get Winget cmd + $TestWinget = Get-WingetCmd + + if ($TestWinget) + { + #Get Current Version + $WAUCurrentVersion = $WAUConfig.DisplayVersion + Write-ToLog "WAU current version: $WAUCurrentVersion" + if ($IsSystem) + { + #Check if WAU update feature is enabled or not if run as System + $WAUDisableAutoUpdate = $WAUConfig.WAU_DisableAutoUpdate + #If yes then check WAU update if run as System + if ($WAUDisableAutoUpdate -eq 1) + { + Write-ToLog 'WAU AutoUpdate is Disabled.' 'Gray' + } + else + { + Write-ToLog 'WAU AutoUpdate is Enabled.' 'Green' + #Get Available Version + $Script:WAUAvailableVersion = Get-WAUAvailableVersion + #Compare + if ([version]$WAUAvailableVersion.Replace('-', '.') -ne [version]$WAUCurrentVersion.Replace('-', '.')) + { + #If new version is available, update it + Write-ToLog "WAU Available version: $WAUAvailableVersion" 'Yellow' + Update-WAU } - else { - Write-ToLog 'WAU AutoUpdate is Enabled.' 'Green' - #Get Available Version - $Script:WAUAvailableVersion = Get-WAUAvailableVersion - #Compare - if ([version]$WAUAvailableVersion.Replace('-', '.') -ne [version]$WAUCurrentVersion.Replace('-', '.')) { - #If new version is available, update it - Write-ToLog "WAU Available version: $WAUAvailableVersion" 'Yellow' - Update-WAU - } - else { - Write-ToLog 'WAU is up to date.' 'Green' - } + else + { + Write-ToLog 'WAU is up to date.' 'Green' } - - #Delete previous list_/winget_error (if they exist) if run as System - if (Test-Path -Path "$WorkingDir\logs\error.txt") { - Remove-Item -Path "$WorkingDir\logs\error.txt" -Force + } + + #Delete previous list_/winget_error (if they exist) if run as System + if (Test-Path -Path "$WorkingDir\logs\error.txt") + { + Remove-Item -Path "$WorkingDir\logs\error.txt" -Force + } + + #Get External ListPath if run as System + if ($WAUConfig.WAU_ListPath) + { + $ListPathClean = $($WAUConfig.WAU_ListPath.TrimEnd(' ', '\', '/')) + Write-ToLog "WAU uses External Lists from: $ListPathClean" + if ($ListPathClean -ne 'GPO') + { + $NewList = Test-ListPath $ListPathClean $WAUConfig.WAU_UseWhiteList $WAUConfig.InstallLocation.TrimEnd(' ', '\') + if ($ReachNoPath) + { + Write-ToLog "Couldn't reach/find/compare/copy from $ListPathClean..." 'Red' + if ($ListPathClean -notlike 'http*') + { + if (Test-Path -Path "$ListPathClean" -PathType Leaf) + { + Write-ToLog 'PATH must end with a Directory, not a File...' 'Red' + } + } + else + { + if ($ListPathClean -match '_apps.txt') + { + Write-ToLog 'PATH must end with a Directory, not a File...' 'Red' + } + } + $Script:ReachNoPath = $False + } + if ($NewList) + { + Write-ToLog "Newer List downloaded/copied to local path: $($WAUConfig.InstallLocation.TrimEnd(' ', '\'))" 'Yellow' + } + else + { + if ($WAUConfig.WAU_UseWhiteList -and (Test-Path -Path "$WorkingDir\included_apps.txt")) + { + Write-ToLog 'List (white) is up to date.' 'Green' + } + elseif (!$WAUConfig.WAU_UseWhiteList -and (Test-Path -Path "$WorkingDir\excluded_apps.txt")) + { + Write-ToLog 'List (black) is up to date.' 'Green' + } + else + { + Write-ToLog "Critical: White/Black List doesn't exist, exiting..." 'Red' + New-Item -Path "$WorkingDir\logs\error.txt" -Value "White/Black List doesn't exist" -Force + exit 1 + } + } } - - #Get External ListPath if run as System - if ($WAUConfig.WAU_ListPath) { - $ListPathClean = $($WAUConfig.WAU_ListPath.TrimEnd(' ', '\', '/')) - Write-ToLog "WAU uses External Lists from: $ListPathClean" - if ($ListPathClean -ne 'GPO') { - $NewList = Test-ListPath $ListPathClean $WAUConfig.WAU_UseWhiteList $WAUConfig.InstallLocation.TrimEnd(' ', '\') - if ($ReachNoPath) { - Write-ToLog "Couldn't reach/find/compare/copy from $ListPathClean..." 'Red' - if ($ListPathClean -notlike 'http*') { - if (Test-Path -Path "$ListPathClean" -PathType Leaf) { - Write-ToLog 'PATH must end with a Directory, not a File...' 'Red' - } - } - else { - if ($ListPathClean -match '_apps.txt') { - Write-ToLog 'PATH must end with a Directory, not a File...' 'Red' - } - } - $Script:ReachNoPath = $False - } - if ($NewList) { - Write-ToLog "Newer List downloaded/copied to local path: $($WAUConfig.InstallLocation.TrimEnd(' ', '\'))" 'Yellow' - } - else { - if ($WAUConfig.WAU_UseWhiteList -and (Test-Path -Path "$WorkingDir\included_apps.txt")) { - Write-ToLog 'List (white) is up to date.' 'Green' - } - elseif (!$WAUConfig.WAU_UseWhiteList -and (Test-Path -Path "$WorkingDir\excluded_apps.txt")) { - Write-ToLog 'List (black) is up to date.' 'Green' - } - else { - Write-ToLog "Critical: White/Black List doesn't exist, exiting..." 'Red' - New-Item -Path "$WorkingDir\logs\error.txt" -Value "White/Black List doesn't exist" -Force - Exit 1 - } - } - } + } + + #Get External ModsPath if run as System + if ($WAUConfig.WAU_ModsPath) + { + $ModsPathClean = $($WAUConfig.WAU_ModsPath.TrimEnd(' ', '\', '/')) + Write-ToLog "WAU uses External Mods from: $ModsPathClean" + if ($WAUConfig.WAU_AzureBlobSASURL) + { + $NewMods, $DeletedMods = Test-ModsPath $ModsPathClean $WAUConfig.InstallLocation.TrimEnd(' ', '\') $WAUConfig.WAU_AzureBlobSASURL.TrimEnd(' ') } - - #Get External ModsPath if run as System - if ($WAUConfig.WAU_ModsPath) { - $ModsPathClean = $($WAUConfig.WAU_ModsPath.TrimEnd(' ', '\', '/')) - Write-ToLog "WAU uses External Mods from: $ModsPathClean" - if ($WAUConfig.WAU_AzureBlobSASURL) { - $NewMods, $DeletedMods = Test-ModsPath $ModsPathClean $WAUConfig.InstallLocation.TrimEnd(' ', '\') $WAUConfig.WAU_AzureBlobSASURL.TrimEnd(' ') - } - else { - $NewMods, $DeletedMods = Test-ModsPath $ModsPathClean $WAUConfig.InstallLocation.TrimEnd(' ', '\') - } - if ($ReachNoPath) { - Write-ToLog "Couldn't reach/find/compare/copy from $ModsPathClean..." 'Red' - $Script:ReachNoPath = $False - } - if ($NewMods -gt 0) { - Write-ToLog "$NewMods newer Mods downloaded/copied to local path: $($WAUConfig.InstallLocation.TrimEnd(' ', '\'))\mods" 'Yellow' - } - else { - if (Test-Path -Path "$WorkingDir\mods\*.ps1") { - Write-ToLog 'Mods are up to date.' 'Green' - } - else { - Write-ToLog 'No Mods are implemented...' 'Yellow' - } - } - if ($DeletedMods -gt 0) { - Write-ToLog "$DeletedMods Mods deleted (not externally managed) from local path: $($WAUConfig.InstallLocation.TrimEnd(' ', '\'))\mods" 'Red' - } + else + { + $NewMods, $DeletedMods = Test-ModsPath $ModsPathClean $WAUConfig.InstallLocation.TrimEnd(' ', '\') } - - #Test if _WAU-mods.ps1 exist: Mods for WAU (if Network is active/any Winget is installed/running as SYSTEM) - $Mods = "$WorkingDir\mods" - if (Test-Path -Path "$Mods\_WAU-mods.ps1") { - Write-ToLog 'Running Mods for WAU...' 'Yellow' - & "$Mods\_WAU-mods.ps1" - $ModsExitCode = $LASTEXITCODE - #If _WAU-mods.ps1 has ExitCode 1 - Re-run WAU - if ($ModsExitCode -eq 1) { - Write-ToLog 'Re-run WAU' - Start-Process -FilePath powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"$WorkingDir\winget-upgrade.ps1`"" - Exit - } + if ($ReachNoPath) + { + Write-ToLog "Couldn't reach/find/compare/copy from $ModsPathClean..." 'Red' + $Script:ReachNoPath = $False } - - } - - if ($($WAUConfig.WAU_ListPath) -eq 'GPO') { - $Script:GPOList = $True - } - - #Get White or Black list - if ($WAUConfig.WAU_UseWhiteList -eq 1) { - Write-ToLog 'WAU uses White List config' - $toUpdate = Get-IncludedApps - $UseWhiteList = $true - } - else { - Write-ToLog 'WAU uses Black List config' - $toSkip = Get-ExcludedApps - } - - #Fix and count the array if GPO List as ERROR handling! - if ($GPOList) { - if ($UseWhiteList) { - $WhiteList = $toUpdate.GetUpperBound(0) - if ($null -eq $WhiteList) { - Write-ToLog "Critical: Whitelist doesn't exist in GPO, exiting..." 'Red' - New-Item -Path "$WorkingDir\logs\error.txt" -Value "Whitelist doesn't exist in GPO" -Force - Exit 1 - } - $toUpdate = $toUpdate.Data + if ($NewMods -gt 0) + { + Write-ToLog "$NewMods newer Mods downloaded/copied to local path: $($WAUConfig.InstallLocation.TrimEnd(' ', '\'))\mods" 'Yellow' } - else { - $BlackList = $toSkip.GetUpperBound(0) - if ($null -eq $BlackList) { - Write-ToLog "Critical: Blacklist doesn't exist in GPO, exiting..." 'Red' - New-Item -Path "$WorkingDir\logs\error.txt" -Value "Blacklist doesn't exist in GPO" -Force - Exit 1 - } - $toSkip = $toSkip.Data + else + { + if (Test-Path -Path "$WorkingDir\mods\*.ps1") + { + Write-ToLog 'Mods are up to date.' 'Green' + } + else + { + Write-ToLog 'No Mods are implemented...' 'Yellow' + } } - } - - #Get outdated Winget packages - Write-ToLog 'Checking application updates on Winget Repository...' 'yellow' - $outdated = Get-WingetOutdatedApps - - #If something unusual happened - if ($outdated -like 'An unusual*') { - Write-ToLog "$outdated" 'cyan' - $outdated = $False - } - - #Run only if $outdated is populated! - if ($outdated) { - #Log list of app to update - foreach ($app in $outdated) { - #List available updates - $Log = "-> Available update : $($app.Name). Current version : $($app.Version). Available version : $($app.AvailableVersion)." - $Log | Write-host - $Log | out-file -filepath $LogFile -Append + if ($DeletedMods -gt 0) + { + Write-ToLog "$DeletedMods Mods deleted (not externally managed) from local path: $($WAUConfig.InstallLocation.TrimEnd(' ', '\'))\mods" 'Red' } - - #Count good update installations - $Script:InstallOK = 0 - - #Trick under user context when -BypassListForUsers is used - if ($IsSystem -eq $false -and $WAUConfig.WAU_BypassListForUsers -eq 1) { - Write-ToLog 'Bypass system list in user context is Enabled.' - $UseWhiteList = $false - $toSkip = $null + } + + #Test if _WAU-mods.ps1 exist: Mods for WAU (if Network is active/any Winget is installed/running as SYSTEM) + $Mods = "$WorkingDir\mods" + if (Test-Path -Path "$Mods\_WAU-mods.ps1") + { + Write-ToLog 'Running Mods for WAU...' 'Yellow' + & "$Mods\_WAU-mods.ps1" + $ModsExitCode = $LASTEXITCODE + #If _WAU-mods.ps1 has ExitCode 1 - Re-run WAU + if ($ModsExitCode -eq 1) + { + Write-ToLog 'Re-run WAU' + Start-Process -FilePath powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"$WorkingDir\winget-upgrade.ps1`"" + exit } - - #If White List - if ($UseWhiteList) { - #For each app, notify and update - foreach ($app in $outdated) { - if (($toUpdate -contains $app.Id) -and $($app.Version) -ne 'Unknown') { - Update-App $app - } - #if current app version is unknown - elseif ($($app.Version) -eq 'Unknown') { - Write-ToLog "$($app.Name) : Skipped upgrade because current version is 'Unknown'" 'Gray' - } - #if app is in "excluded list" - else { - Write-ToLog "$($app.Name) : Skipped upgrade because it is not in the included app list" 'Gray' - } - } + } + + } + + if ($($WAUConfig.WAU_ListPath) -eq 'GPO') + { + $Script:GPOList = $True + } + + #Get White or Black list + if ($WAUConfig.WAU_UseWhiteList -eq 1) + { + Write-ToLog 'WAU uses White List config' + $toUpdate = Get-IncludedApps + $UseWhiteList = $true + } + else + { + Write-ToLog 'WAU uses Black List config' + $toSkip = Get-ExcludedApps + } + + #Fix and count the array if GPO List as ERROR handling! + if ($GPOList) + { + if ($UseWhiteList) + { + $WhiteList = $toUpdate.GetUpperBound(0) + if ($null -eq $WhiteList) + { + Write-ToLog "Critical: Whitelist doesn't exist in GPO, exiting..." 'Red' + New-Item -Path "$WorkingDir\logs\error.txt" -Value "Whitelist doesn't exist in GPO" -Force + exit 1 } - #If Black List or default - else { - #For each app, notify and update - foreach ($app in $outdated) { - if (-not ($toSkip -contains $app.Id) -and $($app.Version) -ne 'Unknown') { - Update-App $app - } - #if current app version is unknown - elseif ($($app.Version) -eq 'Unknown') { - Write-ToLog "$($app.Name) : Skipped upgrade because current version is 'Unknown'" 'Gray' - } - #if app is in "excluded list" - else { - Write-ToLog "$($app.Name) : Skipped upgrade because it is in the excluded app list" 'Gray' - } - } + $toUpdate = $toUpdate.Data + } + else + { + $BlackList = $toSkip.GetUpperBound(0) + if ($null -eq $BlackList) + { + Write-ToLog "Critical: Blacklist doesn't exist in GPO, exiting..." 'Red' + New-Item -Path "$WorkingDir\logs\error.txt" -Value "Blacklist doesn't exist in GPO" -Force + exit 1 } - - if ($InstallOK -gt 0) { - Write-ToLog "$InstallOK apps updated ! No more update." 'Green' + $toSkip = $toSkip.Data + } + } + + #Get outdated Winget packages + Write-ToLog 'Checking application updates on Winget Repository...' 'yellow' + $outdated = Get-WingetOutdatedApps + + #If something unusual happened + if ($outdated -like 'An unusual*') + { + Write-ToLog "$outdated" 'cyan' + $outdated = $False + } + + #Run only if $outdated is populated! + if ($outdated) + { + #Log list of app to update + foreach ($app in $outdated) + { + #List available updates + $Log = "-> Available update : $($app.Name). Current version : $($app.Version). Available version : $($app.AvailableVersion)." + $Log | Write-host + $Log | out-file -filepath $LogFile -Append + } + + #Count good update installations + $Script:InstallOK = 0 + + #Trick under user context when -BypassListForUsers is used + if ($IsSystem -eq $false -and $WAUConfig.WAU_BypassListForUsers -eq 1) + { + Write-ToLog 'Bypass system list in user context is Enabled.' + $UseWhiteList = $false + $toSkip = $null + } + + #If White List + if ($UseWhiteList) + { + #For each app, notify and update + foreach ($app in $outdated) + { + if (($toUpdate -contains $app.Id) -and $($app.Version) -ne 'Unknown') + { + Update-App $app + } + #if current app version is unknown + elseif ($($app.Version) -eq 'Unknown') + { + Write-ToLog "$($app.Name) : Skipped upgrade because current version is 'Unknown'" 'Gray' + } + #if app is in "excluded list" + else + { + Write-ToLog "$($app.Name) : Skipped upgrade because it is not in the included app list" 'Gray' + } } - } - - if ($InstallOK -eq 0 -or !$InstallOK) { - Write-ToLog 'No new update.' 'Green' - } - - #Check if any user is logged on if System and run User task (if installed) - if ($IsSystem) { - #User check routine from: https://stackoverflow.com/questions/23219718/powershell-script-to-see-currently-logged-in-users-domain-and-machine-status - $explorerprocesses = @(Get-WmiObject -Query "Select * FROM Win32_Process WHERE Name='explorer.exe'" -ErrorAction SilentlyContinue) - If ($explorerprocesses.Count -eq 0) { - Write-ToLog 'No explorer process found / Nobody interactively logged on...' + } + #If Black List or default + else + { + #For each app, notify and update + foreach ($app in $outdated) + { + if (-not ($toSkip -contains $app.Id) -and $($app.Version) -ne 'Unknown') + { + Update-App $app + } + #if current app version is unknown + elseif ($($app.Version) -eq 'Unknown') + { + Write-ToLog "$($app.Name) : Skipped upgrade because current version is 'Unknown'" 'Gray' + } + #if app is in "excluded list" + else + { + Write-ToLog "$($app.Name) : Skipped upgrade because it is in the excluded app list" 'Gray' + } } - Else { - #Run WAU in user context if the user task exist - $UserScheduledTask = Get-ScheduledTask -TaskName 'Winget-AutoUpdate-UserContext' -ErrorAction SilentlyContinue - if ($UserScheduledTask) { - - #Get Winget system apps to excape them befor running user context - Write-ToLog 'User logged on, get a list of installed Winget apps in System context...' - Get-WingetSystemApps - - #Run user context scheduled task - Write-ToLog 'Starting WAU in User context' - Start-ScheduledTask -TaskName $UserScheduledTask.TaskName -ErrorAction SilentlyContinue - Exit 0 - } - elseif (!$UserScheduledTask) { - Write-ToLog 'User context execution not installed...' - } + } + + if ($InstallOK -gt 0) + { + Write-ToLog "$InstallOK apps updated ! No more update." 'Green' + } + } + + if ($InstallOK -eq 0 -or !$InstallOK) + { + Write-ToLog 'No new update.' 'Green' + } + + #Check if any user is logged on if System and run User task (if installed) + if ($IsSystem) + { + #User check routine from: https://stackoverflow.com/questions/23219718/powershell-script-to-see-currently-logged-in-users-domain-and-machine-status + $explorerprocesses = @(Get-WmiObject -Query "Select * FROM Win32_Process WHERE Name='explorer.exe'" -ErrorAction SilentlyContinue) + if ($explorerprocesses.Count -eq 0) + { + Write-ToLog 'No explorer process found / Nobody interactively logged on...' + } + else + { + #Run WAU in user context if the user task exist + $UserScheduledTask = Get-ScheduledTask -TaskName 'Winget-AutoUpdate-UserContext' -ErrorAction SilentlyContinue + if ($UserScheduledTask) + { + + #Get Winget system apps to excape them befor running user context + Write-ToLog 'User logged on, get a list of installed Winget apps in System context...' + Get-WingetSystemApps + + #Run user context scheduled task + Write-ToLog 'Starting WAU in User context' + Start-ScheduledTask -TaskName $UserScheduledTask.TaskName -ErrorAction SilentlyContinue + exit 0 } - } - } - else { - Write-ToLog 'Critical: Winget not installed or detected, exiting...' 'red' - New-Item -Path "$WorkingDir\logs\error.txt" -Value 'Winget not installed or detected' -Force - Write-ToLog 'End of process!' 'Cyan' - Exit 1 - } + elseif (!$UserScheduledTask) + { + Write-ToLog 'User context execution not installed...' + } + } + } + } + else + { + Write-ToLog 'Critical: Winget not installed or detected, exiting...' 'red' + New-Item -Path "$WorkingDir\logs\error.txt" -Value 'Winget not installed or detected' -Force + Write-ToLog 'End of process!' 'Cyan' + exit 1 + } } #End diff --git a/Winget-AutoUpdate/functions/Add-ScopeMachine.ps1 b/Winget-AutoUpdate/functions/Add-ScopeMachine.ps1 index 5ff4832..631c7c2 100644 --- a/Winget-AutoUpdate/functions/Add-ScopeMachine.ps1 +++ b/Winget-AutoUpdate/functions/Add-ScopeMachine.ps1 @@ -1,38 +1,40 @@ # Function to configure the prefered scope option as Machine -function Add-ScopeMachine +function Add-ScopeMachine { [CmdletBinding()] param ( - [string]$SettingsPath + [string] + $SettingsPath ) - if (Test-Path -Path $SettingsPath -ErrorAction SilentlyContinue) + if (Test-Path -Path $SettingsPath -ErrorAction SilentlyContinue) { $ConfigFile = (Get-Content -Path $SettingsPath -ErrorAction SilentlyContinue | Where-Object -FilterScript { ($_ -notmatch '//') - } | ConvertFrom-Json) + } | ConvertFrom-Json) } - - if (!$ConfigFile) + + if (!$ConfigFile) { - $ConfigFile = @{} + $ConfigFile = @{ + } } - - if ($ConfigFile.installBehavior.preferences.scope) + + if ($ConfigFile.installBehavior.preferences.scope) { $ConfigFile.installBehavior.preferences.scope = 'Machine' } - else + else { $Scope = (New-Object -TypeName PSObject -Property $(@{ scope = 'Machine' - })) + })) $Preference = (New-Object -TypeName PSObject -Property $(@{ preferences = $Scope - })) + })) $null = (Add-Member -InputObject $ConfigFile -MemberType NoteProperty -Name 'installBehavior' -Value $Preference -Force) } - + $null = ($ConfigFile | ConvertTo-Json | Out-File -FilePath $SettingsPath -Encoding utf8 -Force -Confirm:$false) } diff --git a/Winget-AutoUpdate/functions/Add-Shortcut.ps1 b/Winget-AutoUpdate/functions/Add-Shortcut.ps1 index e050281..75d70c7 100644 --- a/Winget-AutoUpdate/functions/Add-Shortcut.ps1 +++ b/Winget-AutoUpdate/functions/Add-Shortcut.ps1 @@ -1,16 +1,21 @@ # Function to create shortcuts -function Add-Shortcut -{ +function Add-Shortcut +{ [CmdletBinding()] param ( - [string]$Target, - [string]$Shortcut, - [string]$Arguments, - [string]$Icon, - [string]$Description + [string] + $Target, + [string] + $Shortcut, + [string] + $Arguments, + [string] + $Icon, + [string] + $Description ) - + $WScriptShell = (New-Object -ComObject WScript.Shell) $Shortcut = $WScriptShell.CreateShortcut($Shortcut) $Shortcut.TargetPath = $Target diff --git a/Winget-AutoUpdate/functions/Confirm-Installation.ps1 b/Winget-AutoUpdate/functions/Confirm-Installation.ps1 index c676e26..7dba44b 100644 --- a/Winget-AutoUpdate/functions/Confirm-Installation.ps1 +++ b/Winget-AutoUpdate/functions/Confirm-Installation.ps1 @@ -1,33 +1,35 @@ -Function Confirm-Installation +function Confirm-Installation { # Set json export file [CmdletBinding()] param ( - [string]$AppName, - [string]$AppVer + [string] + $AppName, + [string] + $AppVer ) - + $JsonFile = ('{0}\Config\InstalledApps.json' -f $WorkingDir) - + # Get installed apps and version in json file $null = (& $Winget export -s winget -o $JsonFile --include-versions) - + # Get json content $Json = (Get-Content -Path $JsonFile -Raw | ConvertFrom-Json) - + # Get apps and version in hashtable $Packages = $Json.Sources.Packages - + # Remove json file $null = (Remove-Item -Path $JsonFile -Force -Confirm:$false -ErrorAction SilentlyContinue) - + # Search for specific app and version $Apps = $Packages | Where-Object -FilterScript { ($_.PackageIdentifier -eq $AppName -and $_.Version -like ('{0}*' -f $AppVer)) } - + if ($Apps) { return $true diff --git a/Winget-AutoUpdate/functions/Get-AZCopy.ps1 b/Winget-AutoUpdate/functions/Get-AZCopy.ps1 index b8da39a..1e52207 100644 --- a/Winget-AutoUpdate/functions/Get-AZCopy.ps1 +++ b/Winget-AutoUpdate/functions/Get-AZCopy.ps1 @@ -1,58 +1,59 @@ # Function to get AZCopy, if it doesn't exist and update it, if it does -Function Get-AZCopy +function Get-AZCopy { [CmdletBinding()] param ( - [string]$WingetUpdatePath + [string] + $WingetUpdatePath ) - + $AZCopyLink = (Invoke-WebRequest -Uri https://aka.ms/downloadazcopy-v10-windows -UseBasicParsing -MaximumRedirection 0 -ErrorAction SilentlyContinue).headers.location $AZCopyVersionRegex = [regex]::new('(\d+\.\d+\.\d+)') $AZCopyLatestVersion = $AZCopyVersionRegex.Match($AZCopyLink).Value - - if ($null -eq $AZCopyLatestVersion -or '' -eq $AZCopyLatestVersion) + + if ($null -eq $AZCopyLatestVersion -or '' -eq $AZCopyLatestVersion) { $AZCopyLatestVersion = '0.0.0' } - - if (Test-Path -Path ('{0}\azcopy.exe' -f $WingetUpdatePath) -PathType Leaf -ErrorAction SilentlyContinue) + + if (Test-Path -Path ('{0}\azcopy.exe' -f $WingetUpdatePath) -PathType Leaf -ErrorAction SilentlyContinue) { $AZCopyCurrentVersion = & "$WingetUpdatePath\azcopy.exe" -v $AZCopyCurrentVersion = $AZCopyVersionRegex.Match($AZCopyCurrentVersion).Value - Write-ToLog -LogMsg ('AZCopy version {0} found' -f $AZCopyCurrentVersion) + Write-ToLog -LogMsg ('AZCopy version {0} found' -f $AZCopyCurrentVersion) } - else + else { - Write-ToLog -LogMsg 'AZCopy not already installed' + Write-ToLog -LogMsg 'AZCopy not already installed' $AZCopyCurrentVersion = '0.0.0' } - - if (([version] $AZCopyCurrentVersion) -lt ([version] $AZCopyLatestVersion)) + + if (([version]$AZCopyCurrentVersion) -lt ([version]$AZCopyLatestVersion)) { - Write-ToLog -LogMsg ('Installing version {0} of AZCopy' -f $AZCopyLatestVersion) + Write-ToLog -LogMsg ('Installing version {0} of AZCopy' -f $AZCopyLatestVersion) $null = (Invoke-WebRequest -Uri $AZCopyLink -UseBasicParsing -OutFile ('{0}\azcopyv10.zip' -f $WingetUpdatePath)) - Write-ToLog -LogMsg 'Extracting AZCopy zip file' + Write-ToLog -LogMsg 'Extracting AZCopy zip file' $null = (Expand-Archive -Path ('{0}\azcopyv10.zip' -f $WingetUpdatePath) -DestinationPath $WingetUpdatePath -Force -Confirm:$false) $AZCopyPathSearch = (Resolve-Path -Path ('{0}\azcopy_*' -f $WingetUpdatePath)) - - if ($AZCopyPathSearch -is [array]) + + if ($AZCopyPathSearch -is [array]) { $AZCopyEXEPath = $AZCopyPathSearch[$AZCopyPathSearch.Length - 1] } - else + else { $AZCopyEXEPath = $AZCopyPathSearch } - - Write-ToLog -LogMsg "Copying 'azcopy.exe' to main folder" + + Write-ToLog -LogMsg "Copying 'azcopy.exe' to main folder" $null = (Copy-Item -Path ('{0}\azcopy.exe' -f $AZCopyEXEPath) -Destination ('{0}\' -f $WingetUpdatePath) -Force -Confirm:$false) - Write-ToLog -LogMsg 'Removing temporary AZCopy files' + Write-ToLog -LogMsg 'Removing temporary AZCopy files' $null = (Remove-Item -Path $AZCopyEXEPath -Recurse -Force -Confirm:$false) $null = (Remove-Item -Path ('{0}\azcopyv10.zip' -f $WingetUpdatePath) -Force -Confirm:$false) $AZCopyCurrentVersion = & "$WingetUpdatePath\azcopy.exe" -v $AZCopyCurrentVersion = $AZCopyVersionRegex.Match($AZCopyCurrentVersion).Value - Write-ToLog -LogMsg ('AZCopy version {0} installed' -f $AZCopyCurrentVersion) + Write-ToLog -LogMsg ('AZCopy version {0} installed' -f $AZCopyCurrentVersion) } } diff --git a/Winget-AutoUpdate/functions/Get-AppInfo.ps1 b/Winget-AutoUpdate/functions/Get-AppInfo.ps1 index e6b32fd..5038504 100644 --- a/Winget-AutoUpdate/functions/Get-AppInfo.ps1 +++ b/Winget-AutoUpdate/functions/Get-AppInfo.ps1 @@ -1,18 +1,19 @@ # Get the winget App Information -Function Get-AppInfo +function Get-AppInfo { # Get AppID Info [CmdletBinding()] param ( - [string]$AppID + [string] + $AppID ) - + $String = (& $winget show $AppID --accept-source-agreements -s winget | Out-String) # Search for Release Note info $ReleaseNote = [regex]::match($String, '(?<=Release Notes Url: )(.*)(?=\n)').Groups[0].Value - + # Return Release Note return $ReleaseNote } diff --git a/Winget-AutoUpdate/functions/Get-ExcludedApps.ps1 b/Winget-AutoUpdate/functions/Get-ExcludedApps.ps1 index 63f42b8..da1d326 100644 --- a/Winget-AutoUpdate/functions/Get-ExcludedApps.ps1 +++ b/Winget-AutoUpdate/functions/Get-ExcludedApps.ps1 @@ -1,16 +1,16 @@ #Function to get the Block List apps -function Get-ExcludedApps +function Get-ExcludedApps { - if ($GPOList) + if ($GPOList) { - if (Test-Path -Path 'HKLM:\SOFTWARE\Policies\Romanitho\Winget-AutoUpdate\BlackList' -ErrorAction SilentlyContinue) + if (Test-Path -Path 'HKLM:\SOFTWARE\Policies\Romanitho\Winget-AutoUpdate\BlackList' -ErrorAction SilentlyContinue) { $Key = 'HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Romanitho\Winget-AutoUpdate\BlackList\' - + $ValueNames = (Get-Item -Path 'HKLM:\SOFTWARE\Policies\Romanitho\Winget-AutoUpdate\BlackList').Property - - foreach ($ValueName in $ValueNames) + + foreach ($ValueName in $ValueNames) { $AppIDs = [Microsoft.Win32.Registry]::GetValue($Key, $ValueName, $false) [PSCustomObject]@{ @@ -19,13 +19,13 @@ function Get-ExcludedApps } } } - + return $AppIDs } - elseif (Test-Path -Path ('{0}\excluded_apps.txt' -f $WorkingDir) -ErrorAction SilentlyContinue) + elseif (Test-Path -Path ('{0}\excluded_apps.txt' -f $WorkingDir) -ErrorAction SilentlyContinue) { return (Get-Content -Path ('{0}\excluded_apps.txt' -f $WorkingDir)).Trim() | Where-Object -FilterScript { - $_.length -gt 0 + $_.length -gt 0 } } } diff --git a/Winget-AutoUpdate/functions/Get-IncludedApps.ps1 b/Winget-AutoUpdate/functions/Get-IncludedApps.ps1 index 09e9d79..b5d2c7f 100644 --- a/Winget-AutoUpdate/functions/Get-IncludedApps.ps1 +++ b/Winget-AutoUpdate/functions/Get-IncludedApps.ps1 @@ -1,15 +1,15 @@ # Function to get the allow List apps -function Get-IncludedApps +function Get-IncludedApps { - if ($GPOList) + if ($GPOList) { - if (Test-Path -Path 'HKLM:\SOFTWARE\Policies\Romanitho\Winget-AutoUpdate\WhiteList' -ErrorAction SilentlyContinue) + if (Test-Path -Path 'HKLM:\SOFTWARE\Policies\Romanitho\Winget-AutoUpdate\WhiteList' -ErrorAction SilentlyContinue) { $Key = 'HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Romanitho\Winget-AutoUpdate\WhiteList\' $ValueNames = (Get-Item -Path 'HKLM:\SOFTWARE\Policies\Romanitho\Winget-AutoUpdate\WhiteList').Property - - foreach ($ValueName in $ValueNames) + + foreach ($ValueName in $ValueNames) { $AppIDs = [Microsoft.Win32.Registry]::GetValue($Key, $ValueName, $false) [PSCustomObject]@{ @@ -18,13 +18,13 @@ function Get-IncludedApps } } } - + return $AppIDs } - elseif (Test-Path -Path ('{0}\included_apps.txt' -f $WorkingDir) -ErrorAction SilentlyContinue) + elseif (Test-Path -Path ('{0}\included_apps.txt' -f $WorkingDir) -ErrorAction SilentlyContinue) { return (Get-Content -Path ('{0}\included_apps.txt' -f $WorkingDir)).Trim() | Where-Object -FilterScript { - $_.length -gt 0 + $_.length -gt 0 } } } diff --git a/Winget-AutoUpdate/functions/Get-NotifLocale.ps1 b/Winget-AutoUpdate/functions/Get-NotifLocale.ps1 index 63254bd..4704a9e 100644 --- a/Winget-AutoUpdate/functions/Get-NotifLocale.ps1 +++ b/Winget-AutoUpdate/functions/Get-NotifLocale.ps1 @@ -1,28 +1,31 @@ #Function to get the locale file for notifications -Function Get-NotifLocale { - - # Get OS locale - $OSLocale = (Get-UICulture).Parent - - # Test if OS locale notif file exists - $TestOSLocalPath = ('{0}\locale\{1}.xml' -f $WorkingDir, $OSLocale.Name) - - # Set OS Local if file exists - if (Test-Path -Path $TestOSLocalPath -ErrorAction SilentlyContinue) { - $LocaleDisplayName = $OSLocale.DisplayName - $LocaleFile = $TestOSLocalPath - } - else { - # Set English if file doesn't exist - $LocaleDisplayName = 'English' - $LocaleFile = ('{0}\locale\en.xml' -f $WorkingDir) - } - - # Get locale XML file content - [xml]$Script:NotifLocale = (Get-Content -Path $LocaleFile -Encoding UTF8 -ErrorAction SilentlyContinue) - - # Rerturn langague display name - Return $LocaleDisplayName - +function Get-NotifLocale +{ + + # Get OS locale + $OSLocale = (Get-UICulture).Parent + + # Test if OS locale notif file exists + $TestOSLocalPath = ('{0}\locale\{1}.xml' -f $WorkingDir, $OSLocale.Name) + + # Set OS Local if file exists + if (Test-Path -Path $TestOSLocalPath -ErrorAction SilentlyContinue) + { + $LocaleDisplayName = $OSLocale.DisplayName + $LocaleFile = $TestOSLocalPath + } + else + { + # Set English if file doesn't exist + $LocaleDisplayName = 'English' + $LocaleFile = ('{0}\locale\en.xml' -f $WorkingDir) + } + + # Get locale XML file content + [xml]$Script:NotifLocale = (Get-Content -Path $LocaleFile -Encoding UTF8 -ErrorAction SilentlyContinue) + + # Rerturn langague display name + return $LocaleDisplayName + } diff --git a/Winget-AutoUpdate/functions/Get-Policies.ps1 b/Winget-AutoUpdate/functions/Get-Policies.ps1 index ab71cd1..98eb539 100644 --- a/Winget-AutoUpdate/functions/Get-Policies.ps1 +++ b/Winget-AutoUpdate/functions/Get-Policies.ps1 @@ -1,116 +1,116 @@ # Function to get the Domain/Local Policies (GPO) -Function Get-Policies +function Get-Policies { # Get WAU Policies and set the Configurations Registry Accordingly $WAUPolicies = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Romanitho\Winget-AutoUpdate' -ErrorAction SilentlyContinue) - - if ($WAUPolicies) + + if ($WAUPolicies) { - if ($($WAUPolicies.WAU_ActivateGPOManagement -eq 1)) + if ($($WAUPolicies.WAU_ActivateGPOManagement -eq 1)) { $ChangedSettings = 0 $regPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate' - - if ($null -ne $($WAUPolicies.WAU_BypassListForUsers) -and ($($WAUPolicies.WAU_BypassListForUsers) -ne $($WAUConfig.WAU_BypassListForUsers))) + + if ($null -ne $($WAUPolicies.WAU_BypassListForUsers) -and ($($WAUPolicies.WAU_BypassListForUsers) -ne $($WAUConfig.WAU_BypassListForUsers))) { $null = (New-ItemProperty -Path $regPath -Name WAU_BypassListForUsers -Value $($WAUPolicies.WAU_BypassListForUsers) -PropertyType DWord -Force -Confirm:$false) $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_BypassListForUsers) -and ($($WAUConfig.WAU_BypassListForUsers) -or $($WAUConfig.WAU_BypassListForUsers) -eq 0)) + elseif ($null -eq $($WAUPolicies.WAU_BypassListForUsers) -and ($($WAUConfig.WAU_BypassListForUsers) -or $($WAUConfig.WAU_BypassListForUsers) -eq 0)) { $null = (Remove-ItemProperty -Path $regPath -Name WAU_BypassListForUsers -Force -ErrorAction SilentlyContinue -Confirm:$false) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_DisableAutoUpdate) -and ($($WAUPolicies.WAU_DisableAutoUpdate) -ne $($WAUConfig.WAU_DisableAutoUpdate))) + + if ($null -ne $($WAUPolicies.WAU_DisableAutoUpdate) -and ($($WAUPolicies.WAU_DisableAutoUpdate) -ne $($WAUConfig.WAU_DisableAutoUpdate))) { $null = (New-ItemProperty -Path $regPath -Name WAU_DisableAutoUpdate -Value $($WAUPolicies.WAU_DisableAutoUpdate) -PropertyType DWord -Force -Confirm:$false) $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_DisableAutoUpdate) -and ($($WAUConfig.WAU_DisableAutoUpdate) -or $($WAUConfig.WAU_DisableAutoUpdate) -eq 0)) + elseif ($null -eq $($WAUPolicies.WAU_DisableAutoUpdate) -and ($($WAUConfig.WAU_DisableAutoUpdate) -or $($WAUConfig.WAU_DisableAutoUpdate) -eq 0)) { $null = (Remove-ItemProperty -Path $regPath -Name WAU_DisableAutoUpdate -Force -ErrorAction SilentlyContinue -Confirm:$false) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_DoNotRunOnMetered) -and ($($WAUPolicies.WAU_DoNotRunOnMetered) -ne $($WAUConfig.WAU_DoNotRunOnMetered))) + + if ($null -ne $($WAUPolicies.WAU_DoNotRunOnMetered) -and ($($WAUPolicies.WAU_DoNotRunOnMetered) -ne $($WAUConfig.WAU_DoNotRunOnMetered))) { $null = (New-ItemProperty -Path $regPath -Name WAU_DoNotRunOnMetered -Value $($WAUPolicies.WAU_DoNotRunOnMetered) -PropertyType DWord -Force -Confirm:$false) $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_DoNotRunOnMetered) -and !$($WAUConfig.WAU_DoNotRunOnMetered)) + elseif ($null -eq $($WAUPolicies.WAU_DoNotRunOnMetered) -and !$($WAUConfig.WAU_DoNotRunOnMetered)) { $null = (New-ItemProperty -Path $regPath -Name WAU_DoNotRunOnMetered -Value 1 -PropertyType DWord -Force -Confirm:$false) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_UpdatePrerelease) -and ($($WAUPolicies.WAU_UpdatePrerelease) -ne $($WAUConfig.WAU_UpdatePrerelease))) + + if ($null -ne $($WAUPolicies.WAU_UpdatePrerelease) -and ($($WAUPolicies.WAU_UpdatePrerelease) -ne $($WAUConfig.WAU_UpdatePrerelease))) { $null = (New-ItemProperty -Path $regPath -Name WAU_UpdatePrerelease -Value $($WAUPolicies.WAU_UpdatePrerelease) -PropertyType DWord -Force -Confirm:$false) $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_UpdatePrerelease) -and $($WAUConfig.WAU_UpdatePrerelease)) + elseif ($null -eq $($WAUPolicies.WAU_UpdatePrerelease) -and $($WAUConfig.WAU_UpdatePrerelease)) { $null = (New-ItemProperty -Path $regPath -Name WAU_UpdatePrerelease -Value 0 -PropertyType DWord -Force -Confirm:$false) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_UseWhiteList) -and ($($WAUPolicies.WAU_UseWhiteList) -ne $($WAUConfig.WAU_UseWhiteList))) + + if ($null -ne $($WAUPolicies.WAU_UseWhiteList) -and ($($WAUPolicies.WAU_UseWhiteList) -ne $($WAUConfig.WAU_UseWhiteList))) { $null = (New-ItemProperty -Path $regPath -Name WAU_UseWhiteList -Value $($WAUPolicies.WAU_UseWhiteList) -PropertyType DWord -Force -Confirm:$false) $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_UseWhiteList) -and ($($WAUConfig.WAU_UseWhiteList) -or $($WAUConfig.WAU_UseWhiteList) -eq 0)) + elseif ($null -eq $($WAUPolicies.WAU_UseWhiteList) -and ($($WAUConfig.WAU_UseWhiteList) -or $($WAUConfig.WAU_UseWhiteList) -eq 0)) { $null = (Remove-ItemProperty -Path $regPath -Name WAU_UseWhiteList -Force -ErrorAction SilentlyContinue -Confirm:$false) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_ListPath) -and ($($WAUPolicies.WAU_ListPath) -ne $($WAUConfig.WAU_ListPath))) + + if ($null -ne $($WAUPolicies.WAU_ListPath) -and ($($WAUPolicies.WAU_ListPath) -ne $($WAUConfig.WAU_ListPath))) { $null = (New-ItemProperty -Path $regPath -Name WAU_ListPath -Value $($WAUPolicies.WAU_ListPath.TrimEnd(' ', '\', '/')) -Force -Confirm:$false) $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_ListPath) -and $($WAUConfig.WAU_ListPath)) + elseif ($null -eq $($WAUPolicies.WAU_ListPath) -and $($WAUConfig.WAU_ListPath)) { $null = (Remove-ItemProperty -Path $regPath -Name WAU_ListPath -Force -ErrorAction SilentlyContinue -Confirm:$false) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_ModsPath) -and ($($WAUPolicies.WAU_ModsPath) -ne $($WAUConfig.WAU_ModsPath))) + + if ($null -ne $($WAUPolicies.WAU_ModsPath) -and ($($WAUPolicies.WAU_ModsPath) -ne $($WAUConfig.WAU_ModsPath))) { $null = (New-ItemProperty -Path $regPath -Name WAU_ModsPath -Value $($WAUPolicies.WAU_ModsPath.TrimEnd(' ', '\', '/')) -Force -Confirm:$false) $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_ModsPath) -and $($WAUConfig.WAU_ModsPath)) + elseif ($null -eq $($WAUPolicies.WAU_ModsPath) -and $($WAUConfig.WAU_ModsPath)) { $null = (Remove-ItemProperty -Path $regPath -Name WAU_ModsPath -Force -ErrorAction SilentlyContinue -Confirm:$false) $ChangedSettings++ } - if ($null -ne $($WAUPolicies.WAU_AzureBlobSASURL) -and ($($WAUPolicies.WAU_AzureBlobSASURL) -ne $($WAUConfig.WAU_AzureBlobSASURL))) + if ($null -ne $($WAUPolicies.WAU_AzureBlobSASURL) -and ($($WAUPolicies.WAU_AzureBlobSASURL) -ne $($WAUConfig.WAU_AzureBlobSASURL))) { $null = (New-ItemProperty -Path $regPath -Name WAU_AzureBlobSASURL -Value $($WAUPolicies.WAU_AzureBlobSASURL.TrimEnd(' ', '\', '/')) -Force -Confirm:$false) $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_AzureBlobSASURL) -and $($WAUConfig.WAU_AzureBlobSASURL)) + elseif ($null -eq $($WAUPolicies.WAU_AzureBlobSASURL) -and $($WAUConfig.WAU_AzureBlobSASURL)) { $null = (Remove-ItemProperty -Path $regPath -Name WAU_AzureBlobSASURL -Force -ErrorAction SilentlyContinue -Confirm:$false) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_NotificationLevel) -and ($($WAUPolicies.WAU_NotificationLevel) -ne $($WAUConfig.WAU_NotificationLevel))) + + if ($null -ne $($WAUPolicies.WAU_NotificationLevel) -and ($($WAUPolicies.WAU_NotificationLevel) -ne $($WAUConfig.WAU_NotificationLevel))) { $null = (New-ItemProperty -Path $regPath -Name WAU_NotificationLevel -Value $($WAUPolicies.WAU_NotificationLevel) -Force -Confirm:$false) $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_NotificationLevel) -and $($WAUConfig.WAU_NotificationLevel) -ne 'Full') + elseif ($null -eq $($WAUPolicies.WAU_NotificationLevel) -and $($WAUConfig.WAU_NotificationLevel) -ne 'Full') { $null = (New-ItemProperty -Path $regPath -Name WAU_NotificationLevel -Value 'Full' -Force -Confirm:$false) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_UpdatesAtTime) -and ($($WAUPolicies.WAU_UpdatesAtTime) -ne $($WAUConfig.WAU_UpdatesAtTime))) + + if ($null -ne $($WAUPolicies.WAU_UpdatesAtTime) -and ($($WAUPolicies.WAU_UpdatesAtTime) -ne $($WAUConfig.WAU_UpdatesAtTime))) { $null = (New-ItemProperty -Path $regPath -Name WAU_UpdatesAtTime -Value $($WAUPolicies.WAU_UpdatesAtTime) -Force -Confirm:$false) $Script:WAUConfig = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate') @@ -119,10 +119,10 @@ Function Get-Policies $folder = $service.GetFolder('\') $task = $folder.GetTask('Winget-AutoUpdate') $definition = $task.Definition - - for ($triggerId = 1; $triggerId -le $definition.Triggers.Count; $triggerId++) + + for ($triggerId = 1; $triggerId -le $definition.Triggers.Count; $triggerId++) { - if (($definition.Triggers.Item($triggerId).Type -eq '2') -or ($definition.Triggers.Item($triggerId).Type -eq '3')) + if (($definition.Triggers.Item($triggerId).Type -eq '2') -or ($definition.Triggers.Item($triggerId).Type -eq '3')) { $PreStartBoundary = ($definition.Triggers.Item($triggerId).StartBoundary).Substring(0, 11) $PostStartBoundary = ($definition.Triggers.Item($triggerId).StartBoundary).Substring(19, 6) @@ -134,7 +134,7 @@ Function Get-Policies $null = $folder.RegisterTaskDefinition($task.Name, $definition, 4, $null, $null, $null) $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_UpdatesAtTime) -and $($WAUConfig.WAU_UpdatesAtTime) -ne '06:00:00') + elseif ($null -eq $($WAUPolicies.WAU_UpdatesAtTime) -and $($WAUConfig.WAU_UpdatesAtTime) -ne '06:00:00') { $null = (New-ItemProperty -Path $regPath -Name WAU_UpdatesAtTime -Value '06:00:00' -Force -Confirm:$false) $Script:WAUConfig = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate' @@ -143,10 +143,10 @@ Function Get-Policies $folder = $service.GetFolder('\') $task = $folder.GetTask('Winget-AutoUpdate') $definition = $task.Definition - - for ($triggerId = 1; $triggerId -le $definition.Triggers.Count; $triggerId++) + + for ($triggerId = 1; $triggerId -le $definition.Triggers.Count; $triggerId++) { - if (($definition.Triggers.Item($triggerId).Type -eq '2') -or ($definition.Triggers.Item($triggerId).Type -eq '3')) + if (($definition.Triggers.Item($triggerId).Type -eq '2') -or ($definition.Triggers.Item($triggerId).Type -eq '3')) { $PreStartBoundary = ($definition.Triggers.Item($triggerId).StartBoundary).Substring(0, 11) $PostStartBoundary = ($definition.Triggers.Item($triggerId).StartBoundary).Substring(19, 6) @@ -155,12 +155,12 @@ Function Get-Policies break } } - + $null = $folder.RegisterTaskDefinition($task.Name, $definition, 4, $null, $null, $null) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_UpdatesInterval) -and ($($WAUPolicies.WAU_UpdatesInterval) -ne $($WAUConfig.WAU_UpdatesInterval))) + + if ($null -ne $($WAUPolicies.WAU_UpdatesInterval) -and ($($WAUPolicies.WAU_UpdatesInterval) -ne $($WAUConfig.WAU_UpdatesInterval))) { $null = (New-ItemProperty -Path $regPath -Name WAU_UpdatesInterval -Value $($WAUPolicies.WAU_UpdatesInterval) -Force -Confirm:$false) $service = (New-Object -ComObject Schedule.Service) @@ -168,26 +168,26 @@ Function Get-Policies $folder = $service.GetFolder('\') $task = $folder.GetTask('Winget-AutoUpdate') $definition = $task.Definition - - for ($triggerId = 1; $triggerId -le $definition.Triggers.Count; $triggerId++) + + for ($triggerId = 1; $triggerId -le $definition.Triggers.Count; $triggerId++) { - if (($definition.Triggers.Item($triggerId).Type -eq '2') -or ($definition.Triggers.Item($triggerId).Type -eq '3')) + if (($definition.Triggers.Item($triggerId).Type -eq '2') -or ($definition.Triggers.Item($triggerId).Type -eq '3')) { $UpdatesAtTime = ($definition.Triggers.Item($triggerId).StartBoundary).Substring(11, 8) $definition.Triggers.Remove($triggerId) $triggerId -= 1 } } - + $null = $folder.RegisterTaskDefinition($task.Name, $definition, 4, $null, $null, $null) - - if (!$($WAUConfig.WAU_UpdatesAtTime)) + + if (!$($WAUConfig.WAU_UpdatesAtTime)) { $null = (New-ItemProperty -Path $regPath -Name WAU_UpdatesAtTime -Value $UpdatesAtTime -Force -Confirm:$false) $Script:WAUConfig = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate') } - - if ($($WAUPolicies.WAU_UpdatesInterval) -ne 'Never') + + if ($($WAUPolicies.WAU_UpdatesInterval) -ne 'Never') { #Count Triggers (correctly) $service = (New-Object -ComObject Schedule.Service) @@ -196,48 +196,49 @@ Function Get-Policies $task = $folder.GetTask('Winget-AutoUpdate') $definition = $task.Definition $null = $definition.Triggers.Count - switch ($($WAUPolicies.WAU_UpdatesInterval)) { - 'Daily' + switch ($($WAUPolicies.WAU_UpdatesInterval)) + { + 'Daily' { $tasktrigger = New-ScheduledTaskTrigger -Daily -At $($WAUConfig.WAU_UpdatesAtTime) break } - 'BiDaily' + 'BiDaily' { $tasktrigger = New-ScheduledTaskTrigger -Daily -At $($WAUConfig.WAU_UpdatesAtTime) -DaysInterval 2 break } - 'Weekly' + 'Weekly' { $tasktrigger = New-ScheduledTaskTrigger -Weekly -At $($WAUConfig.WAU_UpdatesAtTime) -DaysOfWeek 2 break } - 'BiWeekly' + 'BiWeekly' { $tasktrigger = New-ScheduledTaskTrigger -Weekly -At $($WAUConfig.WAU_UpdatesAtTime) -DaysOfWeek 2 -WeeksInterval 2 break } - 'Monthly' + 'Monthly' { $tasktrigger = New-ScheduledTaskTrigger -Weekly -At $($WAUConfig.WAU_UpdatesAtTime) -DaysOfWeek 2 -WeeksInterval 4 break } } - if ($definition.Triggers.Count -gt 0) + if ($definition.Triggers.Count -gt 0) { $triggers = @() $triggers += (Get-ScheduledTask -TaskName 'Winget-AutoUpdate').Triggers $triggers += $tasktrigger $null = (Set-ScheduledTask -TaskName 'Winget-AutoUpdate' -Trigger $triggers) } - else + else { $null = (Set-ScheduledTask -TaskName 'Winget-AutoUpdate' -Trigger $tasktrigger) } } $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_UpdatesInterval) -and $($WAUConfig.WAU_UpdatesInterval) -ne 'Daily') + elseif ($null -eq $($WAUPolicies.WAU_UpdatesInterval) -and $($WAUConfig.WAU_UpdatesInterval) -ne 'Daily') { $null = (New-ItemProperty -Path $regPath -Name WAU_UpdatesInterval -Value 'Daily' -Force -Confirm:$false) $service = (New-Object -ComObject Schedule.Service) @@ -245,27 +246,27 @@ Function Get-Policies $folder = $service.GetFolder('\') $task = $folder.GetTask('Winget-AutoUpdate') $definition = $task.Definition - - for ($triggerId = 1; $triggerId -le $definition.Triggers.Count; $triggerId++) + + for ($triggerId = 1; $triggerId -le $definition.Triggers.Count; $triggerId++) { - if (($definition.Triggers.Item($triggerId).Type -eq '2') -or ($definition.Triggers.Item($triggerId).Type -eq '3')) + if (($definition.Triggers.Item($triggerId).Type -eq '2') -or ($definition.Triggers.Item($triggerId).Type -eq '3')) { $UpdatesAtTime = ($definition.Triggers.Item($triggerId).StartBoundary).Substring(11, 8) $definition.Triggers.Remove($triggerId) $triggerId -= 1 } } - + $null = $folder.RegisterTaskDefinition($task.Name, $definition, 4, $null, $null, $null) - - if (!$($WAUConfig.WAU_UpdatesAtTime)) + + if (!$($WAUConfig.WAU_UpdatesAtTime)) { $null = (New-ItemProperty -Path $regPath -Name WAU_UpdatesAtTime -Value $UpdatesAtTime -Force -Confirm:$false) $Script:WAUConfig = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate') } - + $tasktrigger = (New-ScheduledTaskTrigger -Daily -At $($WAUConfig.WAU_UpdatesAtTime)) - + # Count Triggers (correctly) $service = (New-Object -ComObject Schedule.Service) $service.Connect($env:COMPUTERNAME) @@ -273,24 +274,24 @@ Function Get-Policies $task = $folder.GetTask('Winget-AutoUpdate') $definition = $task.Definition $null = $definition.Triggers.Count - - if ($definition.Triggers.Count -gt 0) + + if ($definition.Triggers.Count -gt 0) { $triggers = @() $triggers += (Get-ScheduledTask -TaskName 'Winget-AutoUpdate').Triggers $triggers += $tasktrigger $null = (Set-ScheduledTask -TaskName 'Winget-AutoUpdate' -Trigger $triggers) } - else + else { $null = (Set-ScheduledTask -TaskName 'Winget-AutoUpdate' -Trigger $tasktrigger) } $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_UpdatesAtLogon) -and ($($WAUPolicies.WAU_UpdatesAtLogon) -ne $($WAUConfig.WAU_UpdatesAtLogon))) + + if ($null -ne $($WAUPolicies.WAU_UpdatesAtLogon) -and ($($WAUPolicies.WAU_UpdatesAtLogon) -ne $($WAUConfig.WAU_UpdatesAtLogon))) { - if ($WAUPolicies.WAU_UpdatesAtLogon -eq 1) + if ($WAUPolicies.WAU_UpdatesAtLogon -eq 1) { $null = (New-ItemProperty -Path $regPath -Name WAU_UpdatesAtLogon -Value $($WAUPolicies.WAU_UpdatesAtLogon) -PropertyType DWord -Force -Confirm:$false) $triggers = @() @@ -302,22 +303,22 @@ Function Get-Policies $task = $folder.GetTask('Winget-AutoUpdate') $definition = $task.Definition $triggerLogon = $false - - foreach ($trigger in $definition.Triggers) + + foreach ($trigger in $definition.Triggers) { - if ($trigger.Type -eq '9') + if ($trigger.Type -eq '9') { $triggerLogon = $true break } } - if (!$triggerLogon) + if (!$triggerLogon) { $triggers += New-ScheduledTaskTrigger -AtLogOn $null = (Set-ScheduledTask -TaskName 'Winget-AutoUpdate' -Trigger $triggers) } } - else + else { $null = (New-ItemProperty -Path $regPath -Name WAU_UpdatesAtLogon -Value $($WAUPolicies.WAU_UpdatesAtLogon) -PropertyType DWord -Force -Confirm:$false) $service = (New-Object -ComObject Schedule.Service) @@ -326,22 +327,22 @@ Function Get-Policies $task = $folder.GetTask('Winget-AutoUpdate') $definition = $task.Definition $null = $definition.Triggers.Count - - for ($triggerId = 1; $triggerId -le $definition.Triggers.Count; $triggerId++) + + for ($triggerId = 1; $triggerId -le $definition.Triggers.Count; $triggerId++) { - if ($definition.Triggers.Item($triggerId).Type -eq '9') + if ($definition.Triggers.Item($triggerId).Type -eq '9') { $definition.Triggers.Remove($triggerId) $triggerId -= 1 } } - + $null = $folder.RegisterTaskDefinition($task.Name, $definition, 4, $null, $null, $null) } - + $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_UpdatesAtLogon) -and ($($WAUConfig.WAU_UpdatesAtLogon) -or $($WAUConfig.WAU_UpdatesAtLogon) -eq 0)) + elseif ($null -eq $($WAUPolicies.WAU_UpdatesAtLogon) -and ($($WAUConfig.WAU_UpdatesAtLogon) -or $($WAUConfig.WAU_UpdatesAtLogon) -eq 0)) { $null = (Remove-ItemProperty -Path $regPath -Name WAU_UpdatesAtLogon -Force -ErrorAction SilentlyContinue -Confirm:$false) $service = (New-Object -ComObject Schedule.Service) @@ -349,25 +350,25 @@ Function Get-Policies $folder = $service.GetFolder('\') $task = $folder.GetTask('Winget-AutoUpdate') $definition = $task.Definition - - for ($triggerId = 1; $triggerId -le $definition.Triggers.Count; $triggerId++) + + for ($triggerId = 1; $triggerId -le $definition.Triggers.Count; $triggerId++) { - if ($definition.Triggers.Item($triggerId).Type -eq '9') + if ($definition.Triggers.Item($triggerId).Type -eq '9') { $definition.Triggers.Remove($triggerId) $triggerId -= 1 } } - + $null = $folder.RegisterTaskDefinition($task.Name, $definition, 4, $null, $null, $null) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_UserContext) -and ($($WAUPolicies.WAU_UserContext) -ne $($WAUConfig.WAU_UserContext))) + + if ($null -ne $($WAUPolicies.WAU_UserContext) -and ($($WAUPolicies.WAU_UserContext) -ne $($WAUConfig.WAU_UserContext))) { $null = (New-ItemProperty -Path $regPath -Name WAU_UserContext -Value $($WAUPolicies.WAU_UserContext) -PropertyType DWord -Force -Confirm:$false) - - if ($WAUPolicies.WAU_UserContext -eq 1) + + if ($WAUPolicies.WAU_UserContext -eq 1) { # Settings for the scheduled task in User context $taskAction = New-ScheduledTaskAction -Execute 'wscript.exe' -Argument "`"$($WAUConfig.InstallLocation)\Invisible.vbs`" `"powershell.exe -NoProfile -ExecutionPolicy Bypass -File `"`"`"$($WAUConfig.InstallLocation)\winget-upgrade.ps1`"`"" @@ -377,94 +378,94 @@ Function Get-Policies $task = (New-ScheduledTask -Action $taskAction -Principal $taskUserPrincipal -Settings $taskSettings) $null = (Register-ScheduledTask -TaskName 'Winget-AutoUpdate-UserContext' -InputObject $task -Force) } - else + else { $null = (Get-ScheduledTask -TaskName 'Winget-AutoUpdate-UserContext' -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm:$false -ErrorAction SilentlyContinue) } $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_UserContext) -and ($($WAUConfig.WAU_UserContext) -or $($WAUConfig.WAU_UserContext) -eq 0)) + elseif ($null -eq $($WAUPolicies.WAU_UserContext) -and ($($WAUConfig.WAU_UserContext) -or $($WAUConfig.WAU_UserContext) -eq 0)) { $null = (Remove-ItemProperty -Path $regPath -Name WAU_UserContext -Force -ErrorAction SilentlyContinue -Confirm:$false) $null = (Get-ScheduledTask -TaskName 'Winget-AutoUpdate-UserContext' -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm:$false -ErrorAction SilentlyContinue) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_DesktopShortcut) -and ($($WAUPolicies.WAU_DesktopShortcut) -ne $($WAUConfig.WAU_DesktopShortcut))) + + if ($null -ne $($WAUPolicies.WAU_DesktopShortcut) -and ($($WAUPolicies.WAU_DesktopShortcut) -ne $($WAUConfig.WAU_DesktopShortcut))) { $null = (New-ItemProperty -Path $regPath -Name WAU_DesktopShortcut -Value $($WAUPolicies.WAU_DesktopShortcut) -PropertyType DWord -Force -Confirm:$false) - - if ($WAUPolicies.WAU_DesktopShortcut -eq 1) + + if ($WAUPolicies.WAU_DesktopShortcut -eq 1) { Add-Shortcut 'wscript.exe' "${env:Public}\Desktop\WAU - Check for updated Apps.lnk" "`"$($WAUConfig.InstallLocation)\Invisible.vbs`" `"powershell.exe -NoProfile -ExecutionPolicy Bypass -File `"`"`"$($WAUConfig.InstallLocation)\user-run.ps1`"`"" "${env:SystemRoot}\System32\shell32.dll,-16739" 'Manual start of Winget-AutoUpdate (WAU)...' } - else + else { $null = (Remove-Item -Path "${env:Public}\Desktop\WAU - Check for updated Apps.lnk" -Force -Confirm:$false) } $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_DesktopShortcut) -and ($($WAUConfig.WAU_DesktopShortcut) -or $($WAUConfig.WAU_DesktopShortcut) -eq 0)) + elseif ($null -eq $($WAUPolicies.WAU_DesktopShortcut) -and ($($WAUConfig.WAU_DesktopShortcut) -or $($WAUConfig.WAU_DesktopShortcut) -eq 0)) { $null = (Remove-ItemProperty -Path $regPath -Name WAU_DesktopShortcut -Force -Confirm:$false -ErrorAction SilentlyContinue) $null = (Remove-Item -Path "${env:Public}\Desktop\WAU - Check for updated Apps.lnk" -Force -Confirm:$false) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_StartMenuShortcut) -and ($($WAUPolicies.WAU_StartMenuShortcut) -ne $($WAUConfig.WAU_StartMenuShortcut))) + + if ($null -ne $($WAUPolicies.WAU_StartMenuShortcut) -and ($($WAUPolicies.WAU_StartMenuShortcut) -ne $($WAUConfig.WAU_StartMenuShortcut))) { $null = (New-ItemProperty -Path $regPath -Name WAU_StartMenuShortcut -Value $($WAUPolicies.WAU_StartMenuShortcut) -PropertyType DWord -Force -Confirm:$false) - - if ($WAUPolicies.WAU_StartMenuShortcut -eq 1) + + if ($WAUPolicies.WAU_StartMenuShortcut -eq 1) { - if (!(Test-Path -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)")) + if (!(Test-Path -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)")) { $null = (New-Item -ItemType Directory -Force -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)" -Confirm:$false) } - + Add-Shortcut 'wscript.exe' "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)\WAU - Check for updated Apps.lnk" "`"$($WAUConfig.InstallLocation)\Invisible.vbs`" `"powershell.exe -NoProfile -ExecutionPolicy Bypass -File `"`"`"$($WAUConfig.InstallLocation)\user-run.ps1`"`"" "${env:SystemRoot}\System32\shell32.dll,-16739" 'Manual start of Winget-AutoUpdate (WAU)...' Add-Shortcut 'wscript.exe' "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)\WAU - Open logs.lnk" "`"$($WAUConfig.InstallLocation)\Invisible.vbs`" `"powershell.exe -NoProfile -ExecutionPolicy Bypass -File `"`"`"$($WAUConfig.InstallLocation)\user-run.ps1`" -Logs`"" "${env:SystemRoot}\System32\shell32.dll,-16763" 'Open existing WAU logs...' Add-Shortcut 'wscript.exe' "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)\WAU - Web Help.lnk" "`"$($WAUConfig.InstallLocation)\Invisible.vbs`" `"powershell.exe -NoProfile -ExecutionPolicy Bypass -File `"`"`"$($WAUConfig.InstallLocation)\user-run.ps1`" -Help`"" "${env:SystemRoot}\System32\shell32.dll,-24" 'Help for WAU...' } - else + else { $null = (Remove-Item -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)" -Recurse -Force -Confirm:$false) } $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_StartMenuShortcut) -and ($($WAUConfig.WAU_StartMenuShortcut) -or $($WAUConfig.WAU_StartMenuShortcut) -eq 0)) + elseif ($null -eq $($WAUPolicies.WAU_StartMenuShortcut) -and ($($WAUConfig.WAU_StartMenuShortcut) -or $($WAUConfig.WAU_StartMenuShortcut) -eq 0)) { $null = (Remove-ItemProperty -Path $regPath -Name WAU_StartMenuShortcut -Force -ErrorAction SilentlyContinue -Confirm:$false) $null = (Remove-Item -Path "${env:ProgramData}\Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)" -Recurse -Force -Confirm:$false) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_MaxLogFiles) -and ($($WAUPolicies.WAU_MaxLogFiles) -ne $($WAUConfig.WAU_MaxLogFiles))) + + if ($null -ne $($WAUPolicies.WAU_MaxLogFiles) -and ($($WAUPolicies.WAU_MaxLogFiles) -ne $($WAUConfig.WAU_MaxLogFiles))) { $null = (New-ItemProperty -Path $regPath -Name WAU_MaxLogFiles -Value $($WAUPolicies.WAU_MaxLogFiles.TrimEnd(' ', '\', '/')) -Force -Confirm:$false) $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_MaxLogFiles) -and $($WAUConfig.WAU_MaxLogFiles) -ne 3) + elseif ($null -eq $($WAUPolicies.WAU_MaxLogFiles) -and $($WAUConfig.WAU_MaxLogFiles) -ne 3) { $null = (New-ItemProperty -Path $regPath -Name WAU_MaxLogFiles -Value 3 -Force -Confirm:$false) $ChangedSettings++ } - - if ($null -ne $($WAUPolicies.WAU_MaxLogSize) -and ($($WAUPolicies.WAU_MaxLogSize) -ne $($WAUConfig.WAU_MaxLogSize))) + + if ($null -ne $($WAUPolicies.WAU_MaxLogSize) -and ($($WAUPolicies.WAU_MaxLogSize) -ne $($WAUConfig.WAU_MaxLogSize))) { $null = (New-ItemProperty -Path $regPath -Name WAU_MaxLogSize -Value $($WAUPolicies.WAU_MaxLogSize.TrimEnd(' ', '\', '/')) -Force -Confirm:$false) $ChangedSettings++ } - elseif ($null -eq $($WAUPolicies.WAU_MaxLogSize) -and $($WAUConfig.WAU_MaxLogSize) -ne 1048576) + elseif ($null -eq $($WAUPolicies.WAU_MaxLogSize) -and $($WAUConfig.WAU_MaxLogSize) -ne 1048576) { $null = (New-ItemProperty -Path $regPath -Name WAU_MaxLogSize -Value 1048576 -Force -Confirm:$false) $ChangedSettings++ } - + # Get WAU Configurations after Policies change $Script:WAUConfig = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate') } } - - Return $($WAUPolicies.WAU_ActivateGPOManagement), $ChangedSettings + + return $($WAUPolicies.WAU_ActivateGPOManagement), $ChangedSettings } diff --git a/Winget-AutoUpdate/functions/Get-WAUAvailableVersion.ps1 b/Winget-AutoUpdate/functions/Get-WAUAvailableVersion.ps1 index 5bb5091..99e40d4 100644 --- a/Winget-AutoUpdate/functions/Get-WAUAvailableVersion.ps1 +++ b/Winget-AutoUpdate/functions/Get-WAUAvailableVersion.ps1 @@ -1,22 +1,22 @@ # Function to get the latest WAU available version on Github -function Get-WAUAvailableVersion +function Get-WAUAvailableVersion { # Get Github latest version - if ($WAUConfig.WAU_UpdatePrerelease -eq 1) + if ($WAUConfig.WAU_UpdatePrerelease -eq 1) { # Log Write-ToLog -LogMsg 'WAU AutoUpdate Pre-release versions is Enabled' -LogColor 'Cyan' - + # Get latest pre-release info $WAUurl = 'https://api.github.com/repos/Romanitho/Winget-AutoUpdate/releases' } - else + else { # Get latest stable info $WAUurl = 'https://api.github.com/repos/Romanitho/Winget-AutoUpdate/releases/latest' } - + # Return version return ((Invoke-WebRequest -Uri $WAUurl -UseBasicParsing | ConvertFrom-Json)[0].tag_name).Replace('v', '') } diff --git a/Winget-AutoUpdate/functions/Get-WingetCmd.ps1 b/Winget-AutoUpdate/functions/Get-WingetCmd.ps1 index eec9904..72bd927 100644 --- a/Winget-AutoUpdate/functions/Get-WingetCmd.ps1 +++ b/Winget-AutoUpdate/functions/Get-WingetCmd.ps1 @@ -1,43 +1,53 @@ # Function to get the winget command regarding execution context (User, System...) -Function Get-WingetCmd { - - # Get WinGet Path (if Admin context) - # Includes Workaround for ARM64 (removed X64 and replaces it with a wildcard) - $ResolveWingetPath = (Resolve-Path -Path "$env:ProgramFiles\WindowsApps\Microsoft.DesktopAppInstaller_*_*__8wekyb3d8bbwe" | Sort-Object -Property { [version]($_.Path -replace '^[^\d]+_((\d+\.)*\d+)_.*', '$1') }) - - if ($ResolveWingetPath) { - # If multiple version, pick last one - $WingetPath = $ResolveWingetPath[-1].Path - } - - #If running under System or Admin context obtain Winget from Program Files - if((([Security.Principal.WindowsIdentity]::GetCurrent().User) -eq 'S-1-5-18') -or ($WingetPath)){ - if (Test-Path -Path ('{0}\winget.exe' -f $WingetPath) -ErrorAction SilentlyContinue) { - $Script:Winget = ('{0}\winget.exe' -f $WingetPath) - } - }else{ - #Get Winget Location in User context - $WingetCmd = (Get-Command -Name winget.exe -ErrorAction SilentlyContinue) - - if ($WingetCmd) { - $Script:Winget = $WingetCmd.Source - } - } - - If(!($Script:Winget)){ - Write-ToLog 'Winget not installed or detected !' 'Red' - - return $false - } - - # Run winget to list apps and accept source agrements (necessary on first run) - $null = (& $Winget list --accept-source-agreements -s winget) - - # Log Winget installed version - $WingetVer = & $Winget --version - Write-ToLog ('Winget Version: {0}' -f $WingetVer) - - return $true - +function Get-WingetCmd +{ + + # Get WinGet Path (if Admin context) + # Includes Workaround for ARM64 (removed X64 and replaces it with a wildcard) + $ResolveWingetPath = (Resolve-Path -Path "$env:ProgramFiles\WindowsApps\Microsoft.DesktopAppInstaller_*_*__8wekyb3d8bbwe" | Sort-Object -Property { + [version]($_.Path -replace '^[^\d]+_((\d+\.)*\d+)_.*', '$1') + }) + + if ($ResolveWingetPath) + { + # If multiple version, pick last one + $WingetPath = $ResolveWingetPath[-1].Path + } + + #If running under System or Admin context obtain Winget from Program Files + if ((([Security.Principal.WindowsIdentity]::GetCurrent().User) -eq 'S-1-5-18') -or ($WingetPath)) + { + if (Test-Path -Path ('{0}\winget.exe' -f $WingetPath) -ErrorAction SilentlyContinue) + { + $Script:Winget = ('{0}\winget.exe' -f $WingetPath) + } + } + else + { + #Get Winget Location in User context + $WingetCmd = (Get-Command -Name winget.exe -ErrorAction SilentlyContinue) + + if ($WingetCmd) + { + $Script:Winget = $WingetCmd.Source + } + } + + if (!($Script:Winget)) + { + Write-ToLog 'Winget not installed or detected !' 'Red' + + return $false + } + + # Run winget to list apps and accept source agrements (necessary on first run) + $null = (& $Winget list --accept-source-agreements -s winget) + + # Log Winget installed version + $WingetVer = & $Winget --version + Write-ToLog ('Winget Version: {0}' -f $WingetVer) + + return $true + } diff --git a/Winget-AutoUpdate/functions/Get-WingetOutdatedApps.ps1 b/Winget-AutoUpdate/functions/Get-WingetOutdatedApps.ps1 index 62242b0..ec52979 100644 --- a/Winget-AutoUpdate/functions/Get-WingetOutdatedApps.ps1 +++ b/Winget-AutoUpdate/functions/Get-WingetOutdatedApps.ps1 @@ -1,6 +1,6 @@ # Function to get the outdated app list, in formatted array -function Get-WingetOutdatedApps +function Get-WingetOutdatedApps { class Software { [string]$Name @@ -8,62 +8,62 @@ function Get-WingetOutdatedApps [string]$Version [string]$AvailableVersion } - + # Get list of available upgrades on winget format $upgradeResult = (& $Winget upgrade --source winget | Out-String) - + # Start Convertion of winget format to an array. Check if "-----" exists (Winget Error Handling) - if (!($upgradeResult -match '-----')) + if (!($upgradeResult -match '-----')) { return "An unusual thing happened (maybe all apps are upgraded):`n$upgradeResult" } - + # Split winget output to lines $lines = $upgradeResult.Split([Environment]::NewLine) | Where-Object -FilterScript { - $_ + $_ } - + # Find the line that starts with "------" $fl = 0 - while (-not $lines[$fl].StartsWith('-----')) + while (-not $lines[$fl].StartsWith('-----')) { $fl++ } - + # Get header line $fl = $fl - 1 - + # Get header titles [without remove seperator] $index = $lines[$fl] -split '(?<=\s)(?!\s)' - + # Line $fl has the header, we can find char where we find ID and Version [and manage non latin characters] $idStart = $($index[0] -replace '[\u4e00-\u9fa5]', '**').Length $versionStart = $idStart + $($index[1] -replace '[\u4e00-\u9fa5]', '**').Length $availableStart = $versionStart + $($index[2] -replace '[\u4e00-\u9fa5]', '**').Length - + # Now cycle in real package and split accordingly $upgradeList = @() - - For ($i = $fl + 2; $i -lt $lines.Length; $i++) + + for ($i = $fl + 2; $i -lt $lines.Length; $i++) { $line = $lines[$i] -replace '[\u2026]', ' ' #Fix "..." in long names - - if ($line.StartsWith('-----')) + + if ($line.StartsWith('-----')) { # Get header line $fl = $i - 1 - + # Get header titles [without remove seperator] $index = $lines[$fl] -split '(?<=\s)(?!\s)' - + # Line $fl has the header, we can find char where we find ID and Version [and manage non latin characters] $idStart = $($index[0] -replace '[\u4e00-\u9fa5]', '**').Length $versionStart = $idStart + $($index[1] -replace '[\u4e00-\u9fa5]', '**').Length $availableStart = $versionStart + $($index[2] -replace '[\u4e00-\u9fa5]', '**').Length } - + # (Alphanumeric | Literal . | Alphanumeric) - the only unique thing in common for lines with applications - if ($line -match '\w\.\w') + if ($line -match '\w\.\w') { $software = [Software]::new() # Manage non latin characters @@ -76,17 +76,17 @@ function Get-WingetOutdatedApps $upgradeList += $software } } - + # If current user is not system, remove system apps from list - if ($IsSystem -eq $false) + if ($IsSystem -eq $false) { $SystemApps = Get-Content -Path ('{0}\winget_system_apps.txt' -f $WorkingDir) $upgradeList = $upgradeList | Where-Object -FilterScript { - $SystemApps -notcontains $_.Id + $SystemApps -notcontains $_.Id } } - + return $upgradeList | Sort-Object -Property { - Get-Random + Get-Random } } diff --git a/Winget-AutoUpdate/functions/Get-WingetSystemApps.ps1 b/Winget-AutoUpdate/functions/Get-WingetSystemApps.ps1 index 0d1bedf..0692984 100644 --- a/Winget-AutoUpdate/functions/Get-WingetSystemApps.ps1 +++ b/Winget-AutoUpdate/functions/Get-WingetSystemApps.ps1 @@ -1,17 +1,17 @@ -function Get-WingetSystemApps +function Get-WingetSystemApps { # Json File, where to export system installed apps $jsonFile = ('{0}\winget_system_apps.txt' -f $WorkingDir) - + # Get list of installed Winget apps to json file $null = (& $Winget export -o $jsonFile --accept-source-agreements -s winget) - + # Convert json file to txt file with app ids $InstalledApps = (Get-Content -Path $jsonFile | ConvertFrom-Json) - + # Save app list $null = (Set-Content -Value $InstalledApps.Sources.Packages.PackageIdentifier -Path $jsonFile -Force -Confirm:$False -ErrorAction SilentlyContinue) - + # Sort app list $null = (Get-Content -Path $jsonFile | Sort-Object | Set-Content -Path $jsonFile -Force -Confirm:$False -ErrorAction SilentlyContinue) } diff --git a/Winget-AutoUpdate/functions/Invoke-LogRotation.ps1 b/Winget-AutoUpdate/functions/Invoke-LogRotation.ps1 index 86c40b7..ebc46c1 100644 --- a/Winget-AutoUpdate/functions/Invoke-LogRotation.ps1 +++ b/Winget-AutoUpdate/functions/Invoke-LogRotation.ps1 @@ -1,6 +1,6 @@ # Function to rotate the logs -function Invoke-LogRotation +function Invoke-LogRotation { <# .SYNOPSIS @@ -12,38 +12,41 @@ function Invoke-LogRotation URL: https://www.powershellgallery.com/packages/Communary.Logger/1.1 Date: 21.11.2014 Version: 1.0 - #> + #> param ( - [string]$LogFile, - [int]$MaxLogFiles, - [int]$MaxLogSize + [string] + $LogFile, + [int] + $MaxLogFiles, + [int] + $MaxLogSize ) - try + try { # get current size of log file $currentSize = (Get-Item -Path $LogFile).Length - + # get log name $logFileName = (Split-Path -Path $LogFile -Leaf) $logFilePath = (Split-Path -Path $LogFile) $logFileNameWithoutExtension = [IO.Path]::GetFileNameWithoutExtension($logFileName) $logFileNameExtension = [IO.Path]::GetExtension($logFileName) - + # if MaxLogFiles is 1 just keep the original one and let it grow - if (-not($MaxLogFiles -eq 1)) + if (-not ($MaxLogFiles -eq 1)) { - if ($currentSize -ge $MaxLogSize) + if ($currentSize -ge $MaxLogSize) { # construct name of archived log file $newLogFileName = $logFileNameWithoutExtension + (Get-Date -Format 'yyyyMMddHHmmss').ToString() + $logFileNameExtension - + # copy old log file to new using the archived name constructed above $null = (Copy-Item -Path $LogFile -Destination (Join-Path -Path (Split-Path -Path $LogFile) -ChildPath $newLogFileName)) - + # Create a new log file - try + try { $null = (Remove-Item -Path $LogFile -Force -Confirm:$False -ErrorAction SilentlyContinue) $null = (New-Item -ItemType File -Path $LogFile -Force -Confirm:$False -ErrorAction SilentlyContinue) @@ -57,59 +60,59 @@ function Invoke-LogRotation $NewAcl.SetAccessRule($fileSystemAccessRule) $null = (Set-Acl -Path $LogFile -AclObject $NewAcl) } - catch + catch { - Return $False + return $False } - + # if MaxLogFiles is 0 don't delete any old archived log files - if (-not($MaxLogFiles -eq 0)) + if (-not ($MaxLogFiles -eq 0)) { # set filter to search for archived log files $archivedLogFileFilter = $logFileNameWithoutExtension + '??????????????' + $logFileNameExtension - + # get archived log files $oldLogFiles = (Get-Item -Path "$(Join-Path -Path $logFilePath -ChildPath $archivedLogFileFilter)") - - if ([bool]$oldLogFiles) + + if ([bool]$oldLogFiles) { # compare found log files to MaxLogFiles parameter of the log object, and delete oldest until we are # back to the correct number - if (($oldLogFiles.Count + 1) -gt $MaxLogFiles) + if (($oldLogFiles.Count + 1) -gt $MaxLogFiles) { [int]$numTooMany = (($oldLogFiles.Count) + 1) - $MaxLogFiles - $null = ($oldLogFiles | Sort-Object -Property 'LastWriteTime' | Select-Object -First $numTooMany | Remove-Item -Force -Confirm:$False -ErrorAction SilentlyContinue) + $null = ($oldLogFiles | Sort-Object -Property 'LastWriteTime' | Select-Object -First $numTooMany | Remove-Item -Force -Confirm:$False -ErrorAction SilentlyContinue) } } } - + # Log Header $Log = "##################################################`n# CHECK FOR APP UPDATES - $(Get-Date -Format (Get-Culture).DateTimeFormat.ShortDatePattern)`n##################################################" $null = ($Log | Out-File -FilePath $LogFile -Append -Force) Write-ToLog -LogMsg 'Running in System context' - - if ($ActivateGPOManagement) + + if ($ActivateGPOManagement) { Write-ToLog -LogMsg 'Activated WAU GPO Management detected, comparing...' - - if ($null -ne $ChangedSettings -and $ChangedSettings -ne 0) + + if ($null -ne $ChangedSettings -and $ChangedSettings -ne 0) { Write-ToLog -LogMsg 'Changed settings detected and applied' -LogColor 'Yellow' } - else + else { Write-ToLog -LogMsg 'No Changed settings detected' -LogColor 'Yellow' } } - + Write-ToLog -LogMsg ('Max Log Size reached: {0} bytes - Rotated Logs' -f $MaxLogSize) - - Return $True + + return $True } } } - catch + catch { - Return $False + return $False } } diff --git a/Winget-AutoUpdate/functions/Invoke-ModsProtect.ps1 b/Winget-AutoUpdate/functions/Invoke-ModsProtect.ps1 index 1d33a33..ec3f270 100644 --- a/Winget-AutoUpdate/functions/Invoke-ModsProtect.ps1 +++ b/Winget-AutoUpdate/functions/Invoke-ModsProtect.ps1 @@ -2,15 +2,16 @@ # Security: Mods directory must be protected (Users could create scripts of their own - then they'll run in System Context)! # Check if Local Users have write rights in Mods directory or not (and take action if necessary): -function Invoke-ModsProtect +function Invoke-ModsProtect { [CmdletBinding()] param ( - [string]$ModsPath + [string] + $ModsPath ) - - try + + try { $directory = (Get-Item -Path $ModsPath -ErrorAction SilentlyContinue) $acl = (Get-Acl -Path $directory.FullName) @@ -21,60 +22,60 @@ function Invoke-ModsProtect $userName = $ntAccount.Value $userRights = [Security.AccessControl.FileSystemRights]'Write' $hasWriteAccess = $False - - foreach ($access in $acl.Access) + + foreach ($access in $acl.Access) { - if ($access.IdentityReference.Value -eq $userName -and $access.FileSystemRights -eq $userRights) + if ($access.IdentityReference.Value -eq $userName -and $access.FileSystemRights -eq $userRights) { $hasWriteAccess = $True break } } - - if ($hasWriteAccess) + + if ($hasWriteAccess) { # Disable inheritance $acl.SetAccessRuleProtection($True, $True) - + # Remove any existing rules $acl.Access | ForEach-Object -Process { - $acl.RemoveAccessRule($_) + $acl.RemoveAccessRule($_) } - + # SYSTEM Full - S-1-5-18 $userSID = (New-Object -TypeName System.Security.Principal.SecurityIdentifier -ArgumentList ('S-1-5-18')) $rule = (New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList ($userSID, 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow')) $acl.SetAccessRule($rule) # Save the updated ACL $null = (Set-Acl -Path $directory.FullName -AclObject $acl) - + # Administrators Full - S-1-5-32-544 $acl = (Get-Acl -Path $directory.FullName) $userSID = (New-Object -TypeName System.Security.Principal.SecurityIdentifier -ArgumentList ('S-1-5-32-544')) $rule = (New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList ($userSID, 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow')) $acl.SetAccessRule($rule) $null = (Set-Acl -Path $directory.FullName -AclObject $acl) - + # Local Users ReadAndExecute - S-1-5-32-545 S-1-5-11 $acl = (Get-Acl -Path $directory.FullName) $userSID = (New-Object -TypeName System.Security.Principal.SecurityIdentifier -ArgumentList ('S-1-5-32-545')) $rule = (New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList ($userSID, 'ReadAndExecute', 'ContainerInherit,ObjectInherit', 'None', 'Allow')) $acl.SetAccessRule($rule) $null = (Set-Acl -Path $directory.FullName -AclObject $acl) - + # Authenticated Users ReadAndExecute - S-1-5-11 $acl = (Get-Acl -Path $directory.FullName) $userSID = (New-Object -TypeName System.Security.Principal.SecurityIdentifier -ArgumentList ('S-1-5-11')) $rule = (New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList ($userSID, 'ReadAndExecute', 'ContainerInherit,ObjectInherit', 'None', 'Allow')) $acl.SetAccessRule($rule) $null = (Set-Acl -Path $directory.FullName -AclObject $acl) - + return $True } - + return $False } - catch + catch { return 'Error' } diff --git a/Winget-AutoUpdate/functions/Invoke-PostUpdateActions.ps1 b/Winget-AutoUpdate/functions/Invoke-PostUpdateActions.ps1 index 558e769..3e1082f 100644 --- a/Winget-AutoUpdate/functions/Invoke-PostUpdateActions.ps1 +++ b/Winget-AutoUpdate/functions/Invoke-PostUpdateActions.ps1 @@ -1,47 +1,47 @@ # Function to make actions after WAU update -function Invoke-PostUpdateActions +function Invoke-PostUpdateActions { # log Write-ToLog -LogMsg 'Running Post Update actions:' -LogColor 'yellow' - + # Check if Intune Management Extension Logs folder and WAU-updates.log exists, make symlink - if ((Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs" -ErrorAction SilentlyContinue) -and !(Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-updates.log" -ErrorAction SilentlyContinue)) + if ((Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs" -ErrorAction SilentlyContinue) -and !(Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-updates.log" -ErrorAction SilentlyContinue)) { Write-ToLog -LogMsg '-> Creating SymLink for log file in Intune Management Extension log folder' -LogColor 'yellow' $null = New-Item -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-updates.log" -ItemType SymbolicLink -Value $LogFile -Force -ErrorAction SilentlyContinue } - + # Check if Intune Management Extension Logs folder and WAU-install.log exists, make symlink - if ((Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs" -ErrorAction SilentlyContinue) -and (Test-Path -Path ('{0}\logs\install.log' -f $WorkingDir) -ErrorAction SilentlyContinue) -and !(Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-install.log" -ErrorAction SilentlyContinue)) + if ((Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs" -ErrorAction SilentlyContinue) -and (Test-Path -Path ('{0}\logs\install.log' -f $WorkingDir) -ErrorAction SilentlyContinue) -and !(Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-install.log" -ErrorAction SilentlyContinue)) { Write-Host -Object "`nCreating SymLink for log file (WAU-install) in Intune Management Extension log folder" -ForegroundColor Yellow $null = (New-Item -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-install.log" -ItemType SymbolicLink -Value ('{0}\logs\install.log' -f $WorkingDir) -Force -Confirm:$False -ErrorAction SilentlyContinue) } - + Write-ToLog -LogMsg '-> Checking prerequisites...' -LogColor 'yellow' - + # Check if Visual C++ 2019 or 2022 installed $Visual2019 = 'Microsoft Visual C++ 2015-2019 Redistributable*' $Visual2022 = 'Microsoft Visual C++ 2015-2022 Redistributable*' $path = (Get-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' -ErrorAction SilentlyContinue | Where-Object -FilterScript { $_.GetValue('DisplayName') -like $Visual2019 -or $_.GetValue('DisplayName') -like $Visual2022 - }) - + }) + # If not installed, install - if (!($path)) + if (!($path)) { - try + try { - if ((Get-CimInstance -ClassName Win32_OperatingSystem).OSArchitecture -like '*64*') + if ((Get-CimInstance -ClassName Win32_OperatingSystem).OSArchitecture -like '*64*') { $OSArch = 'x64' } - else + else { $OSArch = 'x86' } - + Write-ToLog -LogMsg ('-> Downloading VC_redist.{0}.exe...' -f $OSArch) $SourceURL = ('https://aka.ms/vs/17/release/VC_redist.{0}.exe' -f $OSArch) $Installer = ('{0}\VC_redist.{1}.exe' -f $WAUConfig.InstallLocation, $OSArch) @@ -52,70 +52,70 @@ function Invoke-PostUpdateActions Remove-Item -Path $Installer -ErrorAction Ignore Write-ToLog -LogMsg '-> MS Visual C++ 2015-2022 installed successfully' -LogColor 'green' } - catch + catch { Write-ToLog -LogMsg '-> MS Visual C++ 2015-2022 installation failed.' -LogColor 'red' } } - else + else { Write-ToLog -LogMsg '-> Prerequisites checked. OK' -LogColor 'green' } - + # Check Package Install Write-ToLog -LogMsg '-> Checking if Winget is installed/up to date' -LogColor 'yellow' $TestWinGet = Get-AppxProvisionedPackage -Online | Where-Object -FilterScript { $_.DisplayName -eq 'Microsoft.DesktopAppInstaller' } - + # Current: v1.5.2201 = 1.20.2201.0 = 2023.808.2243.0 - If ([Version]$TestWinGet.Version -ge '2023.808.2243.0') + if ([Version]$TestWinGet.Version -ge '2023.808.2243.0') { Write-ToLog -LogMsg '-> WinGet is Installed/up to date' -LogColor 'green' } - Else + else { # Download WinGet MSIXBundle Write-ToLog -LogMsg '-> Not installed/up to date. Downloading WinGet...' $WinGetURL = 'https://github.com/microsoft/winget-cli/releases/download/v1.5.2201/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle' $WebClient = New-Object -TypeName System.Net.WebClient $WebClient.DownloadFile($WinGetURL, ('{0}\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle' -f $WAUConfig.InstallLocation)) - + # Install WinGet MSIXBundle - try + try { Write-ToLog -LogMsg '-> Installing Winget MSIXBundle for App Installer...' $null = Add-AppxProvisionedPackage -Online -PackagePath ('{0}\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle' -f $WAUConfig.InstallLocation) -SkipLicense Write-ToLog -LogMsg '-> Installed Winget MSIXBundle for App Installer' -LogColor 'green' } - catch + catch { Write-ToLog -LogMsg '-> Failed to intall Winget MSIXBundle for App Installer...' -LogColor 'red' } - + # Remove WinGet MSIXBundle Remove-Item -Path ('{0}\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle' -f $WAUConfig.InstallLocation) -Force -Confirm:$False -ErrorAction Continue } - + # Reset Winget Sources $ResolveWingetPath = Resolve-Path -Path "$env:programfiles\WindowsApps\Microsoft.DesktopAppInstaller_*_*__8wekyb3d8bbwe\winget.exe" | Sort-Object -Property { [version]($_.Path -replace '^[^\d]+_((\d+\.)*\d+)_.*', '$1') } - - if ($ResolveWingetPath) + + if ($ResolveWingetPath) { # If multiple version, pick last one $WingetPath = $ResolveWingetPath[-1].Path & $WingetPath source reset --force - + # log Write-ToLog -LogMsg '-> Winget sources reseted.' -LogColor 'green' } - + # Create WAU Regkey if not present $regPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate' - - if (!(Test-Path -Path $regPath -ErrorAction SilentlyContinue)) + + if (!(Test-Path -Path $regPath -ErrorAction SilentlyContinue)) { $null = (New-Item -Path $regPath -Force -Confirm:$False -ErrorAction SilentlyContinue) $null = (New-ItemProperty -Path $regPath -Name DisplayName -Value 'Winget-AutoUpdate (WAU)' -Force -Confirm:$False -ErrorAction SilentlyContinue) @@ -128,162 +128,162 @@ function Invoke-PostUpdateActions $null = (New-ItemProperty -Path $regPath -Name UninstallString -Value "powershell.exe -noprofile -executionpolicy bypass -file `"$WorkingDir\WAU-Uninstall.ps1`"" -Force -Confirm:$False -ErrorAction SilentlyContinue) $null = (New-ItemProperty -Path $regPath -Name QuietUninstallString -Value "powershell.exe -noprofile -executionpolicy bypass -file `"$WorkingDir\WAU-Uninstall.ps1`"" -Force -Confirm:$False -ErrorAction SilentlyContinue) $null = (New-ItemProperty -Path $regPath -Name WAU_UpdatePrerelease -Value 0 -PropertyType DWord -Force -Confirm:$False -ErrorAction SilentlyContinue) - + #log Write-ToLog -LogMsg ('-> {0} created.' -f $regPath) -LogColor 'green' } - + # Fix Notif where WAU_NotificationLevel is not set $regNotif = Get-ItemProperty -Path $regPath -Name WAU_NotificationLevel -ErrorAction SilentlyContinue - - if (!$regNotif) + + if (!$regNotif) { New-ItemProperty -Path $regPath -Name WAU_NotificationLevel -Value Full -Force - + # log Write-ToLog -LogMsg "-> Notification level setting was missing. Fixed with 'Full' option." } - + # Set WAU_MaxLogFiles/WAU_MaxLogSize if not set $MaxLogFiles = Get-ItemProperty -Path $regPath -Name WAU_MaxLogFiles -ErrorAction SilentlyContinue - - if (!$MaxLogFiles) + + if (!$MaxLogFiles) { $null = (New-ItemProperty -Path $regPath -Name WAU_MaxLogFiles -Value 3 -PropertyType DWord -Force -Confirm:$False -ErrorAction SilentlyContinue) $null = (New-ItemProperty -Path $regPath -Name WAU_MaxLogSize -Value 1048576 -PropertyType DWord -Force -Confirm:$False -ErrorAction SilentlyContinue) - + # log Write-ToLog -LogMsg '-> MaxLogFiles/MaxLogSize setting was missing. Fixed with 3/1048576 (in bytes, default is 1048576 = 1 MB).' } - + # Set WAU_ListPath if not set $ListPath = Get-ItemProperty -Path $regPath -Name WAU_ListPath -ErrorAction SilentlyContinue - - if (!$ListPath) + + if (!$ListPath) { $null = (New-ItemProperty -Path $regPath -Name WAU_ListPath -Force -Confirm:$False -ErrorAction SilentlyContinue) - + # log Write-ToLog -LogMsg '-> ListPath setting was missing. Fixed with empty string.' } - + # Set WAU_ModsPath if not set $ModsPath = (Get-ItemProperty -Path $regPath -Name WAU_ModsPath -ErrorAction SilentlyContinue) - - if (!$ModsPath) + + if (!$ModsPath) { $null = (New-ItemProperty -Path $regPath -Name WAU_ModsPath -Force -Confirm:$False -ErrorAction SilentlyContinue) - + # log Write-ToLog -LogMsg '-> ModsPath setting was missing. Fixed with empty string.' } - + # Security check Write-ToLog -LogMsg '-> Checking Mods Directory:' -LogColor 'yellow' $Protected = Invoke-ModsProtect ('{0}\mods' -f $WAUConfig.InstallLocation) - - if ($Protected -eq $True) + + if ($Protected -eq $True) { Write-ToLog -LogMsg '-> The mods directory is now secured!' -LogColor 'green' } - elseif ($Protected -eq $False) + elseif ($Protected -eq $False) { Write-ToLog -LogMsg '-> The mods directory was already secured!' -LogColor 'green' } - else + else { Write-ToLog -LogMsg "-> Error: The mods directory couldn't be verified as secured!" -LogColor 'red' } - + # Convert about.xml if exists (old WAU versions) to reg $WAUAboutPath = ('{0}\config\about.xml' -f $WorkingDir) - - if (Test-Path -Path $WAUAboutPath -ErrorAction SilentlyContinue) + + if (Test-Path -Path $WAUAboutPath -ErrorAction SilentlyContinue) { [xml]$About = Get-Content -Path $WAUAboutPath -Encoding UTF8 -ErrorAction SilentlyContinue $null = (New-ItemProperty -Path $regPath -Name DisplayVersion -Value $About.app.version -Force -Confirm:$False -ErrorAction SilentlyContinue) - + # Remove file once converted $null = (Remove-Item -Path $WAUAboutPath -Force -Confirm:$False) - + #log Write-ToLog -LogMsg ('-> {0} converted.' -f $WAUAboutPath) -LogColor 'green' } - + # Convert config.xml if exists (previous WAU versions) to reg $WAUConfigPath = ('{0}\config\config.xml' -f $WorkingDir) - - if (Test-Path -Path $WAUConfigPath -ErrorAction SilentlyContinue) + + if (Test-Path -Path $WAUConfigPath -ErrorAction SilentlyContinue) { [xml]$Config = (Get-Content -Path $WAUConfigPath -Encoding UTF8 -ErrorAction SilentlyContinue) - - if ($Config.app.WAUautoupdate -eq 'False') + + if ($Config.app.WAUautoupdate -eq 'False') { $null = (New-ItemProperty -Path $regPath -Name WAU_DisableAutoUpdate -Value 1 -Force -Confirm:$False -ErrorAction SilentlyContinue) } - - if ($Config.app.NotificationLevel) + + if ($Config.app.NotificationLevel) { $null = (New-ItemProperty -Path $regPath -Name WAU_NotificationLevel -Value $Config.app.NotificationLevel -Force -Confirm:$False -ErrorAction SilentlyContinue) } - - if ($Config.app.UseWAUWhiteList -eq 'True') + + if ($Config.app.UseWAUWhiteList -eq 'True') { $null = (New-ItemProperty -Path $regPath -Name WAU_UseWhiteList -Value 1 -PropertyType DWord -Force -Confirm:$False -ErrorAction SilentlyContinue) } - - if ($Config.app.WAUprerelease -eq 'True') + + if ($Config.app.WAUprerelease -eq 'True') { $null = (New-ItemProperty -Path $regPath -Name WAU_UpdatePrerelease -Value 1 -PropertyType DWord -Force -Confirm:$False -ErrorAction SilentlyContinue) } - + # Remove file once converted $null = (Remove-Item -Path $WAUConfigPath -Force -Confirm:$False) - + # log Write-ToLog -LogMsg ('-> {0} converted.' -f $WAUConfigPath) -LogColor 'green' } - + # Remove old functions / files $FileNames = @( - ('{0}\functions\Get-WAUConfig.ps1' -f $WorkingDir), - ('{0}\functions\Get-WAUCurrentVersion.ps1' -f $WorkingDir), - ('{0}\functions\Get-WAUUpdateStatus.ps1' -f $WorkingDir), - ('{0}\functions\Write-Log.ps1' -f $WorkingDir), + ('{0}\functions\Get-WAUConfig.ps1' -f $WorkingDir), + ('{0}\functions\Get-WAUCurrentVersion.ps1' -f $WorkingDir), + ('{0}\functions\Get-WAUUpdateStatus.ps1' -f $WorkingDir), + ('{0}\functions\Write-Log.ps1' -f $WorkingDir), ('{0}\Version.txt' -f $WorkingDir) ) - - foreach ($FileName in $FileNames) + + foreach ($FileName in $FileNames) { - if (Test-Path -Path $FileName -ErrorAction SilentlyContinue) + if (Test-Path -Path $FileName -ErrorAction SilentlyContinue) { $null = (Remove-Item -Path $FileName -Force -Confirm:$False -ErrorAction SilentlyContinue) - + # log Write-ToLog -LogMsg ('-> {0} removed.' -f $FileName) -LogColor 'green' } } - + # Remove old registry key $RegistryKeys = @( - 'VersionMajor', + 'VersionMajor', 'VersionMinor' ) - - foreach ($RegistryKey in $RegistryKeys) + + foreach ($RegistryKey in $RegistryKeys) { - if (Get-ItemProperty -Path $regPath -Name $RegistryKey -ErrorAction SilentlyContinue) + if (Get-ItemProperty -Path $regPath -Name $RegistryKey -ErrorAction SilentlyContinue) { $null = (Remove-ItemProperty -Path $regPath -Name $RegistryKey -Force -Confirm:$False -ErrorAction SilentlyContinue) } } - + # Reset WAU_UpdatePostActions Value $null = ($WAUConfig | New-ItemProperty -Name WAU_PostUpdateActions -Value 0 -Force -Confirm:$False -ErrorAction SilentlyContinue) - + # Get updated WAU Config $Script:WAUConfig = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate') - + # log Write-ToLog -LogMsg 'Post Update actions finished' -LogColor 'green' } diff --git a/Winget-AutoUpdate/functions/Start-Init.ps1 b/Winget-AutoUpdate/functions/Start-Init.ps1 index c0e713b..c3fb503 100644 --- a/Winget-AutoUpdate/functions/Start-Init.ps1 +++ b/Winget-AutoUpdate/functions/Start-Init.ps1 @@ -1,15 +1,15 @@ # Initialisation -function Start-Init +function Start-Init { # Config console output encoding [Console]::OutputEncoding = [Text.Encoding]::UTF8 - + # Workaround for ARM64 (Access Denied / Win32 internal Server error) $Script:ProgressPreference = 'SilentlyContinue' $caller = ((Get-ChildItem -Path $MyInvocation.PSCommandPath).Name) - - if ($caller -eq 'Winget-Upgrade.ps1') + + if ($caller -eq 'Winget-Upgrade.ps1') { # Log Header $Log = "`n##################################################`n# CHECK FOR APP UPDATES - $(Get-Date -Format (Get-Culture).DateTimeFormat.ShortDatePattern)`n##################################################" @@ -17,12 +17,12 @@ function Start-Init # Logs initialisation $Script:LogFile = ('{0}\logs\updates.log' -f $WorkingDir) } - elseif ($caller -eq 'Winget-AutoUpdate-Install.ps1') + elseif ($caller -eq 'Winget-AutoUpdate-Install.ps1') { $Script:LogFile = ('{0}\logs\updates.log' -f $WingetUpdatePath) } - - if (!(Test-Path -Path $LogFile -ErrorAction SilentlyContinue)) + + if (!(Test-Path -Path $LogFile -ErrorAction SilentlyContinue)) { # Create file if doesn't exist $null = (New-Item -ItemType File -Path $LogFile -Force -Confirm:$false) @@ -36,7 +36,7 @@ function Start-Init $NewAcl.SetAccessRule($fileSystemAccessRule) Set-Acl -Path $LogFile -AclObject $NewAcl } - elseif ((Test-Path -Path $LogFile -ErrorAction SilentlyContinue) -and ($caller -eq 'Winget-AutoUpdate-Install.ps1')) + elseif ((Test-Path -Path $LogFile -ErrorAction SilentlyContinue) -and ($caller -eq 'Winget-AutoUpdate-Install.ps1')) { #Set ACL for users on logfile $NewAcl = (Get-Acl -Path $LogFile) @@ -48,22 +48,22 @@ function Start-Init $NewAcl.SetAccessRule($fileSystemAccessRule) $null = (Set-Acl -Path $LogFile -AclObject $NewAcl) } - + # Check if Intune Management Extension Logs folder and WAU-updates.log exists, make symlink - if ((Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs") -and !(Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-updates.log")) + if ((Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs") -and !(Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-updates.log")) { Write-Host -Object "`nCreating SymLink for log file (WAU-updates) in Intune Management Extension log folder" -ForegroundColor Yellow $null = New-Item -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-updates.log" -ItemType SymbolicLink -Value $LogFile -Force -ErrorAction SilentlyContinue } - + # Check if Intune Management Extension Logs folder and WAU-install.log exists, make symlink - if ((Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs" -ErrorAction SilentlyContinue) -and (Test-Path -Path ('{0}\logs\install.log' -f $WorkingDir) -ErrorAction SilentlyContinue) -and !(Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-install.log" -ErrorAction SilentlyContinue)) + if ((Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs" -ErrorAction SilentlyContinue) -and (Test-Path -Path ('{0}\logs\install.log' -f $WorkingDir) -ErrorAction SilentlyContinue) -and !(Test-Path -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-install.log" -ErrorAction SilentlyContinue)) { Write-Host -Object "`nCreating SymLink for log file (WAU-install) in Intune Management Extension log folder" -ForegroundColor Yellow $null = (New-Item -Path "${env:ProgramData}\Microsoft\IntuneManagementExtension\Logs\WAU-install.log" -ItemType SymbolicLink -Value ('{0}\logs\install.log' -f $WorkingDir) -Force -ErrorAction SilentlyContinue) } - - if ($caller -eq 'Winget-Upgrade.ps1') + + if ($caller -eq 'Winget-Upgrade.ps1') { # Log file $Log | Out-File -FilePath $LogFile -Append -Force diff --git a/Winget-AutoUpdate/functions/Start-NotifTask.ps1 b/Winget-AutoUpdate/functions/Start-NotifTask.ps1 index 8abb674..ff3dafb 100644 --- a/Winget-AutoUpdate/functions/Start-NotifTask.ps1 +++ b/Winget-AutoUpdate/functions/Start-NotifTask.ps1 @@ -1,39 +1,49 @@ # Function to send the notifications to user -function Start-NotifTask +function Start-NotifTask { [CmdletBinding()] - param( - [String]$Title = 'Winget-AutoUpdate', - [String]$Message, - [String]$MessageType, - [String]$Balise = 'WAU', - [String]$OnClickAction, - [String]$Body, - [String]$Button1Text, - [String]$Button1Action, - [Switch]$ButtonDismiss = $false, - [Switch]$UserRun = $false + param ( + [String] + $Title = 'Winget-AutoUpdate', + [String] + $Message, + [String] + $MessageType, + [String] + $Balise = 'WAU', + [String] + $OnClickAction, + [String] + $Body, + [String] + $Button1Text, + [String] + $Button1Action, + [Switch] + $ButtonDismiss = $false, + [Switch] + $UserRun = $false ) - - if (($WAUConfig.WAU_NotificationLevel -eq 'Full') -or ($WAUConfig.WAU_NotificationLevel -eq 'SuccessOnly' -and $MessageType -eq 'Success') -or ($UserRun)) + + if (($WAUConfig.WAU_NotificationLevel -eq 'Full') -or ($WAUConfig.WAU_NotificationLevel -eq 'SuccessOnly' -and $MessageType -eq 'Success') -or ($UserRun)) { # XML Toast template creation [xml]$ToastTemplate = New-Object -TypeName system.Xml.XmlDocument $ToastTemplate.LoadXml("") - + # Creation of visual node $XMLvisual = $ToastTemplate.CreateElement('visual') - + # Creation of a binding node $XMLbinding = $ToastTemplate.CreateElement('binding') $null = $XMLvisual.AppendChild($XMLbinding) $XMLbindingAtt1 = ($ToastTemplate.CreateAttribute('template')) $XMLbindingAtt1.Value = 'ToastGeneric' $null = $XMLbinding.Attributes.Append($XMLbindingAtt1) - + $XMLimagepath = ('{0}\icons\{1}.png' -f $WorkingDir, $MessageType) - if (Test-Path -Path $XMLimagepath -ErrorAction SilentlyContinue) + if (Test-Path -Path $XMLimagepath -ErrorAction SilentlyContinue) { # Creation of a image node $XMLimage = $ToastTemplate.CreateElement('image') @@ -45,8 +55,8 @@ function Start-NotifTask $XMLimageAtt2.Value = ('{0}\icons\{1}.png' -f $WorkingDir, $MessageType) $null = $XMLimage.Attributes.Append($XMLimageAtt2) } - - if ($Title) + + if ($Title) { # Creation of a text node $XMLtitle = $ToastTemplate.CreateElement('text') @@ -54,8 +64,8 @@ function Start-NotifTask $null = $XMLtitle.AppendChild($XMLtitleText) $null = $XMLbinding.AppendChild($XMLtitle) } - - if ($Message) + + if ($Message) { # Creation of a text node $XMLtext = $ToastTemplate.CreateElement('text') @@ -63,17 +73,17 @@ function Start-NotifTask $null = $XMLtext.AppendChild($XMLtextText) $null = $XMLbinding.AppendChild($XMLtext) } - - if ($Body) + + if ($Body) { # Creation of a group node $XMLgroup = $ToastTemplate.CreateElement('group') $null = $XMLbinding.AppendChild($XMLgroup) - + # Creation of a subgroup node $XMLsubgroup = $ToastTemplate.CreateElement('subgroup') $null = $XMLgroup.AppendChild($XMLsubgroup) - + # Creation of a text node $XMLcontent = $ToastTemplate.CreateElement('text') $XMLcontentText = $ToastTemplate.CreateTextNode($Body) @@ -86,11 +96,11 @@ function Start-NotifTask $XMLcontentAtt2.Value = 'true' $null = $XMLcontent.Attributes.Append($XMLcontentAtt2) } - + # Creation of actions node $XMLactions = $ToastTemplate.CreateElement('actions') - - if ($Button1Text) + + if ($Button1Text) { # Creation of action node $XMLaction = $ToastTemplate.CreateElement('action') @@ -98,7 +108,7 @@ function Start-NotifTask $XMLactionAtt1 = $ToastTemplate.CreateAttribute('content') $XMLactionAtt1.Value = $Button1Text $null = $XMLaction.Attributes.Append($XMLactionAtt1) - if ($Button1Action) + if ($Button1Action) { $XMLactionAtt2 = $ToastTemplate.CreateAttribute('arguments') $XMLactionAtt2.Value = $Button1Action @@ -108,8 +118,8 @@ function Start-NotifTask $null = $XMLaction.Attributes.Append($XMLactionAtt3) } } - - if ($ButtonDismiss) + + if ($ButtonDismiss) { # Creation of action node $XMLaction = $ToastTemplate.CreateElement('action') @@ -124,39 +134,39 @@ function Start-NotifTask $XMLactionAtt3.Value = 'system' $null = $XMLaction.Attributes.Append($XMLactionAtt3) } - + # Creation of tag node $XMLtag = $ToastTemplate.CreateElement('tag') $XMLtagText = $ToastTemplate.CreateTextNode($Balise) $null = $XMLtag.AppendChild($XMLtagText) - + # Add the visual node to the xml $null = $ToastTemplate.LastChild.AppendChild($XMLvisual) $null = $ToastTemplate.LastChild.AppendChild($XMLactions) $null = $ToastTemplate.LastChild.AppendChild($XMLtag) - - if ($OnClickAction) + + if ($OnClickAction) { $null = $ToastTemplate.toast.SetAttribute('activationType', 'Protocol') $null = $ToastTemplate.toast.SetAttribute('launch', $OnClickAction) } - + # if not "Interactive" user, run as system - if ($IsSystem) + if ($IsSystem) { # Save XML to File $ToastTemplateLocation = ('{0}\config\' -f $WAUConfig.InstallLocation) - if (!(Test-Path -Path $ToastTemplateLocation -ErrorAction SilentlyContinue)) + if (!(Test-Path -Path $ToastTemplateLocation -ErrorAction SilentlyContinue)) { $null = (New-Item -ItemType Directory -Force -Confirm:$false -Path $ToastTemplateLocation) } - + $ToastTemplate.Save(('{0}\notif.xml' -f $ToastTemplateLocation)) - + # Run Notify scheduled task to notify conneted users $null = (Get-ScheduledTask -TaskName 'Winget-AutoUpdate-Notify' -ErrorAction SilentlyContinue | Start-ScheduledTask -ErrorAction SilentlyContinue) } - else + else { #else, run as connected user # Load Assemblies @@ -164,20 +174,20 @@ function Start-NotifTask $null = (Add-Type -AssemblyName Windows.Data) $null = [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] $null = [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] - + # Prepare XML $ToastXml = [Windows.Data.Xml.Dom.XmlDocument]::New() $ToastXml.LoadXml($ToastTemplate.OuterXml) - + # Specify Launcher App ID $LauncherID = 'Windows.SystemToast.Winget.Notification' - + # Prepare and Create Toast $ToastMessage = [Windows.UI.Notifications.ToastNotification]::New($ToastXml) $ToastMessage.Tag = $ToastTemplate.toast.tag [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($LauncherID).Show($ToastMessage) } - + # Wait for notification to display Start-Sleep -Seconds 3 } diff --git a/Winget-AutoUpdate/functions/Test-ListPath.ps1 b/Winget-AutoUpdate/functions/Test-ListPath.ps1 index 210a1cc..86fe8e7 100644 --- a/Winget-AutoUpdate/functions/Test-ListPath.ps1 +++ b/Winget-AutoUpdate/functions/Test-ListPath.ps1 @@ -1,53 +1,56 @@ # Function to check Block/Allow List External Path -function Test-ListPath +function Test-ListPath { # URL, UNC or Local Path [CmdletBinding()] param ( - [string]$ListPath, - [string]$UseWhiteList, - [string]$WingetUpdatePath + [string] + $ListPath, + [string] + $UseWhiteList, + [string] + $WingetUpdatePath ) - if ($UseWhiteList) + if ($UseWhiteList) { $ListType = 'included_apps.txt' } - else + else { $ListType = 'excluded_apps.txt' } - + # Get local and external list paths $LocalList = -join ($WingetUpdatePath, '\', $ListType) $ExternalList = -join ($ListPath, '\', $ListType) - + # Check if a list exists - if (Test-Path -Path $LocalList -ErrorAction SilentlyContinue) + if (Test-Path -Path $LocalList -ErrorAction SilentlyContinue) { $dateLocal = (Get-Item -Path $LocalList).LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss') } - + # If path is URL - if ($ListPath -like 'http*') + if ($ListPath -like 'http*') { $ExternalList = -join ($ListPath, '/', $ListType) $wc = (New-Object -TypeName System.Net.WebClient) - - try + + try { $null = $wc.OpenRead($ExternalList).Close() $dateExternal = ([DateTime]$wc.ResponseHeaders['Last-Modified']).ToString('yyyy-MM-dd HH:mm:ss') - - if ($dateExternal -gt $dateLocal) + + if ($dateExternal -gt $dateLocal) { - try + try { $wc.DownloadFile($ExternalList, $LocalList) } - catch + catch { $Script:ReachNoPath = $True return $False @@ -55,52 +58,52 @@ function Test-ListPath return $True } } - catch + catch { - try + try { $content = $wc.DownloadString(('{0}' -f $ExternalList)) - - if ($null -ne $content -and $content -match '\w\.\w') + + if ($null -ne $content -and $content -match '\w\.\w') { $wc.DownloadFile($ExternalList, $LocalList) return $True } - else + else { $Script:ReachNoPath = $True return $False } } - catch + catch { $Script:ReachNoPath = $True return $False } } } - else + else { # If path is UNC or local - if (Test-Path -Path $ExternalList) + if (Test-Path -Path $ExternalList) { - try + try { $dateExternal = (Get-Item -Path ('{0}' -f $ExternalList)).LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss') } - catch + catch { $Script:ReachNoPath = $True return $False } - - if ($dateExternal -gt $dateLocal) + + if ($dateExternal -gt $dateLocal) { - try + try { Copy-Item -Path $ExternalList -Destination $LocalList -Force } - catch + catch { $Script:ReachNoPath = $True return $False @@ -108,11 +111,11 @@ function Test-ListPath return $True } } - else + else { $Script:ReachNoPath = $True } - + return $False } } diff --git a/Winget-AutoUpdate/functions/Test-Mods.ps1 b/Winget-AutoUpdate/functions/Test-Mods.ps1 index 03e53c1..598c548 100644 --- a/Winget-AutoUpdate/functions/Test-Mods.ps1 +++ b/Winget-AutoUpdate/functions/Test-Mods.ps1 @@ -1,49 +1,50 @@ # Function to check if modification exists within 'mods' directory -function Test-Mods +function Test-Mods { # Takes care of a null situation [CmdletBinding()] param ( - [string]$app + [string] + $app ) - + $ModsPreInstall = $null $ModsOverride = $null $ModsUpgrade = $null $ModsInstall = $null $ModsInstalled = $null $Mods = ('{0}\mods' -f $WorkingDir) - - if (Test-Path -Path ('{0}\{1}-*' -f $Mods, $app) -ErrorAction SilentlyContinue) + + if (Test-Path -Path ('{0}\{1}-*' -f $Mods, $app) -ErrorAction SilentlyContinue) { - if (Test-Path -Path ('{0}\{1}-preinstall.ps1' -f $Mods, $app) -ErrorAction SilentlyContinue) + if (Test-Path -Path ('{0}\{1}-preinstall.ps1' -f $Mods, $app) -ErrorAction SilentlyContinue) { $ModsPreInstall = ('{0}\{1}-preinstall.ps1' -f $Mods, $app) } - - if (Test-Path -Path ('{0}\{1}-override.txt' -f $Mods, $app) -ErrorAction SilentlyContinue) + + if (Test-Path -Path ('{0}\{1}-override.txt' -f $Mods, $app) -ErrorAction SilentlyContinue) { $ModsOverride = Get-Content -Path ('{0}\{1}-override.txt' -f $Mods, $app) -Raw } - - if (Test-Path -Path ('{0}\{1}-install.ps1' -f $Mods, $app) -ErrorAction SilentlyContinue) + + if (Test-Path -Path ('{0}\{1}-install.ps1' -f $Mods, $app) -ErrorAction SilentlyContinue) { $ModsInstall = ('{0}\{1}-install.ps1' -f $Mods, $app) $ModsUpgrade = ('{0}\{1}-install.ps1' -f $Mods, $app) } - - if (Test-Path -Path ('{0}\{1}-upgrade.ps1' -f $Mods, $app) -ErrorAction SilentlyContinue) + + if (Test-Path -Path ('{0}\{1}-upgrade.ps1' -f $Mods, $app) -ErrorAction SilentlyContinue) { $ModsUpgrade = ('{0}\{1}-upgrade.ps1' -f $Mods, $app) } - - if (Test-Path -Path ('{0}\{1}-installed.ps1' -f $Mods, $app) -ErrorAction SilentlyContinue) + + if (Test-Path -Path ('{0}\{1}-installed.ps1' -f $Mods, $app) -ErrorAction SilentlyContinue) { $ModsInstalled = ('{0}\{1}-installed.ps1' -f $Mods, $app) } } - + return $ModsPreInstall, $ModsOverride, $ModsUpgrade, $ModsInstall, $ModsInstalled } diff --git a/Winget-AutoUpdate/functions/Test-ModsPath.ps1 b/Winget-AutoUpdate/functions/Test-ModsPath.ps1 index 3be0e88..5cdf7dd 100644 --- a/Winget-AutoUpdate/functions/Test-ModsPath.ps1 +++ b/Winget-AutoUpdate/functions/Test-ModsPath.ps1 @@ -1,6 +1,6 @@ #Function to check mods External Path -function Test-ModsPath +function Test-ModsPath { # URL, UNC or Local Path # Get local and external Mods paths @@ -8,38 +8,41 @@ function Test-ModsPath [CmdletBinding()] param ( - [string]$ModsPath, - [string]$WingetUpdatePath, - [string]$AzureBlobSASURL + [string] + $ModsPath, + [string] + $WingetUpdatePath, + [string] + $AzureBlobSASURL ) $LocalMods = -join ($WingetUpdatePath, '\', 'mods') $ExternalMods = $ModsPath - + # Get File Names Locally $InternalModsNames = (Get-ChildItem -Path $LocalMods -Name -Recurse -Include *.ps1, *.txt -ErrorAction SilentlyContinue) $InternalBinsNames = (Get-ChildItem -Path $LocalMods"\bins" -Name -Recurse -Include *.exe -ErrorAction SilentlyContinue) - + # If path is URL - if ($ExternalMods -like 'http*') + if ($ExternalMods -like 'http*') { # enable TLS 1.2 and TLS 1.1 protocols [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Tls11 # Get Index of $ExternalMods (or index page with href listing of all the Mods) - try + try { $WebResponse = (Invoke-WebRequest -Uri $ExternalMods -UseBasicParsing) } - catch + catch { $Script:ReachNoPath = $True - + return $False } - + # Check for bins, download if newer. Delete if not external $ExternalBins = ('{0}/bins' -f $ModsPath) - if ($WebResponse -match 'bins/') + if ($WebResponse -match 'bins/') { $BinResponse = Invoke-WebRequest -Uri $ExternalBins -UseBasicParsing # Collect the external list of href links @@ -49,9 +52,9 @@ function Test-ModsPath # Modify strings to HREF:s $index = 0 - foreach ($Bin in $CleanBinLinks) + foreach ($Bin in $CleanBinLinks) { - if ($Bin) + if ($Bin) { $CleanBinLinks[$index] = ' ' + $Bin + '' } @@ -61,36 +64,36 @@ function Test-ModsPath # Delete Local Bins that don't exist Externally $index = 0 $CleanLinks = $BinLinks -replace '/.*/', '' - - foreach ($Bin in $InternalBinsNames) + + foreach ($Bin in $InternalBinsNames) { - If ($CleanLinks -notcontains $Bin) + if ($CleanLinks -notcontains $Bin) { $null = (Remove-Item -Path $LocalMods\bins\$Bin -Force -Confirm:$False -ErrorAction SilentlyContinue) } - + $index++ } - + $CleanBinLinks = $BinLinks -replace '/.*/', '' $Bin = '' # Loop through all links $wc = New-Object -TypeName System.Net.WebClient $CleanBinLinks | ForEach-Object -Process { # Check for .exe in listing/HREF:s in an index page pointing to .exe - if ($_ -like '*.exe') + if ($_ -like '*.exe') { $dateExternalBin = '' $dateLocalBin = '' $null = $wc.OpenRead(('{0}/{1}' -f $ExternalBins, $_)).Close() $dateExternalBin = ([DateTime]$wc.ResponseHeaders['Last-Modified']).ToString('yyyy-MM-dd HH:mm:ss') - - if (Test-Path -Path $LocalMods"\bins\"$_) + + if (Test-Path -Path $LocalMods"\bins\"$_) { $dateLocalBin = (Get-Item -Path ('{0}\bins\{1}' -f $LocalMods, $_)).LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss') } - - if ($dateExternalBin -gt $dateLocalBin) + + if ($dateExternalBin -gt $dateLocalBin) { $SaveBin = Join-Path -Path ('{0}\bins' -f $LocalMods) -ChildPath $_ Invoke-WebRequest -Uri ('{0}/{1}' -f $ExternalBins, $_) -OutFile $SaveBin.Replace('%20', ' ') -UseBasicParsing @@ -98,76 +101,76 @@ function Test-ModsPath } } } - + # Collect the external list of href links $ModLinks = $WebResponse.Links | Select-Object -ExpandProperty HREF # If there's a directory path in the HREF:s, delete it (IIS) $CleanLinks = $ModLinks -replace '/.*/', '' # Modify strings to HREF:s $index = 0 - - foreach ($Mod in $CleanLinks) + + foreach ($Mod in $CleanLinks) { - if ($Mod) + if ($Mod) { $CleanLinks[$index] = ' ' + $Mod + '' } $index++ } - + # Delete Local Mods that don't exist Externally $DeletedMods = 0 $index = 0 $CleanLinks = $ModLinks -replace '/.*/', '' - - foreach ($Mod in $InternalModsNames) + + foreach ($Mod in $InternalModsNames) { - If ($CleanLinks -notcontains $Mod) + if ($CleanLinks -notcontains $Mod) { $null = (Remove-Item -Path $LocalMods\$Mod -Force -Confirm:$False -ErrorAction SilentlyContinue) $DeletedMods++ } $index++ } - + $CleanLinks = $ModLinks -replace '/.*/', '' - + # Loop through all links - + $CleanLinks | ForEach-Object -Process { # Check for .ps1/.txt in listing/HREF:s in an index page pointing to .ps1/.txt - if (($_ -like '*.ps1') -or ($_ -like '*.txt')) + if (($_ -like '*.ps1') -or ($_ -like '*.txt')) { - try + try { $dateExternalMod = '' $dateLocalMod = '' $null = $wc.OpenRead(('{0}/{1}' -f $ExternalMods, $_)).Close() $dateExternalMod = ([DateTime]$wc.ResponseHeaders['Last-Modified']).ToString('yyyy-MM-dd HH:mm:ss') - - if (Test-Path -Path $LocalMods"\"$_) + + if (Test-Path -Path $LocalMods"\"$_) { $dateLocalMod = (Get-Item -Path ('{0}\{1}' -f $LocalMods, $_)).LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss') } - - if ($dateExternalMod -gt $dateLocalMod) + + if ($dateExternalMod -gt $dateLocalMod) { - try + try { $SaveMod = Join-Path -Path ('{0}\' -f $LocalMods) -ChildPath $_ $Mod = '{0}/{1}' -f $ModsPath.TrimEnd('/'), $_ $null = (Invoke-WebRequest -Uri $Mod -OutFile $SaveMod -UseBasicParsing) $ModsUpdated++ } - catch + catch { $Script:ReachNoPath = $True } } } - catch + catch { - if (($_ -like '*.ps1') -or ($_ -like '*.txt')) + if (($_ -like '*.ps1') -or ($_ -like '*.txt')) { $Script:ReachNoPath = $True } @@ -177,131 +180,131 @@ function Test-ModsPath return $ModsUpdated, $DeletedMods } # If Path is Azure Blob - elseif ($ExternalMods -like 'AzureBlob') + elseif ($ExternalMods -like 'AzureBlob') { Write-ToLog -LogMsg 'Azure Blob Storage set as mod source' Write-ToLog -LogMsg 'Checking AZCopy' Get-AZCopy $WingetUpdatePath - + # Safety check to make sure we really do have azcopy.exe and a Blob URL - if ((Test-Path -Path ('{0}\azcopy.exe' -f $WingetUpdatePath) -PathType Leaf) -and ($null -ne $AzureBlobSASURL)) + if ((Test-Path -Path ('{0}\azcopy.exe' -f $WingetUpdatePath) -PathType Leaf) -and ($null -ne $AzureBlobSASURL)) { Write-ToLog -LogMsg 'Syncing Blob storage with local storage' - + $AZCopySyncOutput = & $WingetUpdatePath\azcopy.exe sync $AzureBlobSASURL $LocalMods --from-to BlobLocal --delete-destination=true $AZCopyOutputLines = $AZCopySyncOutput.Split([Environment]::NewLine) - - foreach ( $_ in $AZCopyOutputLines) + + foreach ($_ in $AZCopyOutputLines) { $AZCopySyncAdditionsRegex = [regex]::new('(?<=Number of Copy Transfers Completed:\s+)\d+') $AZCopySyncDeletionsRegex = [regex]::new('(?<=Number of Deletions at Destination:\s+)\d+') $AZCopySyncErrorRegex = [regex]::new('^Cannot perform sync due to error:') - - $AZCopyAdditions = [int] $AZCopySyncAdditionsRegex.Match($_).Value - $AZCopyDeletions = [int] $AZCopySyncDeletionsRegex.Match($_).Value - - if ($AZCopyAdditions -ne 0) + + $AZCopyAdditions = [int]$AZCopySyncAdditionsRegex.Match($_).Value + $AZCopyDeletions = [int]$AZCopySyncDeletionsRegex.Match($_).Value + + if ($AZCopyAdditions -ne 0) { $ModsUpdated = $AZCopyAdditions } - - if ($AZCopyDeletions -ne 0) + + if ($AZCopyDeletions -ne 0) { $DeletedMods = $AZCopyDeletions } - - if ($AZCopySyncErrorRegex.Match($_).Value) + + if ($AZCopySyncErrorRegex.Match($_).Value) { - Write-ToLog -LogMsg ('AZCopy Sync Error! {0}' -f $_) + Write-ToLog -LogMsg ('AZCopy Sync Error! {0}' -f $_) } } } - else + else { Write-ToLog -LogMsg "Error 'azcopy.exe' or SAS Token not found!" } - + return $ModsUpdated, $DeletedMods } - else + else { # If path is UNC or local $ExternalBins = ('{0}\bins' -f $ModsPath) - - if (Test-Path -Path $ExternalBins"\*.exe") + + if (Test-Path -Path $ExternalBins"\*.exe") { $ExternalBinsNames = (Get-ChildItem -Path $ExternalBins -Name -Recurse -Include *.exe) - + # Delete Local Bins that don't exist Externally - foreach ($Bin in $InternalBinsNames) + foreach ($Bin in $InternalBinsNames) { - If ($Bin -notin $ExternalBinsNames ) + if ($Bin -notin $ExternalBinsNames) { $null = (Remove-Item -Path $LocalMods\bins\$Bin -Force -Confirm:$False -ErrorAction SilentlyContinue) } } - + # Copy newer external bins - foreach ($Bin in $ExternalBinsNames) + foreach ($Bin in $ExternalBinsNames) { $dateExternalBin = '' $dateLocalBin = '' - - if (Test-Path -Path $LocalMods"\bins\"$Bin) + + if (Test-Path -Path $LocalMods"\bins\"$Bin) { $dateLocalBin = (Get-Item -Path ('{0}\bins\{1}' -f $LocalMods, $Bin)).LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss') } - + $dateExternalBin = (Get-Item -Path ('{0}\{1}' -f $ExternalBins, $Bin)).LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss') - - if ($dateExternalBin -gt $dateLocalBin) + + if ($dateExternalBin -gt $dateLocalBin) { $null = Copy-Item -Path $ExternalBins\$Bin -Destination $LocalMods\bins\$Bin -Force -ErrorAction SilentlyContinue } } } - - if ((Test-Path -Path $ExternalMods"\*.ps1") -or (Test-Path -Path $ExternalMods"\*.txt")) + + if ((Test-Path -Path $ExternalMods"\*.ps1") -or (Test-Path -Path $ExternalMods"\*.txt")) { # Get File Names Externally $ExternalModsNames = Get-ChildItem -Path $ExternalMods -Name -Recurse -Include *.ps1, *.txt - + # Delete Local Mods that don't exist Externally $DeletedMods = 0 - - foreach ($Mod in $InternalModsNames) + + foreach ($Mod in $InternalModsNames) { - If ($Mod -notin $ExternalModsNames ) + if ($Mod -notin $ExternalModsNames) { $null = Remove-Item -Path $LocalMods\$Mod -Force -ErrorAction SilentlyContinue $DeletedMods++ } } - + # Copy newer external mods - foreach ($Mod in $ExternalModsNames) + foreach ($Mod in $ExternalModsNames) { $dateExternalMod = '' $dateLocalMod = '' - if (Test-Path -Path $LocalMods"\"$Mod) + if (Test-Path -Path $LocalMods"\"$Mod) { $dateLocalMod = (Get-Item -Path ('{0}\{1}' -f $LocalMods, $Mod)).LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss') } - + $dateExternalMod = (Get-Item -Path ('{0}\{1}' -f $ExternalMods, $Mod)).LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss') - - if ($dateExternalMod -gt $dateLocalMod) + + if ($dateExternalMod -gt $dateLocalMod) { $null = Copy-Item -Path $ExternalMods\$Mod -Destination $LocalMods\$Mod -Force -ErrorAction SilentlyContinue $ModsUpdated++ } } } - else + else { $Script:ReachNoPath = $True } - + return $ModsUpdated, $DeletedMods } } diff --git a/Winget-AutoUpdate/functions/Test-Network.ps1 b/Winget-AutoUpdate/functions/Test-Network.ps1 index 7a50781..d0c7eb3 100644 --- a/Winget-AutoUpdate/functions/Test-Network.ps1 +++ b/Winget-AutoUpdate/functions/Test-Network.ps1 @@ -1,58 +1,58 @@ # Function to check the connectivity -function Test-Network +function Test-Network { #Init - + $timeout = 0 - + # Test connectivity during 30 min then timeout Write-ToLog -LogMsg 'Checking internet connection...' -LogColor 'Yellow' - While ($timeout -lt 1800) + while ($timeout -lt 1800) { $URLtoTest = 'https://raw.githubusercontent.com/Romanitho/Winget-AutoUpdate/main/LICENSE' $URLcontent = ((Invoke-WebRequest -Uri $URLtoTest -UseBasicParsing).content) - - if ($URLcontent -like '*MIT License*') + + if ($URLcontent -like '*MIT License*') { Write-ToLog -LogMsg 'Connected !' -LogColor 'Green' - + # Check for metered connection $null = (Add-Type -AssemblyName Windows.Networking) $null = [Windows.Networking.Connectivity.NetworkInformation, Windows, ContentType = WindowsRuntime] $cost = [Windows.Networking.Connectivity.NetworkInformation]::GetInternetConnectionProfile().GetConnectionCost() - - if ($cost.ApproachingDataLimit -or $cost.OverDataLimit -or $cost.Roaming -or $cost.BackgroundDataUsageRestricted -or ($cost.NetworkCostType -ne 'Unrestricted')) + + if ($cost.ApproachingDataLimit -or $cost.OverDataLimit -or $cost.Roaming -or $cost.BackgroundDataUsageRestricted -or ($cost.NetworkCostType -ne 'Unrestricted')) { Write-ToLog -LogMsg 'Metered connection detected.' -LogColor 'Yellow' - - if ($WAUConfig.WAU_DoNotRunOnMetered -eq 1) + + if ($WAUConfig.WAU_DoNotRunOnMetered -eq 1) { Write-ToLog -LogMsg 'WAU is configured to bypass update checking on metered connection' return $false } - else + else { Write-ToLog -LogMsg 'WAU is configured to force update checking on metered connection' return $true } } - else + else { return $true } } - else + else { Start-Sleep -Seconds 10 $timeout += 10 - + # Send Warning Notif if no connection for 5 min - if ($timeout -eq 300) + if ($timeout -eq 300) { # Log Write-ToLog -LogMsg "Notify 'No connection' sent." -LogColor 'Yellow' - + # Notif $Title = $NotifLocale.local.outputs.output[0].title $Message = $NotifLocale.local.outputs.output[0].message @@ -62,16 +62,16 @@ function Test-Network } } } - + # Send Timeout Notif if no connection for 30 min Write-ToLog -LogMsg 'Timeout. No internet connection !' -LogColor 'Red' - + # Notif $Title = $NotifLocale.local.outputs.output[1].title $Message = $NotifLocale.local.outputs.output[1].message $MessageType = 'error' $Balise = 'Connection' Start-NotifTask -Title $Title -Message $Message -MessageType $MessageType -Balise $Balise - + return $false } diff --git a/Winget-AutoUpdate/functions/Test-PendingReboot.ps1 b/Winget-AutoUpdate/functions/Test-PendingReboot.ps1 index fb4235b..e9ea46e 100644 --- a/Winget-AutoUpdate/functions/Test-PendingReboot.ps1 +++ b/Winget-AutoUpdate/functions/Test-PendingReboot.ps1 @@ -1,34 +1,34 @@ # Function to check if there is a Pending Reboot -function Test-PendingReboot +function Test-PendingReboot { $Computer = $env:COMPUTERNAME $PendingReboot = $false - + $HKLM = [UInt32] '0x80000002' $WMI_Reg = [WMIClass] ('\\{0}\root\default:StdRegProv' -f $Computer) - - if ($WMI_Reg) + + if ($WMI_Reg) { - if (($WMI_Reg.EnumKey($HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\')).sNames -contains 'RebootPending') + if (($WMI_Reg.EnumKey($HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\')).sNames -contains 'RebootPending') { - $PendingReboot = $true + $PendingReboot = $true } - if (($WMI_Reg.EnumKey($HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\')).sNames -contains 'RebootRequired') + if (($WMI_Reg.EnumKey($HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\')).sNames -contains 'RebootRequired') { - $PendingReboot = $true + $PendingReboot = $true } - + # Checking for SCCM namespace $SCCM_Namespace = Get-WmiObject -Namespace ROOT\CCM\ClientSDK -List -ComputerName $Computer -ErrorAction Ignore - if ($SCCM_Namespace) + if ($SCCM_Namespace) { - if (([WmiClass]('\\{0}\ROOT\CCM\ClientSDK:CCM_ClientUtilities' -f $Computer)).DetermineIfRebootPending().RebootPending -eq $true) + if (([WmiClass]('\\{0}\ROOT\CCM\ClientSDK:CCM_ClientUtilities' -f $Computer)).DetermineIfRebootPending().RebootPending -eq $true) { - $PendingReboot = $true + $PendingReboot = $true } } } - + return $PendingReboot } diff --git a/Winget-AutoUpdate/functions/Update-App.ps1 b/Winget-AutoUpdate/functions/Update-App.ps1 index d9c3b49..a5549be 100644 --- a/Winget-AutoUpdate/functions/Update-App.ps1 +++ b/Winget-AutoUpdate/functions/Update-App.ps1 @@ -1,6 +1,6 @@ # Function to update an App -Function Update-App +function Update-App { # Get App Info [CmdletBinding()] @@ -9,11 +9,11 @@ Function Update-App $app ) $ReleaseNoteURL = Get-AppInfo $app.Id - if ($ReleaseNoteURL) + if ($ReleaseNoteURL) { $Button1Text = $NotifLocale.local.outputs.output[10].message } - + # Send available update notification Write-ToLog -LogMsg ('Updating {0} from {1} to {2}...' -f $app.Name, $app.Version, $app.AvailableVersion) -LogColor 'Cyan' $Title = $NotifLocale.local.outputs.output[2].title -f $($app.Name) @@ -21,99 +21,99 @@ Function Update-App $MessageType = 'info' $Balise = $($app.Name) Start-NotifTask -Title $Title -Message $Message -MessageType $MessageType -Balise $Balise -Button1Action $ReleaseNoteURL -Button1Text $Button1Text - + # Check if mods exist for preinstall/install/upgrade $ModsPreInstall, $ModsOverride, $ModsUpgrade, $ModsInstall, $ModsInstalled = Test-Mods $($app.Id) - + # Winget upgrade Write-ToLog -LogMsg ("########## WINGET UPGRADE PROCESS STARTS FOR APPLICATION ID '{0}' ##########" -f $app.Id) -LogColor 'Gray' - + # If PreInstall script exist - if ($ModsPreInstall) + if ($ModsPreInstall) { Write-ToLog -LogMsg ('Modifications for {0} before upgrade are being applied...' -f $app.Id) -LogColor 'Yellow' & "$ModsPreInstall" } - + # Run Winget Upgrade command - if ($ModsOverride) + if ($ModsOverride) { Write-ToLog -LogMsg ('-> Running (overriding default): Winget upgrade --id {0} --accept-package-agreements --accept-source-agreements --override {1}' -f $app.Id, $ModsOverride) & $Winget upgrade --id $($app.Id) --accept-package-agreements --accept-source-agreements --override $ModsOverride | Tee-Object -FilePath $LogFile -Append } - else + else { Write-ToLog -LogMsg ('-> Running: Winget upgrade --id {0} --accept-package-agreements --accept-source-agreements -h' -f $app.Id) & $Winget upgrade --id $($app.Id) --accept-package-agreements --accept-source-agreements -h | Tee-Object -FilePath $LogFile -Append } - - if ($ModsUpgrade) + + if ($ModsUpgrade) { Write-ToLog -LogMsg ('Modifications for {0} during upgrade are being applied...' -f $app.Id) -LogColor 'Yellow' & "$ModsUpgrade" } - + # Check if application updated properly $FailedToUpgrade = $false $ConfirmInstall = Confirm-Installation $($app.Id) $($app.AvailableVersion) - - if ($ConfirmInstall -ne $true) + + if ($ConfirmInstall -ne $true) { # Upgrade failed! # Test for a Pending Reboot (Component Based Servicing/WindowsUpdate/CCM_ClientUtilities) $PendingReboot = Test-PendingReboot - if ($PendingReboot -eq $true) + if ($PendingReboot -eq $true) { Write-ToLog -LogMsg ("-> A Pending Reboot lingers and probably prohibited {0} from upgrading...`n-> ...an install for {1} is NOT executed!" -f $app.Name) -LogColor 'Red' $FailedToUpgrade = $true break } - + # If app failed to upgrade, run Install command Write-ToLog -LogMsg ('-> An upgrade for {0} failed, now trying an install instead...' -f $app.Name) -LogColor 'Yellow' - - if ($ModsOverride) + + if ($ModsOverride) { Write-ToLog -LogMsg ('-> Running (overriding default): Winget install --id {0} --accept-package-agreements --accept-source-agreements --force --override {1}' -f $app.Id, $ModsOverride) & $Winget install --id $($app.Id) --accept-package-agreements --accept-source-agreements --force --override $ModsOverride | Tee-Object -FilePath $LogFile -Append } - else + else { Write-ToLog -LogMsg ('-> Running: Winget install --id {0} --accept-package-agreements --accept-source-agreements --force -h' -f $app.Id) & $Winget install --id $($app.Id) --accept-package-agreements --accept-source-agreements --force -h | Tee-Object -FilePath $LogFile -Append } - - if ($ModsInstall) + + if ($ModsInstall) { Write-ToLog -LogMsg ('Modifications for {0} during install are being applied...' -f $app.Id) -LogColor 'Yellow' & "$ModsInstall" } - + # Check if application installed properly $ConfirmInstall = Confirm-Installation $($app.Id) $($app.AvailableVersion) - if ($ConfirmInstall -eq $false) + if ($ConfirmInstall -eq $false) { $FailedToUpgrade = $true } } - - if ($FailedToUpgrade -eq $false) + + if ($FailedToUpgrade -eq $false) { - if ($ModsInstalled) + if ($ModsInstalled) { Write-ToLog -LogMsg ('Modifications for {0} after upgrade/install are being applied...' -f $app.Id) -LogColor 'Yellow' & "$ModsInstalled" } } - + Write-ToLog -LogMsg ("########## WINGET UPGRADE PROCESS FINISHED FOR APPLICATION ID '{0}' ##########" -f $app.Id) -LogColor 'Gray' - + # Notify installation - if ($FailedToUpgrade -eq $false) + if ($FailedToUpgrade -eq $false) { # Send success updated app notification Write-ToLog -LogMsg ('{0} updated to {1} !' -f $app.Name, $app.AvailableVersion) -LogColor 'Green' - + # Send Notif $Title = $NotifLocale.local.outputs.output[3].title -f $($app.Name) $Message = $NotifLocale.local.outputs.output[3].message -f $($app.AvailableVersion) @@ -122,11 +122,11 @@ Function Update-App Start-NotifTask -Title $Title -Message $Message -MessageType $MessageType -Balise $Balise -Button1Action $ReleaseNoteURL -Button1Text $Button1Text $Script:InstallOK += 1 } - else + else { # Send failed updated app notification Write-ToLog -LogMsg ('{0} update failed.' -f $app.Name) -LogColor 'Red' - + # Send Notif $Title = $NotifLocale.local.outputs.output[4].title -f $($app.Name) $Message = $NotifLocale.local.outputs.output[4].message diff --git a/Winget-AutoUpdate/functions/Update-WAU.ps1 b/Winget-AutoUpdate/functions/Update-WAU.ps1 index 0e9d74b..62f950e 100644 --- a/Winget-AutoUpdate/functions/Update-WAU.ps1 +++ b/Winget-AutoUpdate/functions/Update-WAU.ps1 @@ -1,68 +1,68 @@ # Function to update WAU -function Update-WAU +function Update-WAU { $OnClickAction = 'https://github.com/Romanitho/Winget-AutoUpdate/releases' $Button1Text = $NotifLocale.local.outputs.output[10].message - + #Send available update notification $Title = $NotifLocale.local.outputs.output[2].title -f 'Winget-AutoUpdate' $Message = $NotifLocale.local.outputs.output[2].message -f $WAUCurrentVersion, $WAUAvailableVersion $MessageType = 'info' Start-NotifTask -Title $Title -Message $Message -MessageType $MessageType -Button1Action $OnClickAction -Button1Text $Button1Text - + # Run WAU update - try + try { # Force to create a zip file $ZipFile = ('{0}\WAU_update.zip' -f $WorkingDir) $null = New-Item -Path $ZipFile -ItemType File -Force - + # Download the zip Write-ToLog -LogMsg ('Downloading the GitHub Repository version {0}' -f $WAUAvailableVersion) -LogColor 'Cyan' $null = (Invoke-RestMethod -Uri ('https://github.com/Romanitho/Winget-AutoUpdate/releases/download/v{0}/WAU.zip' -f ($WAUAvailableVersion)) -OutFile $ZipFile) - + # Extract Zip File Write-ToLog -LogMsg 'Unzipping the WAU Update package' -LogColor 'Cyan' $location = ('{0}\WAU_update' -f $WorkingDir) $null = (Expand-Archive -Path $ZipFile -DestinationPath $location -Force) $null = (Get-ChildItem -Path $location -Recurse | Unblock-File -ErrorAction SilentlyContinue) - + # Update scritps Write-ToLog -LogMsg 'Updating WAU...' -LogColor 'Yellow' $TempPath = (Resolve-Path -Path ('{0}\Winget-AutoUpdate\' -f $location) -ErrorAction SilentlyContinue)[0].Path - if ($TempPath) + if ($TempPath) { $null = (Copy-Item -Path ('{0}\*' -f $TempPath) -Destination ('{0}\' -f $WorkingDir) -Exclude 'icons' -Recurse -Force -Confirm:$false) } - + # Remove update zip file and update temp folder Write-ToLog -LogMsg 'Done. Cleaning temp files...' -LogColor 'Cyan' $null = (Remove-Item -Path $ZipFile -Force -Confirm:$false -ErrorAction SilentlyContinue) $null = (Remove-Item -Path $location -Recurse -Force -Confirm:$false -ErrorAction SilentlyContinue) - + # Set new version to registry $WAUConfig | New-ItemProperty -Name DisplayVersion -Value $WAUAvailableVersion -Force $WAUConfig | New-ItemProperty -Name VersionMajor -Value ([version]$WAUAvailableVersion.Replace('-', '.')).Major -Force $WAUConfig | New-ItemProperty -Name VersionMinor -Value ([version]$WAUAvailableVersion.Replace('-', '.')).Minor -Force - + # Set Post Update actions to 1 $WAUConfig | New-ItemProperty -Name WAU_PostUpdateActions -Value 1 -Force - + # Send success Notif Write-ToLog -LogMsg 'WAU Update completed.' -LogColor 'Green' $Title = $NotifLocale.local.outputs.output[3].title -f 'Winget-AutoUpdate' $Message = $NotifLocale.local.outputs.output[3].message -f $WAUAvailableVersion $MessageType = 'success' Start-NotifTask -Title $Title -Message $Message -MessageType $MessageType -Button1Action $OnClickAction -Button1Text $Button1Text - + # Rerun with newer version Write-ToLog -LogMsg 'Re-run WAU' Start-Process -FilePath powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"$WorkingDir\winget-upgrade.ps1`"" - + exit } - catch + catch { # Send Error Notif $Title = $NotifLocale.local.outputs.output[4].title -f 'Winget-AutoUpdate' diff --git a/Winget-AutoUpdate/functions/Write-ToLog.ps1 b/Winget-AutoUpdate/functions/Write-ToLog.ps1 index d1b7c21..6482edd 100644 --- a/Winget-AutoUpdate/functions/Write-ToLog.ps1 +++ b/Winget-AutoUpdate/functions/Write-ToLog.ps1 @@ -1,20 +1,22 @@ # Write to Log Function -function Write-ToLog +function Write-ToLog { # Get log [CmdletBinding()] param ( - [string]$LogMsg, - [string]$LogColor = 'White' + [string] + $LogMsg, + [string] + $LogColor = 'White' ) - + $Log = ('{0} - {1}' -f (Get-Date -UFormat '%T'), $LogMsg) - + #Echo log $Log | Write-Host -ForegroundColor $LogColor - + #Write log to file $Log | Out-File -FilePath $LogFile -Append -Force -Confirm:$false }