PSADT.ToastNotification Extension

PSADT.ToastNotification Extension

Extension for PowerShell App Deployment Toolkit that replace all the windows and dialogs with Toast Notifications with a lot of visual and functional improvements.

Features

  • Administrative rights not needed.
  • Wraps the original functions, so no script modification needed.
  • SYSTEM raised Toast Notifications can interact with logged in no Administrator user.
  • Ability to interact with the notifications using events or protocols.
  • Can search for closing apps using wildcards.
  • Can search for closing apps based on windows title or process path using wildcards.
  • Added array of never kill applications (even if added for closing).
  • Added array of never block applications (they can be killed but not blocked).
  • Limit functions timeout to InstallationUITimeout.
  • Ability to use MUI cache applications name if exists.
  • Highly customizable Toast Notification visual schemes.
  • Dynamically update running applications with icons and extended applications information.
  • Fallback to original Windows Forms and dialogs if any error occurs.
  • New dedicated strings with multilanguage support.

Functions (wrappers) and improvements

Show-InstallationWelcome

  1. Now you can search for processes using like operator. If you include any wildcard character, the evaluating operator will be -like instead of -eq. The search object AcroRd*=Adobe Acrobat Reader matches 32/64 bits version of the application, only currently running processes will be added to the $ProcessObjects. See about Comparison Operators - PowerShell | Microsoft Learn.

  2. For windows title search use title:... as suffix, if any process window validates the filter it will be added to the $ProcessObjects. Wildcards supported, title:*Adobe* will add any process that is currently running and the title is like *Adobe*. No title:...=Application Name supported. See about Comparison Operators - PowerShell | Microsoft Learn.

  3. For process path search use path:... as suffix, all the currently running processes validating the filter will be added to the $ProcessObjects. Wildcards supported, path:$($env:ProgramFiles)\*Office*\* will add any process that is currently running and the path is like $($env:ProgramFiles)\*Office*\*. No path:...=Application Name supported. See about Comparison Operators - PowerShell | Microsoft Learn.

  4. The closing applications evaluation removes processes that are included in CriticalProcesses_NeverKill, they won`t be added and a warning appears in console/log.

  5. Internal function mechanism is kept for backward compatibility but, if the switch -PersistPrompt is not present, the user can dismiss or close the notification and a Timeout result is returned.

  6. If the -BlockExecution switch is used, any process included in CriticalProcesses_NeverBlock won`t be added for blocking and a warning appears in console/log.

Show-BalloonTip

  1. Shows a long duration Toast Notification if the $BalloonTipTime is greater than 10000 ms.

  2. No need to call any external script, the Toast Notification always shows itself like if $NoWait was $true.

  3. For more options see the Customizable visual style section.

Show-DialogBox

  1. The buttons get the translated string using the Data Extraction Extension to match the user language, the InstallationUI_LanguageOverride is omitted like original dialog box.

  2. If the $Timeout is bigger than $configInstalltionUITimeout you can use LimitTimeoutToInstallationUI config option to limit the timeout.

  3. You can use ShowAttributionText config option to show a subtle text indicating the auto-dismiss timeout.

  4. For more options see the Customizable visual style section.

Show-InstallationRestartPrompt

  1. The shutdown command calls shutdown.exe /r /f /t $SilentCountdownSeconds instead of Restart-Computer since sometimes the cmdlet does not work.

  2. Ability to show a warning icon by using InstallationRestartPrompt_ShowIcon config option.

  3. You can use ShowAttributionText config option to show a subtle text indicating the auto-restart timeout.

  4. If the parameter $NoCountdown is $false the Toast Notification will show a progress bar with the timeout to auto-restart.

  5. Closing or dismissing the Toast Notification works like the Minimize button.

  6. For more options see the Customizable visual style section.

Show-InstallationPrompt

  1. If the $Timeout is bigger than $configInstalltionUITimeout you can use LimitTimeoutToInstallationUI config option to limit the timeout.

  2. Asynchronously behavior maintained like original function.

  3. You can use ShowAttributionText to show a subtle text indicating the auto-dismiss timeout.

  4. For more options see the Customizable visual style section.

