2022-10-18 13:23:39 +00:00
<#
2023-10-03 08:18:00 +00:00
. SYNOPSIS
Configure Winget to daily update installed apps .
2022-02-12 15:35:51 +00:00
2023-10-03 08:18:00 +00:00
. DESCRIPTION
Install powershell scripts and scheduled task to daily run Winget upgrade and notify connected users .
Posibility to exclude apps from auto-update
https : / / github . com / Romanitho / Winget-AutoUpdate
2022-02-12 15:35:51 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER Silent
Install Winget-AutoUpdate and prerequisites silently
2022-02-12 15:35:51 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER MaxLogFiles
Specify number of allowed log files ( Default is 3 of 0 - 99 : Setting MaxLogFiles to 0 don ' t delete any old archived log files , 1 keeps the original one and just let it grow )
2023-01-13 02:33:00 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER MaxLogSize
Specify the size of the log file in bytes before rotating . ( Default is 1048576 = 1 MB )
2023-01-13 02:33:00 +00:00
2023-10-30 17:42:58 +00:00
. PARAMETER WAUinstallPath
2023-10-03 08:18:00 +00:00
Specify Winget-AutoUpdate installation localtion . Default : C: \ ProgramData \ Winget-AutoUpdate \
2022-02-12 15:35:51 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER DoNotUpdate
Do not run Winget-AutoUpdate after installation . By default , Winget-AutoUpdate is run just after installation .
2022-03-07 01:35:40 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER DisableWAUAutoUpdate
Disable Winget-AutoUpdate update checking . By default , WAU auto update if new version is available on Github .
2022-02-12 15:35:51 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER UseWhiteList
Use White List instead of Black List . This setting will not create the " exclude_apps.txt " but " include_apps.txt "
2022-04-05 10:38:54 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER ListPath
Get Black / White List from Path ( URL / UNC / GPO / Local )
2022-09-20 01:22:29 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER ModsPath
Get mods from Path ( URL / UNC / Local / AzureBlob )
2023-03-07 15:17:40 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER AzureBlobURL
Set the Azure Storage Blob URL including the SAS token . The token requires at a minimum 'Read' and 'List' permissions . It is recommended to set this at the container level
2022-11-02 17:47:21 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER Uninstall
Remove scheduled tasks and scripts .
2022-04-02 17:24:18 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER NoClean
Keep critical files when installing / uninstalling
2022-07-30 07:31:05 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER DesktopShortcut
Create a shortcut for user interaction on the Desktop to run task " Winget-AutoUpdate "
2022-10-11 14:03:57 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER StartMenuShortcut
Create shortcuts for user interaction in the Start Menu to run task " Winget-AutoUpdate " , open Logs and Web Help
2022-10-11 14:03:57 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER NotificationLevel
Specify the Notification level : Full ( Default , displays all notification ) , SuccessOnly ( Only displays notification for success ) or None ( Does not show any popup ) .
2022-04-24 08:51:51 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER UpdatesAtLogon
Set WAU to run at user logon .
2022-04-30 10:00:39 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER UpdatesInterval
Specify the update frequency : Daily ( Default ) , BiDaily , Weekly , BiWeekly , Monthly or Never
2022-10-05 14:43:04 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER UpdatesAtTime
Specify the time of the update interval execution time . Default 6AM
2022-04-30 10:00:39 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER RunOnMetered
Run WAU on metered connection . Default No .
2022-06-29 15:32:03 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER InstallUserContext
Install WAU with system and user context executions
2022-10-24 23:43:50 +00:00
2023-10-03 08:18:00 +00:00
. PARAMETER BypassListForUsers
Configure WAU to bypass the Black / White list when run in user context . Applications installed in system context will be ignored under user context .
2022-10-10 14:05:36 +00:00
2023-10-03 08:18:00 +00:00
. EXAMPLE
. \ Winget-AutoUpdate -Install . ps1 -Silent -DoNotUpdate -MaxLogFiles 4 -MaxLogSize 2097152
2022-04-05 13:23:36 +00:00
2023-10-03 08:18:00 +00:00
. EXAMPLE
. \ Winget-AutoUpdate -Install . ps1 -Silent -UseWhiteList
2022-04-05 13:23:36 +00:00
2023-10-03 08:18:00 +00:00
. EXAMPLE
. \ Winget-AutoUpdate -Install . ps1 -Silent -ListPath https : / / www . domain . com / WAULists -StartMenuShortcut -UpdatesInterval BiDaily
2022-09-20 01:22:29 +00:00
2023-10-03 08:18:00 +00:00
. EXAMPLE
. \ Winget-AutoUpdate -Install . ps1 -Silent -ModsPath https : / / www . domain . com / WAUMods -DesktopShortcut -UpdatesInterval Weekly
2022-11-02 17:47:21 +00:00
2023-10-03 08:18:00 +00:00
. EXAMPLE
. \ Winget-AutoUpdate -Install . ps1 -Silent -UpdatesAtLogon -UpdatesInterval Weekly
2022-04-30 10:00:39 +00:00
2023-10-03 08:18:00 +00:00
. EXAMPLE
. \ Winget-AutoUpdate -Install . ps1 -Silent -Uninstall -NoClean
2022-07-30 07:31:05 +00:00
2022-02-12 15:35:51 +00:00
#>
[ CmdletBinding ( ) ]
2023-10-03 08:18:00 +00:00
param (
[ Parameter ( Mandatory = $False ) ] [ Alias ( 'S' ) ] [ Switch ] $Silent = $false ,
2023-10-30 17:42:58 +00:00
[ Parameter ( Mandatory = $False ) ] [ Alias ( 'Path' , 'WingetUpdatePath' ) ] [ String ] $WAUinstallPath = " $env:ProgramData \Winget-AutoUpdate " ,
2023-10-03 08:18:00 +00:00
[ Parameter ( Mandatory = $False ) ] [ Alias ( 'List' ) ] [ String ] $ListPath ,
[ Parameter ( Mandatory = $False ) ] [ Alias ( 'Mods' ) ] [ String ] $ModsPath ,
[ Parameter ( Mandatory = $False ) ] [ Alias ( 'AzureBlobURL' ) ] [ String ] $AzureBlobSASURL ,
[ Parameter ( Mandatory = $False ) ] [ Switch ] $DoNotUpdate = $false ,
[ Parameter ( Mandatory = $False ) ] [ Switch ] $DisableWAUAutoUpdate = $false ,
[ Parameter ( Mandatory = $False ) ] [ Switch ] $RunOnMetered = $false ,
[ Parameter ( Mandatory = $False ) ] [ Switch ] $Uninstall = $false ,
[ Parameter ( Mandatory = $False ) ] [ Switch ] $NoClean = $false ,
[ Parameter ( Mandatory = $False ) ] [ Switch ] $DesktopShortcut = $false ,
[ Parameter ( Mandatory = $False ) ] [ Switch ] $StartMenuShortcut = $false ,
[ Parameter ( Mandatory = $False ) ] [ Switch ] $UseWhiteList = $false ,
[ Parameter ( Mandatory = $False ) ] [ ValidateSet ( " Full " , " SuccessOnly " , " None " ) ] [ String ] $NotificationLevel = " Full " ,
[ Parameter ( Mandatory = $False ) ] [ Switch ] $UpdatesAtLogon = $false ,
[ Parameter ( Mandatory = $False ) ] [ ValidateSet ( " Daily " , " BiDaily " , " Weekly " , " BiWeekly " , " Monthly " , " Never " ) ] [ String ] $UpdatesInterval = " Daily " ,
[ Parameter ( Mandatory = $False ) ] [ DateTime ] $UpdatesAtTime = ( " 06am " ) ,
[ Parameter ( Mandatory = $False ) ] [ Switch ] $BypassListForUsers = $false ,
[ Parameter ( Mandatory = $False ) ] [ Switch ] $InstallUserContext = $false ,
[ Parameter ( Mandatory = $False ) ] [ ValidateRange ( 0 , 99 ) ] [ int32 ] $MaxLogFiles = 3 ,
[ Parameter ( Mandatory = $False ) ] [ int64 ] $MaxLogSize = 1048576 # in bytes, default is 1048576 = 1 MB
2022-02-12 15:35:51 +00:00
)
<# FUNCTIONS #>
2023-10-11 20:19:34 +00:00
#Include external Functions
. " $PSScriptRoot \Winget-AutoUpdate\functions\Invoke-ModsProtect.ps1 "
2023-10-12 02:22:15 +00:00
. " $PSScriptRoot \Winget-AutoUpdate\functions\Update-WinGet.ps1 "
. " $PSScriptRoot \Winget-AutoUpdate\functions\Update-StoreApps.ps1 "
2023-10-14 16:53:40 +00:00
. " $PSScriptRoot \Winget-AutoUpdate\functions\Add-Shortcut.ps1 "
2023-10-17 14:29:22 +00:00
. " $PSScriptRoot \Winget-AutoUpdate\functions\Write-ToLog.ps1 "
2023-10-11 20:19:34 +00:00
2023-10-03 08:18:00 +00:00
function Install-Prerequisites {
2023-10-17 20:13:54 +00:00
Write-ToLog " Checking prerequisites... " " Yellow "
2023-10-03 08:18:00 +00:00
#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 { $_ . GetValue ( " DisplayName " ) -like $Visual2019 -or $_ . GetValue ( " DisplayName " ) -like $Visual2022 }
#If not installed, ask for installation
if ( ! ( $path ) ) {
#If -silent option, force installation
if ( $Silent ) {
2023-10-30 17:42:58 +00:00
$InstallApp = $True
2023-10-03 08:18:00 +00:00
}
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 ) {
2023-10-30 17:42:58 +00:00
$InstallApp = $True
2023-10-03 08:18:00 +00:00
}
}
#Install if approved
2023-10-30 17:42:58 +00:00
if ( $InstallApp ) {
2023-10-03 08:18:00 +00:00
try {
2023-10-30 17:42:58 +00:00
#Get proc architecture
if ( $env:PROCESSOR_ARCHITECTURE -eq " ARM64 " ) {
$OSArch = " arm64 "
}
elseif ( $env:PROCESSOR_ARCHITECTURE -like " *64* " ) {
2023-10-03 08:18:00 +00:00
$OSArch = " x64 "
}
else {
$OSArch = " x86 "
}
2023-10-30 17:42:58 +00:00
2023-10-03 08:18:00 +00:00
$SourceURL = " https://aka.ms/vs/17/release/VC_redist. $OSArch .exe "
2023-10-30 17:42:58 +00:00
$Installer = $WAUinstallPath + " \VC_redist. $OSArch .exe "
Write-ToLog " -> Downloading VC_redist. $OSArch .exe... "
2023-10-03 08:18:00 +00:00
Invoke-WebRequest $SourceURL -UseBasicParsing -OutFile ( New-Item -Path $Installer -Force )
2023-10-17 14:29:22 +00:00
Write-ToLog " -> Installing VC_redist. $OSArch .exe... "
2023-10-30 17:42:58 +00:00
Start-Process -FilePath $Installer -Args " /passive /norestart " -Wait
Start-Sleep 1
2023-10-03 08:18:00 +00:00
Remove-Item $Installer -ErrorAction Ignore
2023-10-19 13:29:50 +00:00
Write-ToLog " -> MS Visual C++ 2015-2022 installed successfully `n " " Green "
2022-02-12 15:35:51 +00:00
}
2023-10-03 08:18:00 +00:00
catch {
2023-10-19 13:29:50 +00:00
Write-ToLog " -> MS Visual C++ 2015-2022 installation failed. `n " " Red "
2023-10-03 08:18:00 +00:00
Start-Sleep 3
2022-02-12 15:35:51 +00:00
}
2023-10-03 08:18:00 +00:00
}
else {
2023-10-19 13:29:50 +00:00
Write-ToLog " -> MS Visual C++ 2015-2022 will not be installed. `n " " Magenta "
2023-10-03 08:18:00 +00:00
}
}
else {
2023-10-19 13:29:50 +00:00
Write-ToLog " -> Prerequisites checked. OK `n " " Green "
2023-10-03 08:18:00 +00:00
}
2022-02-12 15:35:51 +00:00
}
2023-10-03 08:18:00 +00:00
function Install-WingetAutoUpdate {
2023-10-17 20:35:36 +00:00
Write-ToLog " Installing WAU... " " Yellow "
2023-10-03 08:18:00 +00:00
try {
2023-10-31 15:30:10 +00:00
#Copy files to location
2023-10-30 17:42:58 +00:00
if ( ! ( Test-Path $WAUinstallPath ) ) {
New-Item -ItemType Directory -Force -Path $WAUinstallPath | Out-Null
2023-10-31 15:30:10 +00:00
Copy-Item -Path " $PSScriptRoot \Winget-AutoUpdate\* " -Destination $WAUinstallPath -Recurse -Force -ErrorAction SilentlyContinue
2023-10-03 08:18:00 +00:00
}
2023-10-31 15:30:10 +00:00
elseif ( $NoClean ) {
#Keep critical files
Get-ChildItem -Path $WAUinstallPath -Exclude * . txt , mods , logs , icons | Remove-Item -Recurse -Force
Copy-Item -Path " $PSScriptRoot \Winget-AutoUpdate\* " -Destination $WAUinstallPath -Exclude icons -Recurse -Force -ErrorAction SilentlyContinue #Exclude icons if personalized
2023-10-30 22:50:51 +00:00
}
2023-10-03 08:18:00 +00:00
else {
2023-10-31 15:30:10 +00:00
#Keep logs only
Get-ChildItem -Path $WAUinstallPath -Exclude * . logs | Remove-Item -Recurse -Force
Copy-Item -Path " $PSScriptRoot \Winget-AutoUpdate\* " -Destination $WAUinstallPath -Recurse -Force -ErrorAction SilentlyContinue
2023-10-03 08:18:00 +00:00
}
2023-10-30 22:50:51 +00:00
2023-10-03 08:18:00 +00:00
#White List or Black List apps
if ( $UseWhiteList ) {
if ( ! $NoClean ) {
if ( ( Test-Path " $PSScriptRoot \included_apps.txt " ) ) {
2023-10-30 17:42:58 +00:00
Copy-Item -Path " $PSScriptRoot \included_apps.txt " -Destination $WAUinstallPath -Recurse -Force -ErrorAction SilentlyContinue
2023-10-03 08:18:00 +00:00
}
else {
if ( ! $ListPath ) {
2023-10-30 17:42:58 +00:00
New-Item -Path $WAUinstallPath -Name " included_apps.txt " -ItemType " file " -ErrorAction SilentlyContinue | Out-Null
2023-10-03 08:18:00 +00:00
}
}
2022-04-05 10:38:54 +00:00
}
2023-10-30 17:42:58 +00:00
elseif ( ! ( Test-Path " $WAUinstallPath \included_apps.txt " ) ) {
2023-10-03 08:18:00 +00:00
if ( ( Test-Path " $PSScriptRoot \included_apps.txt " ) ) {
2023-10-30 17:42:58 +00:00
Copy-Item -Path " $PSScriptRoot \included_apps.txt " -Destination $WAUinstallPath -Recurse -Force -ErrorAction SilentlyContinue
2023-10-03 08:18:00 +00:00
}
else {
if ( ! $ListPath ) {
2023-10-30 17:42:58 +00:00
New-Item -Path $WAUinstallPath -Name " included_apps.txt " -ItemType " file " -ErrorAction SilentlyContinue | Out-Null
2023-10-03 08:18:00 +00:00
}
}
2022-04-05 10:38:54 +00:00
}
2023-10-03 08:18:00 +00:00
}
else {
if ( ! $NoClean ) {
2023-10-30 17:42:58 +00:00
Copy-Item -Path " $PSScriptRoot \excluded_apps.txt " -Destination $WAUinstallPath -Recurse -Force -ErrorAction SilentlyContinue
2022-07-30 13:10:41 +00:00
}
2023-10-30 17:42:58 +00:00
elseif ( ! ( Test-Path " $WAUinstallPath \excluded_apps.txt " ) ) {
Copy-Item -Path " $PSScriptRoot \excluded_apps.txt " -Destination $WAUinstallPath -Recurse -Force -ErrorAction SilentlyContinue
2022-08-10 15:22:39 +00:00
}
2023-10-03 08:18:00 +00:00
}
# Set dummy regkeys for notification name and icon
& reg add " HKCR\AppUserModelId\Windows.SystemToast.Winget.Notification " / v DisplayName / t REG_EXPAND_SZ / d " Application Update " / f | Out-Null
& reg add " HKCR\AppUserModelId\Windows.SystemToast.Winget.Notification " / v IconUri / t REG_EXPAND_SZ / d % SystemRoot % \ system32 \ @WindowsUpdateToastIcon . png / f | Out-Null
2023-10-09 12:47:43 +00:00
# Clean potential old install
Get-ScheduledTask -TaskName " Winget-AutoUpdate " -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm: $False
Get-ScheduledTask -TaskName " Winget-AutoUpdate-Notify " -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm: $False
Get-ScheduledTask -TaskName " Winget-AutoUpdate-UserContext " -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm: $False
2023-10-05 15:51:41 +00:00
# Settings for the scheduled task for Updates (System)
2023-10-30 17:42:58 +00:00
$taskAction = New-ScheduledTaskAction -Execute " powershell.exe " -Argument " -NoProfile -ExecutionPolicy Bypass -File `" $( $WAUinstallPath ) \winget-upgrade.ps1 `" "
2023-10-03 08:18:00 +00:00
$taskTriggers = @ ( )
if ( $UpdatesAtLogon ) {
$tasktriggers + = New-ScheduledTaskTrigger -AtLogOn
}
if ( $UpdatesInterval -eq " Daily " ) {
$tasktriggers + = New-ScheduledTaskTrigger -Daily -At $UpdatesAtTime
}
elseif ( $UpdatesInterval -eq " BiDaily " ) {
$tasktriggers + = New-ScheduledTaskTrigger -Daily -At $UpdatesAtTime -DaysInterval 2
}
elseif ( $UpdatesInterval -eq " Weekly " ) {
$tasktriggers + = New-ScheduledTaskTrigger -Weekly -At $UpdatesAtTime -DaysOfWeek 2
}
elseif ( $UpdatesInterval -eq " BiWeekly " ) {
$tasktriggers + = New-ScheduledTaskTrigger -Weekly -At $UpdatesAtTime -DaysOfWeek 2 -WeeksInterval 2
}
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 ) {
$task = New-ScheduledTask -Action $taskAction -Principal $taskUserPrincipal -Settings $taskSettings -Trigger $taskTriggers
}
else {
$task = New-ScheduledTask -Action $taskAction -Principal $taskUserPrincipal -Settings $taskSettings
}
2023-10-05 15:51:41 +00:00
Register-ScheduledTask -TaskName 'Winget-AutoUpdate' -TaskPath 'WAU' -InputObject $task -Force | Out-Null
2023-10-03 08:18:00 +00:00
2023-10-05 15:51:41 +00:00
# Settings for the scheduled task in User context
2023-10-30 17:42:58 +00:00
$taskAction = New-ScheduledTaskAction -Execute " wscript.exe " -Argument " `" $( $WAUinstallPath ) \Invisible.vbs `" `" powershell.exe -NoProfile -ExecutionPolicy Bypass -File `" `" `" $( $WAUinstallPath ) \winget-upgrade.ps1 `" `" "
2023-10-05 15:51:41 +00:00
$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
Register-ScheduledTask -TaskName 'Winget-AutoUpdate-UserContext' -TaskPath 'WAU' -InputObject $task -Force | Out-Null
2023-10-03 08:18:00 +00:00
# Settings for the scheduled task for Notifications
2023-10-30 17:42:58 +00:00
$taskAction = New-ScheduledTaskAction -Execute " wscript.exe " -Argument " `" $( $WAUinstallPath ) \Invisible.vbs `" `" powershell.exe -NoProfile -ExecutionPolicy Bypass -File `" `" `" $( $WAUinstallPath ) \winget-notify.ps1 `" `" "
2023-10-03 08:18:00 +00:00
$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
2023-10-05 15:51:41 +00:00
Register-ScheduledTask -TaskName 'Winget-AutoUpdate-Notify' -TaskPath 'WAU' -InputObject $task -Force | Out-Null
2023-10-03 08:18:00 +00:00
2023-10-10 15:30:34 +00:00
# Settings for the GPO scheduled task
2023-10-30 17:42:58 +00:00
$taskAction = New-ScheduledTaskAction -Execute " powershell.exe " -Argument " -NoProfile -ExecutionPolicy Bypass -File `" $( $WAUinstallPath ) \WAU-Policies.ps1 `" "
2023-10-09 23:15:01 +00:00
$tasktrigger = New-ScheduledTaskTrigger -Daily -At 6am
$taskUserPrincipal = New-ScheduledTaskPrincipal -UserId S - 1 - 5 - 18 -RunLevel Highest
$taskSettings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -ExecutionTimeLimit 00 : 05 : 00
2023-10-10 15:30:34 +00:00
# Set up the task, and register it
2023-10-09 23:15:01 +00:00
$task = New-ScheduledTask -Action $taskAction -Principal $taskUserPrincipal -Settings $taskSettings -Trigger $taskTrigger
Register-ScheduledTask -TaskName 'Winget-AutoUpdate-Policies' -TaskPath 'WAU' -InputObject $task -Force | Out-Null
2023-10-03 08:18:00 +00:00
#Set task readable/runnable for all users
$scheduler = New-Object -ComObject " Schedule.Service "
$scheduler . Connect ( )
2023-10-05 16:34:45 +00:00
$task = $scheduler . GetFolder ( " WAU " ) . GetTask ( " Winget-AutoUpdate " )
2023-10-03 08:18:00 +00:00
$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 "
New-Item $regPath -Force | Out-Null
New-ItemProperty $regPath -Name DisplayName -Value " Winget-AutoUpdate (WAU) " -Force | Out-Null
New-ItemProperty $regPath -Name DisplayIcon -Value " C:\Windows\System32\shell32.dll,-16739 " -Force | Out-Null
New-ItemProperty $regPath -Name DisplayVersion -Value $WAUVersion -Force | Out-Null
2023-10-30 17:42:58 +00:00
New-ItemProperty $regPath -Name InstallLocation -Value $WAUinstallPath -Force | Out-Null
New-ItemProperty $regPath -Name UninstallString -Value " powershell.exe -noprofile -executionpolicy bypass -file `" $WAUinstallPath \WAU-Uninstall.ps1 `" " -Force | Out-Null
New-ItemProperty $regPath -Name QuietUninstallString -Value " powershell.exe -noprofile -executionpolicy bypass -file `" $WAUinstallPath \WAU-Uninstall.ps1 `" " -Force | Out-Null
2023-10-03 08:18:00 +00:00
New-ItemProperty $regPath -Name NoModify -Value 1 -Force | Out-Null
New-ItemProperty $regPath -Name NoRepair -Value 1 -Force | Out-Null
New-ItemProperty $regPath -Name Publisher -Value " Romanitho " -Force | Out-Null
New-ItemProperty $regPath -Name URLInfoAbout -Value " https://github.com/Romanitho/Winget-AutoUpdate " -Force | Out-Null
New-ItemProperty $regPath -Name WAU_NotificationLevel -Value $NotificationLevel -Force | Out-Null
2023-10-05 15:51:41 +00:00
if ( $WAUVersion -match " - " ) {
2023-10-03 08:18:00 +00:00
New-ItemProperty $regPath -Name WAU_UpdatePrerelease -Value 1 -PropertyType DWord -Force | Out-Null
}
else {
New-ItemProperty $regPath -Name WAU_UpdatePrerelease -Value 0 -PropertyType DWord -Force | Out-Null
}
New-ItemProperty $regPath -Name WAU_PostUpdateActions -Value 0 -PropertyType DWord -Force | Out-Null
New-ItemProperty $regPath -Name WAU_MaxLogFiles -Value $MaxLogFiles -PropertyType DWord -Force | Out-Null
New-ItemProperty $regPath -Name WAU_MaxLogSize -Value $MaxLogSize -PropertyType DWord -Force | Out-Null
2023-10-05 16:46:05 +00:00
New-ItemProperty $regPath -Name WAU_UpdatesAtTime -Value $UpdatesAtTime -Force | Out-Null
2023-10-09 23:15:01 +00:00
New-ItemProperty $regPath -Name WAU_UpdatesInterval -Value $UpdatesInterval -Force | Out-Null
2023-10-05 15:51:41 +00:00
if ( $UpdatesAtLogon ) {
New-ItemProperty $regPath -Name WAU_UpdatesAtLogon -Value 1 -PropertyType DWord -Force | Out-Null
}
2023-10-03 08:18:00 +00:00
if ( $DisableWAUAutoUpdate ) {
New-ItemProperty $regPath -Name WAU_DisableAutoUpdate -Value 1 -Force | Out-Null
}
if ( $UseWhiteList ) {
New-ItemProperty $regPath -Name WAU_UseWhiteList -Value 1 -PropertyType DWord -Force | Out-Null
}
if ( ! $RunOnMetered ) {
New-ItemProperty $regPath -Name WAU_DoNotRunOnMetered -Value 1 -PropertyType DWord -Force | Out-Null
}
if ( $ListPath ) {
New-ItemProperty $regPath -Name WAU_ListPath -Value $ListPath -Force | Out-Null
}
if ( $ModsPath ) {
New-ItemProperty $regPath -Name WAU_ModsPath -Value $ModsPath -Force | Out-Null
}
if ( $AzureBlobSASURL ) {
New-ItemProperty $regPath -Name WAU_AzureBlobSASURL -Value $AzureBlobSASURL -Force | Out-Null
}
if ( $BypassListForUsers ) {
New-ItemProperty $regPath -Name WAU_BypassListForUsers -Value 1 -PropertyType DWord -Force | Out-Null
}
2023-10-05 15:51:41 +00:00
if ( $InstallUserContext ) {
New-ItemProperty $regPath -Name WAU_UserContext -Value 1 -PropertyType DWord -Force | Out-Null
}
if ( $DesktopShortcut ) {
New-ItemProperty $regPath -Name WAU_DesktopShortcut -Value 1 -PropertyType DWord -Force | Out-Null
}
if ( $StartMenuShortcut ) {
New-ItemProperty $regPath -Name WAU_StartMenuShortcut -Value 1 -PropertyType DWord -Force | Out-Null
}
2023-10-03 08:18:00 +00:00
#Security check
2023-10-17 20:35:36 +00:00
Write-ToLog " Checking Mods Directory: " " Yellow "
2023-10-30 17:42:58 +00:00
$Protected = Invoke-ModsProtect " $WAUinstallPath \mods "
2023-10-03 08:18:00 +00:00
if ( $Protected -eq $True ) {
2023-10-19 13:29:50 +00:00
Write-ToLog " -> The mods directory is now secured! `n " " Green "
2023-10-03 08:18:00 +00:00
}
elseif ( $Protected -eq $False ) {
2023-10-19 13:29:50 +00:00
Write-ToLog " -> The mods directory was already secured! `n " " Green "
2023-10-03 08:18:00 +00:00
}
else {
2023-10-19 13:29:50 +00:00
Write-ToLog " -> Error: The mods directory couldn't be verified as secured! `n " " Red "
2023-10-03 08:18:00 +00:00
}
#Create Shortcuts
if ( $StartMenuShortcut ) {
if ( ! ( Test-Path " ${env:ProgramData} \Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU) " ) ) {
New-Item -ItemType Directory -Force -Path " ${env:ProgramData} \Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU) " | Out-Null
}
2023-10-30 17:42:58 +00:00
Add-Shortcut " wscript.exe " " ${env:ProgramData} \Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU)\WAU - Check for updated Apps.lnk " " `" $( $WAUinstallPath ) \Invisible.vbs `" `" powershell.exe -NoProfile -ExecutionPolicy Bypass -File `" `" `" $( $WAUinstallPath ) \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 " " `" $( $WAUinstallPath ) \Invisible.vbs `" `" powershell.exe -NoProfile -ExecutionPolicy Bypass -File `" `" `" $( $WAUinstallPath ) \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 " " `" $( $WAUinstallPath ) \Invisible.vbs `" `" powershell.exe -NoProfile -ExecutionPolicy Bypass -File `" `" `" $( $WAUinstallPath ) \user-run.ps1 `" -Help `" " " ${env:SystemRoot} \System32\shell32.dll,-24 " " Help for WAU... "
2023-10-03 08:18:00 +00:00
}
if ( $DesktopShortcut ) {
2023-10-30 17:42:58 +00:00
Add-Shortcut " wscript.exe " " ${env:Public} \Desktop\WAU - Check for updated Apps.lnk " " `" $( $WAUinstallPath ) \Invisible.vbs `" `" powershell.exe -NoProfile -ExecutionPolicy Bypass -File `" `" `" $( $WAUinstallPath ) \user-run.ps1 `" `" " " ${env:SystemRoot} \System32\shell32.dll,-16739 " " Manual start of Winget-AutoUpdate (WAU)... "
2023-10-03 08:18:00 +00:00
}
2023-10-17 14:29:22 +00:00
Write-ToLog " WAU Installation succeeded! " " Green "
2023-10-03 08:18:00 +00:00
Start-sleep 1
#Run Winget ?
Start-WingetAutoUpdate
}
catch {
2023-10-17 14:29:22 +00:00
Write-ToLog " WAU Installation failed! Error $_ - Try running me with admin rights " " Red "
2023-10-03 08:18:00 +00:00
Start-sleep 1
return $False
}
2022-02-12 15:35:51 +00:00
}
2023-10-03 08:18:00 +00:00
function Uninstall-WingetAutoUpdate {
2023-10-17 20:35:36 +00:00
Write-ToLog " Uninstalling WAU... " " Yellow "
2023-10-03 08:18:00 +00:00
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 ) {
Remove-Item $InstallLocation -Force -Recurse
if ( Test-Path " ${env:ProgramData} \Microsoft\IntuneManagementExtension\Logs\WAU-updates.log " ) {
Remove-Item -Path " ${env:ProgramData} \Microsoft\IntuneManagementExtension\Logs\WAU-updates.log " -Force -ErrorAction SilentlyContinue | Out-Null
}
if ( Test-Path " ${env:ProgramData} \Microsoft\IntuneManagementExtension\Logs\WAU-install.log " ) {
Remove-Item -Path " ${env:ProgramData} \Microsoft\IntuneManagementExtension\Logs\WAU-install.log " -Force -ErrorAction SilentlyContinue | Out-Null
}
}
else {
#Keep critical files
Get-ChildItem -Path $InstallLocation -Exclude * . txt , mods , logs | Remove-Item -Recurse -Force
2022-07-30 07:31:05 +00:00
}
2023-10-03 08:18:00 +00:00
Get-ScheduledTask -TaskName " Winget-AutoUpdate " -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm: $False
Get-ScheduledTask -TaskName " Winget-AutoUpdate-Notify " -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm: $False
Get-ScheduledTask -TaskName " Winget-AutoUpdate-UserContext " -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm: $False
2023-10-09 23:20:35 +00:00
Get-ScheduledTask -TaskName " Winget-AutoUpdate-Policies " -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm: $False
2023-10-03 08:18:00 +00:00
& reg delete " HKCR\AppUserModelId\Windows.SystemToast.Winget.Notification " / f | Out-Null
& reg delete " HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Winget-AutoUpdate " / f | Out-Null
if ( ( Test-Path " ${env:ProgramData} \Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU) " ) ) {
Remove-Item -Path " ${env:ProgramData} \Microsoft\Windows\Start Menu\Programs\Winget-AutoUpdate (WAU) " -Recurse -Force | Out-Null
}
if ( ( Test-Path " ${env:Public} \Desktop\WAU - Check for updated Apps.lnk " ) ) {
Remove-Item -Path " ${env:Public} \Desktop\WAU - Check for updated Apps.lnk " -Force | Out-Null
2022-07-30 07:31:05 +00:00
}
2023-10-03 08:18:00 +00:00
2023-10-19 13:29:50 +00:00
Write-ToLog " Uninstallation succeeded! `n " " Green "
2023-10-03 08:18:00 +00:00
Start-sleep 1
}
else {
2023-10-19 13:29:50 +00:00
Write-ToLog " $InstallLocation not found! Uninstallation failed! `n " " Red "
2023-10-03 08:18:00 +00:00
}
}
catch {
2023-10-19 13:29:50 +00:00
Write-ToLog " Uninstallation failed! Run as admin ? `n " " Red "
2023-10-03 08:18:00 +00:00
Start-sleep 1
}
2022-04-02 17:24:18 +00:00
}
2023-10-03 08:18:00 +00:00
function Start-WingetAutoUpdate {
#If -DoNotUpdate is true, skip.
if ( ! ( $DoNotUpdate ) ) {
#If -Silent, run Winget-AutoUpdate now
if ( $Silent ) {
2023-10-30 17:42:58 +00:00
$RunWinget = $True
2023-10-03 08:18:00 +00:00
}
#Ask for WingetAutoUpdate
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 ) {
2023-10-30 17:42:58 +00:00
$RunWinget = $True
2023-10-03 08:18:00 +00:00
}
}
2023-10-30 17:42:58 +00:00
if ( $RunWinget ) {
2023-10-03 08:18:00 +00:00
try {
2023-10-17 20:35:36 +00:00
Write-ToLog " Running Winget-AutoUpdate... " " Yellow "
2023-10-03 08:18:00 +00:00
Get-ScheduledTask -TaskName " Winget-AutoUpdate " -ErrorAction SilentlyContinue | Start-ScheduledTask -ErrorAction SilentlyContinue
while ( ( Get-ScheduledTask -TaskName " Winget-AutoUpdate " ) . State -ne 'Ready' ) {
Start-Sleep 1
}
}
catch {
2023-10-17 14:29:22 +00:00
Write-ToLog " Failed to run Winget-AutoUpdate... " " Red "
2022-02-12 15:35:51 +00:00
}
2023-10-03 08:18:00 +00:00
}
}
else {
2023-10-17 14:29:22 +00:00
Write-ToLog " Skip running Winget-AutoUpdate "
2023-10-03 08:18:00 +00:00
}
2022-02-12 15:35:51 +00:00
}
2023-04-12 14:25:56 +00:00
<# APP INFO #>
2023-10-03 08:18:00 +00:00
$WAUVersion = Get-Content " $PSScriptRoot \Winget-AutoUpdate\Version.txt " -ErrorAction SilentlyContinue
2023-04-12 14:25:56 +00:00
2022-02-12 15:35:51 +00:00
<# MAIN #>
2022-10-27 22:28:42 +00:00
#If running as a 32-bit process on an x64 system, re-launch as a 64-bit process
2023-10-03 08:18:00 +00:00
if ( " $env:PROCESSOR_ARCHITEW6432 " -ne " ARM64 " ) {
if ( Test-Path " $( $env:WINDIR ) \SysNative\WindowsPowerShell\v1.0\powershell.exe " ) {
Start-Process " $( $env:WINDIR ) \SysNative\WindowsPowerShell\v1.0\powershell.exe " -Wait -NoNewWindow -ArgumentList " -NoProfile -ExecutionPolicy Bypass -Command $( $MyInvocation . line ) "
Exit $lastexitcode
}
2022-10-27 22:28:42 +00:00
}
2023-10-17 14:29:22 +00:00
#Config console output encoding
$null = cmd / c '' #Tip for ISE
[ Console ] :: OutputEncoding = [ System.Text.Encoding ] :: UTF8
# Workaround for ARM64 (Access Denied / Win32 internal Server error)
$Script:ProgressPreference = 'SilentlyContinue'
#Set install log file
2023-10-30 17:42:58 +00:00
$Script:LogFile = " $WAUinstallPath \logs\WAU-Installer.log "
2023-10-17 14:29:22 +00:00
2023-10-19 12:39:33 +00:00
Write-Host " `n "
2023-10-17 20:13:54 +00:00
Write-Host " `t 888 888 d8888 888 888 " -ForegroundColor Magenta
Write-Host " `t 888 o 888 d88888 888 888 " -ForegroundColor Magenta
Write-Host " `t 888 d8b 888 d88P888 888 888 " -ForegroundColor Magenta
Write-Host " `t 888 d888b 888 d88P 888 888 888 " -ForegroundColor Magenta
Write-Host " `t 888d88888b888 d88P 888 888 888 " -ForegroundColor Magenta
Write-Host " `t 88888P Y88888 d88P 888 888 888 " -ForegroundColor Cyan
Write-Host " `t 8888P Y8888 d88P 888 888 888 " -ForegroundColor Magenta
2023-10-19 12:39:33 +00:00
Write-Host " `t 888P Y888 d88P 888 Y8888888P `n " -ForegroundColor Magenta
Write-Host " `t Winget-AutoUpdate $WAUVersion `n " -ForegroundColor Cyan
Write-Host " `t https://github.com/Romanitho/Winget-AutoUpdate `n " -ForegroundColor Magenta
Write-Host " `t ________________________________________________________ `n `n "
2023-10-03 08:18:00 +00:00
if ( ! $Uninstall ) {
2023-10-30 17:42:58 +00:00
Write-ToLog " Installing WAU to $WAUinstallPath \ "
2023-10-03 08:18:00 +00:00
Install-Prerequisites
2023-10-31 11:43:15 +00:00
Update-Winget
2023-10-03 08:18:00 +00:00
Install-WingetAutoUpdate
2022-04-02 17:24:18 +00:00
}
2023-10-03 08:18:00 +00:00
else {
2023-10-17 14:29:22 +00:00
Write-ToLog " Uninstalling WAU... "
2023-10-03 08:18:00 +00:00
Uninstall-WingetAutoUpdate
2022-04-02 17:24:18 +00:00
}
2022-02-12 15:35:51 +00:00
2023-10-30 17:42:58 +00:00
if ( Test-Path " $WAUinstallPath \Version.txt " ) {
Remove-Item " $WAUinstallPath \Version.txt " -Force
2023-10-16 07:15:03 +00:00
}
2023-10-17 14:29:22 +00:00
2023-10-17 20:13:54 +00:00
Write-ToLog " End of process. " " Cyan "
2023-10-03 08:18:00 +00:00
Start-Sleep 3