Rationaliser les notifications toast importantes à l’aide d’un script PowerShell 

Introduction

Une communication efficace avec les utilisateurs finaux est la clé de vopute des opérations informatiques, en particulier pour les fournisseurs de services gérés (MSP) et les professionnels de l’informatique qui gèrent des environnements à grande échelle. S’assurer que les messages critiques sont vus rapidement peut faire la différence entre une résolution sans faille et des opérations perturbées. Ce script PowerShell offre un moyen efficace d’envoyer des notifications toast importantes directement à l’utilisateur connecté sur un système Windows.

Contexte

Les notifications toast sont devenues un élément essentiel des flux de travail informatiques modernes, car elles constituent un moyen non intrusif mais immédiat de communiquer des informations. Qu’il s’agisse d’alerter les utilisateurs sur une mise à jour critique, un changement de politique de sécurité ou une fenêtre de maintenance imminente, ces notifications assurent la visibilité sans interrompre le flux de travail. Les approches traditionnelles font souvent appel à des e-mails en masse ou à des fenêtres contextuelles, qui sont soit trop dérangeants, soit faciles à ignorer. Ce script répond à ces limitations en tirant parti du système de notification natif de Windows pour envoyer des messages ciblés et personnalisables.

Le script :

#Requires -Version 5.1

<#
.SYNOPSIS
    Sends an important toast notification to the currently signed in user. Please run as the Current Logged-on User.
.DESCRIPTION
    Sends an important toast notification to the currently signed in user. Please run as 'Current Logged on User'.
    You can also specify the "ApplicationId" to any string.
    The default ApplicationId is your company name found in the NINJA_COMPANY_NAME environment variable, but will fallback to "NinjaOne RMM" if it happens to not be set.

    By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).

.EXAMPLE
    -Title "My Title Here" -Message "My Message Here"
    Sends the title "My Title Here" and message "My Message Here" as a Toast message/notification to the currently signed in user.
.EXAMPLE
    -Title "My Title Here" -Message "My Message Here" -ApplicationId "MyCompany"
    Sends the title "My Title Here" and message "My Message Here" as a Toast message/notification to the currently signed in user.
        ApplicationId: Creates a registry entry for your toasts called "MyCompany".
.OUTPUTS
    None
.NOTES
    If you want to change the defaults then with in the param block.
    If you want to customize the application name to show your company name,
        then look for $ApplicationId and change the content between the double quotes.

    Minimum OS Architecture Supported: Windows 10 (IoT editions are not supported due to lack of shell)
    Release Notes: Initial Release
#>

[CmdletBinding()]
param
(
    [string]$Title,
    [string]$Message,
    [string]$ApplicationId
)

