Merge pull request #63 from Romanitho/NotificationLevel-Feature

Added Notification Level Feature
pull/67/head
Romain 2022-04-24 22:01:54 +02:00 committed by GitHub
commit 48757aa2fb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 88 additions and 58 deletions

View File

@ -14,17 +14,25 @@ You can exclude apps from update job (for instance, apps you want to keep at a s
Add (or remove) the apps' ID you want to disable autoupdate to 'excluded_apps.txt'. (File must be placed in scripts' installation folder, or re-run install.bat).
- #### Or White List
From 1.7.0 version, you can update only pre-selected apps. To do so, create an "included_apps.txt" with the apps' ID of the apps you want to auto-update and run the `Winget-AutoUpdate-Install.ps1` with `-UseWhiteList` parameter. Related post: https://github.com/Romanitho/Winget-AutoUpdate/issues/36
### Default install location
By default, scripts and components will be placed in ProgramData location (inside a Winget-AutoUpdate folder). You can change this with script argument.
### Notification Level
From version 1.9.0, you can choose which notification will be displayed: Full, Success only or none. Use `-NotificationLevel` parameter when you run `Winget-AutoUpdate-Install.ps1`
### Notification language
You can easily translate toast notifications by creating your locale xml config file (and share it with us :) ).
### Default install location
By default, scripts and components will be placed in ProgramData location (inside a Winget-AutoUpdate folder). You can change this with script argument (Not Recommended).
### When does the script run?
Scheduled task is set to run:
- At user logon
- At 6AM Everyday (with the -StartWhenAvailable option to be sure it is run at least once a day)
This way, even without connected user, powered on computers get updated anyway.
### Log location
You can find logs in install location, in log folder.
### "Unknown" App version
As explained in this [post](https://github.com/microsoft/winget-cli/issues/1255), Winget cannot detect the current version of some installed apps. We decided to skip managing these apps with WAU to avoid retries each time WAU runs:
@ -58,21 +66,22 @@ Disable Winget-AutoUpdate update checking. By default, WAU auto updates if new v
**-UseWhiteList**
Use White List instead of Black List. This setting will not create the "exclude_apps.txt" but "include_apps.txt"
**-NotificationLevel**
Specify the Notification level: Full (Default, displays all notification), SuccessOnly (Only displays notification for success) or None (Does not show any popup).
**-Uninstall**
Remove scheduled tasks and scripts.
## Custom scripts (Mods feature)
From version 1.8.0, the Mods feature allows you to run an additional script when upgrading or installing an app.
Just put the script in question with the App ID followed by the "-upgrade" or "-install" suffix in the "mods" folder.
WAU will call `AppID-upgrade.ps1` and/or `AppID-install.ps1` (if they differs, otherwise the "-install" mod will be used for upgrades too) if it exists in the "mods" folder just after the upgrade/install.
The Mods feature allows you to run an additional script when installing or upgrading an app.
Just put the script with the App ID followed by the "-install" or "-upgrade" suffix to be considered.
`AppID-install.ps1` and/or `AppID-upgrade.ps1` (if it differs, otherwise the "-install" mod will be used for upgrade)
and put this in the Mods directory
> Example:
> If you want to run a script just after installing ".NET Desktop Runtime 6", call your script like this:
> `Microsoft.dotnetRuntime.6-x64-install.ps1`
In the case of ".NET Desktop Runtime 6" it spawns a new process and this we will have to wait for completion of before moving on to checking if the installation/upgrade suceeded or not. - (this seems to be handled in Winget Version: v1.3.0-preview)
> Example:
If you want to run a script that removes the shortcut from "%PUBLIC%\Desktop" (we don't want to fill the desktop with shortcuts our users can't delete) just after installing "Acrobat Reader DC" (32-bit), prepare a powershell script that removes the Public Desktop shortcut "Acrobat Reader DC.lnk" and name your script like this:
`Adobe.Acrobat.Reader.32-bit-install.ps1` and put it in the "mods" folder.
You can find more information on Winget-Install Repo, as it's a related feature
## Help
In some cases, you need to "unblock" the "install.bat" file (Windows Defender SmartScreen). Right click, properties and unblock. Then, you'll be able to run it.

View File

@ -25,6 +25,9 @@ Use White List instead of Black List. This setting will not create the "exclude_
.PARAMETER Uninstall
Remove scheduled tasks and scripts.
.PARAMETER NotificationLevel
Specify the Notification level: Full (Default, displays all notification), SuccessOnly (Only displays notification for success) or None (Does not show any popup).
.EXAMPLE
.\winget-install-and-update.ps1 -Silent -DoNotUpdate
@ -40,7 +43,8 @@ param(
[Parameter(Mandatory=$False)] [Switch] $DoNotUpdate = $false,
[Parameter(Mandatory=$False)] [Switch] $DisableWAUAutoUpdate = $false,
[Parameter(Mandatory=$False)] [Switch] $Uninstall = $false,
[Parameter(Mandatory=$False)] [Switch] $UseWhiteList = $false
[Parameter(Mandatory=$False)] [Switch] $UseWhiteList = $false,
[Parameter(Mandatory=$False)] [ValidateSet("Full","SuccessOnly","None")] [String] $NotificationLevel = "Full"
)
@ -191,6 +195,7 @@ function Install-WingetAutoUpdate{
<WAUautoupdate>$(!($DisableWAUAutoUpdate))</WAUautoupdate>
<WAUprerelease>False</WAUprerelease>
<UseWAUWhiteList>$UseWhiteList</UseWAUWhiteList>
<NotificationLevel>$NotificationLevel</NotificationLevel>
</app>
"@
$ConfigXML.Save("$WingetUpdatePath\config\config.xml")

View File

@ -1,7 +1,7 @@
<?xml version="1.0"?>
<app>
<name>Winget-AutoUpdate (WAU)</name>
<version>1.8.0</version>
<version>1.9.0</version>
<author>Romanitho</author>
<info>https://github.com/Romanitho/Winget-AutoUpdate</info>
</app>

View File

@ -20,7 +20,7 @@ Function Get-NotifLocale {
}
#Get locale XML file content
Write-Log "Notification Langugage : $LocaleDisplayName" "Cyan"
Write-Log "Notification Level: $NotificationLevel. Notification Language: $LocaleDisplayName" "Cyan"
[xml]$Script:NotifLocale = Get-Content $LocaleFile -Encoding UTF8 -ErrorAction SilentlyContinue
}

View File

@ -2,16 +2,24 @@
function Get-WAUConfig{
#Get config file
[xml]$WAUConfig = Get-Content "$WorkingDir\config\config.xml" -Encoding UTF8 -ErrorAction SilentlyContinue
#Check if WAU is configured for Black or White List
if ($true -eq [System.Convert]::ToBoolean($WAUConfig.app.UseWAUWhiteList)){
Write-Log "WAU uses White List config"
$Script:UseWhiteList = $true
}
else{
Write-Log "WAU uses Black List config"
$Script:UseWhiteList = $false
}
#Get Notification Level
if ($WAUConfig.app.NotificationLevel){
$Script:NotificationLevel = $WAUConfig.app.NotificationLevel
}
else{
#Default: Full
$Script:NotificationLevel = $full
}
}

View File

@ -2,8 +2,10 @@
function Start-NotifTask ($Title,$Message,$MessageType,$Balise) {
#Add XML variables
[xml]$ToastTemplate = @"
if (($NotificationLevel -eq "Full") -or ($NotificationLevel -eq "SuccessOnly" -and $MessageType -eq "Success")) {
#Add XML variables
[xml]$ToastTemplate = @"
<toast launch="ms-get-started://redirect?id=apps_action">
<visual>
<binding template="ToastImageAndText03">
@ -16,45 +18,47 @@ function Start-NotifTask ($Title,$Message,$MessageType,$Balise) {
</toast>
"@
#Check if running account is system or interactive logon
$currentPrincipal = [bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match "S-1-5-4")
#if not "Interactive" user, run as system
if ($currentPrincipal -eq $false){
#Save XML to File
$ToastTemplateLocation = "$env:ProgramData\Winget-AutoUpdate\"
if (!(Test-Path $ToastTemplateLocation)){
New-Item -ItemType Directory -Force -Path $ToastTemplateLocation
}
$ToastTemplate.Save("$ToastTemplateLocation\config\notif.xml")
#Run Notify scheduled task to notify conneted users
Get-ScheduledTask -TaskName "Winget-AutoUpdate-Notify" -ErrorAction SilentlyContinue | Start-ScheduledTask -ErrorAction SilentlyContinue
}
#else, run as connected user
else{
#Load Assemblies
[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
#Prepare XML
$ToastXml = [Windows.Data.Xml.Dom.XmlDocument]::New()
$ToastXml.LoadXml($ToastTemplate.OuterXml)
#Specify Launcher App ID
$LauncherID = "Windows.SystemToast.Winget.Notification"
#Check if running account is system or interactive logon
$currentPrincipal = [bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match "S-1-5-4")
#Prepare and Create Toast
$ToastMessage = [Windows.UI.Notifications.ToastNotification]::New($ToastXml)
$ToastMessage.Tag = $ToastTemplate.toast.tag
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($LauncherID).Show($ToastMessage)
#if not "Interactive" user, run as system
if ($currentPrincipal -eq $false){
#Save XML to File
$ToastTemplateLocation = "$env:ProgramData\Winget-AutoUpdate\"
if (!(Test-Path $ToastTemplateLocation)){
New-Item -ItemType Directory -Force -Path $ToastTemplateLocation
}
$ToastTemplate.Save("$ToastTemplateLocation\config\notif.xml")
#Run Notify scheduled task to notify conneted users
Get-ScheduledTask -TaskName "Winget-AutoUpdate-Notify" -ErrorAction SilentlyContinue | Start-ScheduledTask -ErrorAction SilentlyContinue
}
#else, run as connected user
else{
#Load Assemblies
[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
#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 3
}
#Wait for notification to display
Start-Sleep 3
}

View File

@ -11,6 +11,9 @@ Get-ChildItem "$WorkingDir\functions" | ForEach-Object {. $_.FullName}
#Run log initialisation function
Start-Init
#Get WAU Configurations
Get-WAUConfig
#Get Notif Locale function
Get-NotifLocale
@ -40,11 +43,12 @@ if (Test-Network){
}
#Get White or Black list
Get-WAUConfig
if ($UseWhiteList){
Write-Log "WAU uses White List config"
$toUpdate = Get-IncludedApps
}
else{
Write-Log "WAU uses Black List config"
$toSkip = Get-ExcludedApps
}

View File

@ -1,2 +1,2 @@
@echo off
powershell -Command "Get-ChildItem -Path '%~dp0' -Recurse | Unblock-File; Start-Process powershell.exe -Argument '-executionpolicy bypass -file """%~dp0Winget-AutoUpdate-Install.ps1"" '" -Verb RunAs
powershell -Command "Get-ChildItem -Path '%~dp0' -Recurse | Unblock-File; Start-Process powershell.exe -Argument '-noprofile -executionpolicy bypass -file """%~dp0Winget-AutoUpdate-Install.ps1"" '" -Verb RunAs

View File

@ -1,2 +1,2 @@
@echo off
powershell -Command "Get-ChildItem -Path '%~dp0' -Recurse | Unblock-File; Start-Process powershell.exe -Argument '-executionpolicy bypass -file """%~dp0Winget-AutoUpdate-Install.ps1"" -Uninstall'" -Verb RunAs
powershell -Command "Get-ChildItem -Path '%~dp0' -Recurse | Unblock-File; Start-Process powershell.exe -Argument '-noprofile -executionpolicy bypass -file """%~dp0Winget-AutoUpdate-Install.ps1"" -Uninstall'" -Verb RunAs