Show-InstallationProgress

  1. Defines the new variable InstallationProgressFunctionCalled that works like a switch indicating that Close-InstallationProgress should be called.

  2. You can use ShowAttributionText config option to show a subtle text indicating the deployment progress message.

  3. You can use InstallationProgress_ShowIndeterminateProgressBar config option to show an indeterminate progress bar.

  4. For more options see the Customizable visual style section.

Internal functions (wrappers) and improvements

Get-RunningProcesses

  1. The function has changed, now it receives a [PSCustomObject[]] as input, backward compatibility kept.

  2. If any CriticalProcesses_NeverKill matches any process name or filters, it won`t be added and a warning appears in console/log.

  1. The output object array contains the process name, description, path and company.

Show-WelcomePrompt

  1. If you do not like the Continue button string like me, you can use WelcomePrompt_ReplaceContinueButtonDeploymentType and now the text will show the translated strings of Install, Repair or Uninstall based on the deployment type of the script.

  2. If the $CloseAppsCountdown is bigger than $configInstalltionUITimeout you can use LimitTimeoutToInstallationUI to limit the timeout.

  3. You can use ShowAttributionText to show a subtle text indicating the auto-deferral or auto-continue timeout.

  4. Ability to show more than the process name by using ShowApplicationsIcons and ShowExtendedApplicationsInformation.

  5. By design the Toast Notification can only show up to 5 applications, additional ones will be grouped in the last item. You can reduce the amount of showed row by using WelcomePrompt_MaxRunningProcessesRows.

  6. The new strings react to the deployment type showing correctly if the application is running an Installation, Repairing or Uninstallation process and the translated string will be integrated in the showed text as well as the count of running applications to close.

  7. For more options see the Customizable visual style section.

Close-InstallationProgress

  1. Wraps the original function but removes any background event or job.

  2. The original function is only called if the Show-InstallationProgress function was used before.

Exit-Script

  1. Wraps the original function but removes any created variable before.

New-BlockExecutionToastNotificationTemplate

  1. Creates the Toast Notification template that will be raised when a blocked application tries to run.

  2. Puts a list at the bottom of the Toast Notification showing the blocked applications.

  3. The Toast Notification shows which applications is being installed, repaired or uninstalled in the title.

  4. For more options see the Customizable visual style section.

Show-BlockExecutionToastNotification

  1. Shows a previously created Toast Notification if any blocked application tries to run.

  2. Ability to show more than the process name by using ShowApplicationsIcons and ShowExtendedApplicationsInformation.

  3. For more options see the Customizable visual style section.

Block-AppExecution

  1. The function has changed, now it receives a [PSCustomObject[]] as input, backward compatibility kept.

  2. Changed the logic to detect if user has administrative rights.

  3. Fixed a bug since version 3.8.4 with the task scheduled name.

  4. If the process that will be blocked has information in the Image File Execution Option registry key, it will be backed up and restored after the deployment process or reboot.

  5. Now the blocked application registry subkey are recreated volatile, if any error occurs, with a logoff/reboot all will be unlocked (the original scheduled task is no longer needed but kept for backward compatibility). See PSADT.VolatilePaths Extension

  6. The remove blocked application scheduled tasks auto-delete itself after running.

  7. New scheduled task that restores the backed up Image File Execution Option per process that auto-deletes itself after execution.

  8. Uses new cmdlets to register the scheduled tasks.

  9. The users who tries to run a blocked application is registered in log by default.

  10. Minor backward compatible changes to the VBS script to capture the blocked application process.

Unblock-AppExecution

  1. Changed the logic to detect if user has administrative rights.

  2. Tries to remove the Debugger property per process, but if any process remains blocked, the scheduled task will retry hourly.

  3. Restores the backed up Image File Execution Option per process by calling the scheduled task created.

Internal functions

This set of functions are internals and are not designed to be called directly

  • New-DynamicFunction - Defines a new function with the given name, scope and content given.
  • New-ToastNotificationAppId - Registers the application identifier in registry.
  • New-ToastNotificationProtocol - Registers the protocol in registry.
  • New-ToastNotificationProtocolCommandFile - Creates a new file with the script used by the protocol.
  • Remove-ToastNotificationAppId - Removes an application identifier from the registry.
  • Remove-ToastNotificationProtocol - Removes a protocol from the registry.
  • Compare-ToastNotificationAppId - Compares and verifies the application identifier data in the registry.
  • Compare-ToastNotificationProtocol - Compares and verifies the correct operation of the protocol.
  • Test-ToastNotificationAppId - Unregister and register again the AppId properties in registry.
  • Test-ToastNotificationProtocol - Unregister and register again the protocol properties in registry.
  • Test-ToastNotificationVisible - Determines if the previously raised notification is visible.
  • Test-ToastNotificationAvailability - Determines whether the application identifier can raise notifications.
  • Test-ToastNotificationExtension - Performs several tests to determine if notifications can be displayed.
  • Get-ToastNotificationResult - Obtains the result of the execution and/or test of the protocol.
  • Remove-ToastNotificationResult - Removes any previous result when using protocol.
  • Clear-ToastNotificationHistory - Clear previously shown notifications from history.
  • Register-WrappedToastNotificationEvent - Register a WinRT event by wrapping it in a compatible object.
  • Register-ToastNotificationEvents - Registers the events triggered by the notification.
  • Unregister-ToastNotificationEvents - Stops and removes previously registered events.

Configuration File

General options and extended configuration for the wrapped functions:

  • WorkingDirectory: A valid directory or $variable. Will be created if not exists, will use $dirAppDeployTemp if not valid.
  • TaggingVariable: A not null tag or $variable. Will use $installName if empty/null.
  • ProtocolName: Name of the protocol with which the commands will be launched. Will use “psadttoastnotification” if empty/null. CAUTION: do not use a known protocol as it can be overwritten in the registry!
  • SubscribeToEvents: Attempts to register events raised by the Toast Notification object.
  • LimitTimeoutToInstallationUI: If any wrapped function timeout exceeds the defined in the XML configuration, use that value.
  • CriticalProcesses_NeverKill: Processes that, even if they are included, will not be closed by the Show-InstallationWelcome function.
  • CriticalProcesses_NeverBlock: Processes that, even if they are included, will not be blocked by the Block-AppExecution function.
  • InstallationWelcome_AlwaysParseMuiCacheAppName: Prefer MuiCache application name over -CloseApps description given.
  • WelcomePrompt_MaxRunningProcessesRows: Maximum number of rows with running applications in the Toast Notification. Integer number between 1 and 5.
  • WelcomePrompt_ShowCloseMessageIfCustomMessage: Shows the message warning that applications should be closed after the custom message.
  • WelcomePrompt_ReplaceContinueButtonDeploymentType: Shows the deployment type action instead of the ‘Continue’ label in the button.
  • BlockExecution_TemplateFileName: Name of the template that contains the blocked applications notification.
  • InstallationProgress_ShowIndeterminateProgressBar: Defines if a progress bar is displayed simulating a loading or waiting state.
  • InstallationRestartPrompt_ShowIcon: Shows a warning icon in the restart notification.

Options used by the Application that raise the Toast Notification:

The custom application identifier used to raise the Toast Notification is automatically registered system wide or per user and it is volatile, nothing remains in registry after logoff/reboot.

  • AppId: Identifier of the application used to display the Toast Notification.
  • DisplayName: Display name on Toast Notification used to display it.
  • IconUri: Location of the icon to display in the notification.
  • IconBackgroundColor: Icon background color.
  • ShowInSettings: Allow registered application to be shown in Settings.
  • AllowContentAboveLock: Allow Toast Notifications to show its content on lock screen.
  • ShowInActionCenter: Allow Toast Notifications to stay in the Action Center.

Customizable visual style

Before editing the Toast Notification visual style see App notification content - Windows apps | Microsoft Learn

Not all the Toast Notifications included in the extension have the same configuration options.

  • UpdateInterval: Interval in seconds at which the notification is updated. Integer number between 1 and 10.
  • ShowAttributionText: Shows a small text indicating the automatic action of the toast notification when there is no countdown.
  • ImageHeroShow: Defines if the top header image of the notification is shown.
  • ImageHeroFileName: Top header image filename and extension, located in the .\SupportFiles\PSADT.ToastNotification folder.
  • ImageAppLogoOverrideShow: Defines if the internal image of the notification is shown.
  • ImageAppLogoOverrideFileName: Internal image filename and extension, located in the .\SupportFiles\PSADT.ToastNotification folder.
  • ImageAppLogoOverrideCircularCrop: Defines if the internal image will be crop in a circular figure.
  • ShowApplicationsIcons: Shows the applications icons (if apply).
  • ApplicationsIconsSize: Sets the size of the applications icons, corresponding to 16x16, 32x32 and 48x48 at 100% scale factor. Default**: ExtraLarge.
  • CollapseApplicationsIcons: Reduces the applications icons margins (if apply).
  • ShowExtendedApplicationsInformation: Shows extended information per application, like MainWindowsTitle, Description, Company (if apply).
  • ShowDialogIconAsAppLogoOverride: Replaces the AppLogoOverride image with the Dialog icon (if apply).
  • DialogsIconsSize: Sets the size of the icons used by dialogs, corresponding to 16x16, 32x32 and 48x48 at 100% scale factor. Default**: Large.
  • CollapseDialogsIcons: Reduces the dialogs icons margins (if apply).
  • AudioSource: Sound file to play when displaying the notification or any of the system defined.
  • AudioLoop: Defines if the sound is played in an indefinite loop.
  • AudioSilent: If this value is true, then no sound will be played.

Requirements

External Links

For more information related to the usage or installation, follow the external link.

2023/03/28 - Updated to v1.1 :grinning:

  • Fixed a bug with Show-DialogBox regarding the Title.
  • New TranslatedButton scriptblock will try to translate any compatible button in Show-DialogBox and Show-InstallationPrompt.
  • Fixed a bug in Test-ToastNotificationVisible when filtering.
  • Fixed a bug when displaying Toast Notification in SYSTEM context.
  • New configuration parameter to set timeout for invoked as user process.
  • Optimized code, now the functions call external scriptblocks defined in the extension rather than local scriptblocks per function.
  • New system to determine the result of any Toast Notification action using user environment variables instead of .tag files.
  • Fixed a bug setting permission to ResourceFolder.
  • New protocol command logic.
  • New requirement added to PSADT.RunAsActiveUser Extension.

For more information related to the usage or installation, follow the external link.

2023/03/30 - Updated to v1.1.1 :grinning:

  • Fixed a bug when timeout sets the result for a function.
1 Like

Hello,

i’m testing this extension to deploy toast notification but when i execute Deploy-Application.exe i have an error in my installation logs :

[Asynchronous] :: [ToastNotificationManager]::CreateToastNotifier().Show(): Exception lors de l'appel de « Show » avec « 1 » argument(s) : « Accès refusé. (Exception de HRESULT : 0x80070005 (E_ACCESSDENIED)) »

and

[Asynchronous] :: Unable to show Toast Notification.
Error Record:
-------------

Message        : Unexpected result [3:[ToastNotificationManager]::CreateToastNotifier().Show(),Exception lors de 
                 l'appel de «Show» avec «1» argument(s): «Accès refusé. (Exception de HRESULT : 0x80070005 
                 (E_ACCESSDENIED))»] given by the Toast Notification.
InnerException : 

FullyQualifiedErrorId : Unexpected result [3:[ToastNotificationManager]::CreateToastNotifier().Show(),Exception lors 
                        de l'appel de «Show» avec «1» argument(s): «Accès refusé. (Exception de HRESULT : 0x80070005 
                        (E_ACCESSDENIED))»] given by the Toast Notification.
ScriptStackTrace      : à Invoke-ToastNotificationAsUser<Process>, C:\Users\rherrero-prest\OneDrive - NewR\Desktop\Pain
                        t.net_5.0.2_x64_MUI_01\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1 
                        : ligne 5010
                        à <ScriptBlock>, C:\Users\rherrero-prest\OneDrive - NewR\Desktop\Paint.net_5.0.2_x64_MUI_01\App
                        DeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1 : ligne 443
                        à <ScriptBlock>, C:\Users\rherrero-prest\OneDrive - NewR\Desktop\Paint.net_5.0.2_x64_MUI_01\App
                        DeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1 : ligne 454
                        à Show-InstallationRestartPrompt<Process>, C:\Users\rherrero-prest\OneDrive - NewR\Desktop\Pain
                        t.net_5.0.2_x64_MUI_01\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1 
                        : ligne 2829
                        à <ScriptBlock>, C:\Users\rherrero-prest\OneDrive - 
                        NewR\Desktop\Paint.net_5.0.2_x64_MUI_01\AppDeployToolkit\AppDeployToolkitMain.ps1 : ligne 16079
                        à <ScriptBlock>, <Aucun fichier> : ligne 1
                        à <ScriptBlock>, <Aucun fichier> : ligne 1

PositionMessage : Au caractère C:\Users\rherrero-prest\OneDrive - NewR\Desktop\Paint.net_5.0.2_x64_MUI_01\AppDeployTool
                  kit\PSADT.ToastNotification\ToastNotificationExtension.ps1:5010 : 7
                  + ...             throw "Unexpected result [$InvokedToastNotificationResult ...
                  +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

no toast notification appear just the original notification.

Can you help me ? :slight_smile:

Thx in advance

RomainH

Hi there, by looking at the paths in the error trace, how are you deploying the app?

The invokation as active user is used if the process is executed by SYSTEM but your paths are USER ones.

i just want to test the toast notification [by] editing deploy-application.ps1 to add in pre-installation the command :
Show-InstallationRestartPrompt -Countdownseconds 600 -CountdownNoHideSeconds 6

for test, i execute as admin in PowerShell .\Deploy-Application.exe

i have downloaded and apply the prerequisites

How do we install this?

I have followed the instructions but, nothing seems to be different.

Just download the latest version release from github, download all required extensions and extract them all in Toolkit folder…

Check how to install instruction in each extension.

Thank you for responding and please excuse my ignorance, which toolkit folder?

Also, do we just extract the contents for the downloads into one of the main toolkit folders or, do they need to remain in their own folders?

Exactly that one, the folder containing the main .ps1 script, the Support, Files, etc… folders.

Just check the folder structure of the zip files

So the popup now displays but when I select anything I get the following error:

Error formatting a string: Index (zero based) must be greater than or equal to zero and less than the
size of the argument list…

[Pre-Installation] :: Error Record:
-------------

Message        : Error formatting a string: Index (zero based) must be greater than or equal to zero and less than the 
                 size of the argument list..
InnerException : 

FullyQualifiedErrorId : FormatError
ScriptStackTrace      : at <ScriptBlock>, 
                        C:\temp\Toolkit\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1: line 1911
                        at <ScriptBlock>, 
                        C:\temp\Toolkit\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1: line 472
                        at Show-WelcomePrompt<Process>, 
                        C:\temp\Toolkit\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1: line 1976
                        at Show-InstallationWelcome<Process>, 
                        C:\temp\Toolkit\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1: line 1234
                        at <ScriptBlock>, C:\temp\Toolkit\Deploy-Application.ps1: line 148
                        at <ScriptBlock>, <No file>: line 1
                        at <ScriptBlock>, <No file>: line 1

PositionMessage : At C:\temp\Toolkit\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1:1911 
                  char:8
                  + ...             $DictionaryData.attributionText = [Security.SecurityEleme ...
                  +
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Above is the full error I am seeing. Any help would be appreciated.

Update:

Tried running as user as well and get the same result. Both win10 and win11 OS

If anyone else experiences this error, you need to amend line 1911 of the PSADT toolkit main script to:

$DictionaryData.attributionText = [Security.SecurityElement]::Escape($($configUIToastNotificationMessages.WelcomePrompt_AttributionTextAutoDeferral -f ( <#0#> $deploymentTypeName.ToLower()), ( <#1#> $RemainingTimeData.RemainingTimeLabel)))

This fixes it.

Hi there, sorry for the late reply I’m on holidays… You are right, there was a missing () around the variables to escape… The $ is not needed.

By the way there is another bug when no process to block is given to Show-WelcomePrompt that cause the notifocation to close and show again, I know how to fix them but I can’t now.

For more information related to the usage or installation, follow the external link.

2023/04/06 - Updated to v1.1.2 :grinning:

  • Fixed a bug when using deferral.
  • Fixed a bug when re-showing notification with no process to close detected.
  • Added warning when required extensions are not loaded.
1 Like

Hello, I can’t get a Toast to appear, I have installed all the prerequisites, I don’t have any particular error. How can we debug this?

Of course you can debug it, enable Toolkit_LogDebugMessage in AppDeployToolkitConfig.xml and upload a complete log to see where it is failing. Haven’t you see anything in the log?

Where I suppose to find the log file? Is there a place where we have to activate the toast function? Maybe I don’t know how to use the Toast notification extention…

The Toast Notification Extension is a wrapper, there is no special function or modification to the current scripts you are using. Check the regular PSADT logs.

Each Deploy-Application.ps1 file creates a log file in a defined location, by default (when required admin is TRUE) C:\Windows\Logs\Software…

Check Toolkit_LogPath in AppDeployToolkitConfig.xml

If I run deploy-application.ps1 with PowerShell (not with PowerShell ISE), I don’t have the same error. My OS is Windows 11. If I do the same command in Windows 10, it works. My Windows 10 is in a workgroup and my Windows 11 is on a domain. Do you have any idea?

[04-11-2023 13:36:13.294] [Pre-Installation] [Invoke-ToastNotificationAsUser] :: [ToastNotificationManager]::CreateToastNotifier().Show(): Exception lors de l'appel de « Show » avec « 1 » argument(s) : « Accès refusé. (Exception de HRESULT : 0x80070005 (E_ACCESSDENIED)) »
[04-11-2023 13:36:13.308] [Pre-Installation] [Invoke-ToastNotificationAsUser] :: Unable to show Toast Notification.
Error Record:
-------------

Message        : Unexpected result [3:[ToastNotificationManager]::CreateToastNotifier().Show(),Exception lors de
                 l'appel de «Show» avec «1» argument(s): «Accès refusé. (Exception de HRESULT : 0x80070005
                 (E_ACCESSDENIED))»] given by the Toast Notification.
InnerException :

FullyQualifiedErrorId : Unexpected result [3:[ToastNotificationManager]::CreateToastNotifier().Show(),Exception lors
                        de l'appel de «Show» avec «1» argument(s): «Accès refusé. (Exception de HRESULT : 0x80070005
                        (E_ACCESSDENIED))»] given by the Toast Notification.
ScriptStackTrace      : à Invoke-ToastNotificationAsUser<Process>,
                        D:\toolkit\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1 : ligne 5033
                        à <ScriptBlock>,
                        D:\toolkit\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1 : ligne 465
                        à <ScriptBlock>,
                        D:\toolkit\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1 : ligne 476
                        à Show-BalloonTip<Process>,
                        D:\toolkit\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1 : ligne 2205
                        à Exit-Script, D:\toolkit\AppDeployToolkit\AppDeployToolkitMain.ps1 : ligne 1741
                        à Show-InstallationWelcome<Process>,
                        D:\toolkit\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1 : ligne 1372
                        à <ScriptBlock>, D:\toolkit\Deploy-Application.ps1 : ligne 185
                        à <ScriptBlock>, <Aucun fichier> : ligne 1

PositionMessage : Au caractère D:\toolkit\AppDeployToolkit\PSADT.ToastNotification\ToastNotificationExtension.ps1:5033
                  : 7
                  + ...             throw "Unexpected result [$InvokedToastNotificationResult ...
                  +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



[04-11-2023 13:36:13.319] [Pre-Installation] [Show-BalloonTip] :: A problem occured with the Toast Notification or it's not visible. Falling back to original function...