begin {
    # Set the default ApplicationId if it's not provided. Use the Company Name if available, otherwise use the default.
    $ApplicationId = if ($env:NINJA_COMPANY_NAME) { $env:NINJA_COMPANY_NAME } else { "NinjaOne RMM" }

    Write-Host "[Info] Using ApplicationId: $($ApplicationId -replace '\s+','.')"

    if ($env:title -and $env:title -notlike "null") { $Title = $env:title }
    if ($env:message -and $env:message -notlike "null") { $Message = $env:message }
    if ($env:applicationId -and $env:applicationId -notlike "null") { $ApplicationId = $env:applicationId }

    if ([String]::IsNullOrWhiteSpace($Title)) {
        Write-Host "[Error] A Title is required."
        exit 1
    }
    if ([String]::IsNullOrWhiteSpace($Message)) {
        Write-Host "[Error] A Message is required."
        exit 1
    }

    if ($Title.Length -gt 42) {
        Write-Host "[Warn] The Title is longer than 42 characters. The title will be truncated by the Windows API to 42 characters."
    }
    if ($Message.Length -gt 254) {
        Write-Host "[Warn] The Message is longer than 254 characters. The message might get truncated by the Windows API."
    }

    function Test-IsSystem {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        return $id.Name -like "NT AUTHORITY*" -or $id.IsSystem
    }

    if (Test-IsSystem) {
        Write-Host "[Error] Please run this script as 'Current Logged on User'."
        Exit 1
    }

    function Set-RegKey {
        param (
            $Path,
            $Name,
            $Value,
            [ValidateSet("DWord", "QWord", "String", "ExpandedString", "Binary", "MultiString", "Unknown")]
            $PropertyType = "DWord"
        )
        if (-not $(Test-Path -Path $Path)) {
            # Check if path does not exist and create the path
            New-Item -Path $Path -Force | Out-Null
        }
        if ((Get-ItemProperty -Path $Path -Name $Name -ErrorAction Ignore)) {
            # Update property and print out what it was changed from and changed to
            $CurrentValue = (Get-ItemProperty -Path $Path -Name $Name -ErrorAction Ignore).$Name
            try {
                Set-ItemProperty -Path $Path -Name $Name -Value $Value -Force -Confirm:$false -ErrorAction Stop | Out-Null
            }
            catch {
                Write-Host "[Error] Unable to Set registry key for $Name please see below error!"
                Write-Host "$($_.Exception.Message)"
                exit 1
            }
            Write-Host "[Info] $Path\$Name changed from:"
            Write-Host " $CurrentValue to:"
            Write-Host " $($(Get-ItemProperty -Path $Path -Name $Name -ErrorAction Ignore).$Name)"
        }
        else {
            # Create property with value
            try {
                New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType $PropertyType -Force -Confirm:$false -ErrorAction Stop | Out-Null
            }
            catch {
                Write-Host "[Error] Unable to Set registry key for $Name please see below error!"
                Write-Host "$($_.Exception.Message)"
                exit 1
            }
            Write-Host "[Info] Set $Path\$Name to:"
            Write-Host " $($(Get-ItemProperty -Path $Path -Name $Name -ErrorAction Ignore).$Name)"
        }
    }

    function Show-Notification {
        [CmdletBinding()]
        Param (
            [string]
            $ApplicationId,
            [string]
            $ToastTitle,
            [string]
            [Parameter(ValueFromPipeline)]
            $ToastText
        )

        # Import all the needed libraries
        [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null
        [Windows.UI.Notifications.ToastNotification, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null
        [Windows.System.User, Windows.System, ContentType = WindowsRuntime] > $null
        [Windows.System.UserType, Windows.System, ContentType = WindowsRuntime] > $null
        [Windows.System.UserAuthenticationStatus, Windows.System, ContentType = WindowsRuntime] > $null
        [Windows.Storage.ApplicationData, Windows.Storage, ContentType = WindowsRuntime] > $null

        # Make sure that we can use the toast manager, also checks if the service is running and responding
        try {
            $ToastNotifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("$ApplicationId")
        }
        catch {
            Write-Host "$($_.Exception.Message)"
            Write-Host "[Error] Failed to create notification."
        }

        # Create a new toast notification
        $RawXml = [xml] @"
<toast scenario='urgent'>
    <visual>
    <binding template='ToastGeneric'>
        <text hint-maxLines='1'>$ToastTitle</text>
        <text>$ToastText</text>
    </binding>
    </visual>
</toast>
"@

        # Serialized Xml for later consumption
        $SerializedXml = New-Object Windows.Data.Xml.Dom.XmlDocument
        $SerializedXml.LoadXml($RawXml.OuterXml)

        # Setup how are toast will act, such as expiration time
        $Toast = $null
        $Toast = [Windows.UI.Notifications.ToastNotification]::new($SerializedXml)
        $Toast.Tag = "PowerShell"
        $Toast.Group = "PowerShell"
        $Toast.ExpirationTime = [DateTimeOffset]::Now.AddMinutes(1)

        # Show our message to the user
        $ToastNotifier.Show($Toast)
    }
}
process {
    # Create an object to store the ApplicationId and DisplayName
    $Application = [PSCustomObject]@{
        DisplayName = $ApplicationId
        # Replace any spaces with a period in the ApplicationId
        AppId       = $($ApplicationId -replace '\s+', '.')
    }
    Write-Host "Display Name: $($Application.DisplayName)"
    Write-Host "Application ID: $($Application.AppId)"

    Set-RegKey -Path "HKCU:\SOFTWARE\Classes\AppUserModelId\$($Application.AppId)" -Name "DisplayName" -Value $Application.DisplayName -PropertyType String
    Set-RegKey -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\$($Application.AppId)" -Name "AllowUrgentNotifications" -Value 1 -PropertyType DWord

    try {
        Write-Host "[Info] Attempting to send message to user..."
        $NotificationParams = @{
            ToastTitle    = $Title
            ToastText     = $Message
            ApplicationId = $Application.AppId
        }
        Show-Notification @NotificationParams -ErrorAction Stop
        Write-Host "[Info] Message sent to user."
    }
    catch {
        Write-Host "[Error] Failed to send message to user."
        Write-Host "$($_.Exception.Message)"
        exit 1
    }
    exit 0
}
end {
    
    
    
}

 

Gagnez du temps grâce à plus de 300 scripts du Dojo NinjaOne.

Obtenir l’accès

Description détaillée

Ce script est conçu pour envoyer des notifications toasts urgentes à l’utilisateur actuellement connecté. Voici une description étape par étape :

1. Définition des paramètres par défaut de l’application 

Le script vérifie la présence d’une variable d’environnement NINJA_COMPANY_NAME pour définir l’ApplicationId par défaut. S’il n’est pas disponible, il revient à “NinjaOne RMM” Cette flexibilité permet aux prestataires de services de gestion des marques de notifier leurs clients.

2. Entrées de paramètres 

Le script accepte trois paramètres clés :

a. Titre : le titre de la notification.

b. Message : le corps du texte de la notification.

c. ApplicationId : Un identifiant facultatif pour le marquage ou le suivi.

3. Validation des entrées

Il valide les entrées pour s’assurer que le titre et le message ne sont pas vides. Si les longueurs dépassent les limites de l’API Windows (42 caractères pour le titre et 254 pour le message), des avertissements s’affichent.

4. Vérification du système

Le script comprend une sauvegarde pour s’assurer qu’il est exécuté par l’utilisateur connecté et non en tant que processus au niveau du système, ce qui empêcherait l’affichage des notifications.

5. Configuration du registre

Des entrées de registre personnalisées sont créées pour le nom d’affichage de la notification et pour activer les notifications urgentes. Ces modifications garantissent un bon fonctionnement et une bonne expérience de l’utilisateur.

6. Création d’une notification

En s’appuyant sur l’API Windows UI Notifications, le script construit et affiche une notification toast. Le message est étiqueté et regroupé pour une meilleure traçabilité.

7. Gestion des erreurs

La gestion complète des erreurs garantit que les problèmes de configuration ou d’exécution sont enregistrés, ce qui facilite la résolution des problèmes.

Cas d’utilisation potentiels

Étude de cas : Alerte informatique en cas de période d’inactivité programmée

Imaginez une entreprise MSP qui gère l’infrastructure informatique d’une entreprise de taille moyenne. L’équipe informatique prévoit d’effectuer une maintenance du système en demandant aux utilisateurs de sauvegarder leur travail avant une période d’inactivité programmée. À l’aide de ce script, elle envoie une notification toast intitulée “Alerte de maintenance programmée” avec le message suivant : “Veuillez sauvegarder votre travail. La maintenance commence à 20 heures”

Cette approche permet de s’assurer que les utilisateurs sont informés immédiatement, sans se base sur un e-mail, qui risque de ne pas être lu à temps.

Comparaisons

Par rapport aux méthodes de notification traditionnelles :

  • E-mails : Dépendent des utilisateurs qui consultent leur boîte de réception, ce qui peut retarder des actions critiques.
  • Pop-Ups : Souvent perçus comme intrusifs et rapidement rejetés.
  • Ce script : Propose un compromis idéal : notifications urgentes, visibles, mais non perturbatrices, tirant parti de l’écosystème Windows.

FAQ

Q : Ce script peut-il fonctionner sous Windows 7 ?

Non, le système d’exploitation minimum pris en charge est Windows 10, car il s’appuie sur des API de notification modernes.

Q : Que se passe-t-il si le script est exécuté en tant que SYSTEM ?

Le script détecte et empêche l’exécution dans un contexte système, exigeant qu’il soit exécuté par l’utilisateur connecté.

Q : La notification est-elle persistante ?

Non, la notification toast expire au bout d’une minute, sauf si l’utilisateur l’interrompt plus tôt.

Q : L’identifiant de l’application peut-il être personnalisé ?

Oui, soit via le paramètre ApplicationId, soit en modifiant la valeur par défaut dans le script.

Implications

L’utilisation de ce script améliore la communication informatique en garantissant que les notifications critiques sont vues rapidement. Toutefois, une utilisation excessive des notifications urgentes pourrait entraîner une “lassitude face aux alertes”, réduisant ainsi leur efficacité. Les équipes informatiques doivent utiliser cet outil de manière judicieuse pour maintenir son impact.

Recommandations

  • Test : testez toujours le script dans un environnement de non-production pour confirmer sa fonctionnalité.
  • Expérience utilisateur : évitez les titres et les messages trop longs : veillez à ce qu’ils soient concis et exploitables.
  • Image de marque : utilisez un identifiant d’application significatif pour créer un climat de confiance et de reconnaissance parmi les utilisateurs.
  • Sécurité : limitez l’accès aux scripts au personnel autorisé afin d’éviter toute utilisation abusive.

Conclusion

Ce script PowerShell est un complément puissant à la boîte à outils d’un professionnel de l’informatique, offrant des capacités de notification précises, personnalisables et efficaces. Pour les MSP et les équipes informatiques utilisant NinjaOne, l’intégration de ce script dans des flux de travail plus larges s’aligne sur l’accent mis par la plateforme sur une gestion informatique rationalisée et proactive.

Pour aller plus loin

Pour créer une équipe informatique efficace et performante, il est essentiel d'avoir une solution centralisée qui joue le rôle de nœud principal pour vos services. NinjaOne permet aux équipes informatiques de surveiller, gérer, sécuriser et prendre en charge tous les appareils, où qu'ils soient, sans avoir besoin d'une infrastructure complexe sur site. Pour en savoir plus sur NinjaOne Endpoint Management, participez à une visite guidée, ou profitez d'un essai gratuit de la plateforme NinjaOne.

Catégories :

Vous pourriez aussi aimer

×

Voir NinjaOne en action !

En soumettant ce formulaire, j'accepte la politique de confidentialité de NinjaOne.

Termes et conditions NinjaOne

En cliquant sur le bouton “J’accepte” ci-dessous, vous indiquez que vous acceptez les termes juridiques suivants ainsi que nos conditions d’utilisation:

  • Droits de propriété: NinjaOne possède et continuera de posséder tous les droits, titres et intérêts relatifs au script (y compris les droits d’auteur). NinjaOne vous accorde une licence limitée pour l’utilisation du script conformément à ces conditions légales.
  • Limitation de l’utilisation: Les scripts ne peuvent être utilisés qu’à des fins personnelles ou professionnelles internes légitimes et ne peuvent être partagés avec d’autres entités.
  • Interdiction de publication: Vous n’êtes en aucun cas autorisé à publier le script dans une bibliothèque de scripts appartenant à, ou sous le contrôle d’un autre fournisseur de logiciels.
  • Clause de non-responsabilité: Le texte est fourni “tel quel” et “tel que disponible”, sans garantie d’aucune sorte. NinjaOne ne promet ni ne garantit que le script sera exempt de défauts ou qu’il répondra à vos besoins ou attentes particulières.
  • Acceptation des risques: L’utilisation du script est sous votre propre responsabilité. Vous reconnaissez qu’il existe certains risques inhérents à l’utilisation du script, et vous comprenez et assumez chacun de ces risques.
  • Renonciation et exonération de responsabilité: Vous ne tiendrez pas NinjaOne pour responsable des conséquences négatives ou involontaires résultant de votre utilisation du script, et vous renoncez à tout droit ou recours légal ou équitable que vous pourriez avoir contre NinjaOne en rapport avec votre utilisation du script.
  • EULA: Si vous êtes un client de NinjaOne, votre utilisation du script est soumise au contrat de licence d’utilisateur final qui vous est applicable (End User License Agreement (EULA)).