Microsoft Teams : Publier un message via PowerShell et Webhook
Sommaire
I. Présentation
Réservé aux clients Office 365, Microsoft Teams est d'après la firme de Redmond "un espace d'équipe pour l'échange instantané et la collaboration dans Office 365". En effet, l'intégration de Teams au sein du package Office 365 est forte puisqu'il est directement en relation avec SharePoint/OneDrive, OneNote et même Skype (à qui d'ailleurs il reprend quelques fonctions).
Ces derniers temps et pour notre bonheur, les développeurs s'activent sur Microsoft Teams pour proposer des connecteurs, c'est-à-dire l'intégration et la connexion de Teams avec d'autres applications et services. Et non pas forcément des outils Microsoft, mais des outils tiers.
Il y a un connecteur particulièrement intéressant qui se nomme "Webhook entrant" et qui comme son nom l'indique permet d'envoyer des requêtes web à Teams (via la méthode POST) pour envoyer des données. Ainsi, on peut imaginer publier des messages dans Teams par l'envoi d'une requête web ; chose que PowerShell sait très bien faire, là encore pour notre plus grand bonheur.
Voyons ensemble comment ajouter le connecteur Webhook sur un canal Teams et ensuite comment publier un message dans Teams avec PowerShell.
Plutôt que de recevoir des notifications par e-mail, il peut être intéressant de bouleverser ses habitudes et d'envoyer les messages directement dans un canal de communication au sein de Teams. Par exemple, à la fin du déploiement d'un poste via un serveur WDS-MDT (ou autre), on peut exécuter un script PowerShell (tout simple) qui ira publier un message dans Teams, pour - par exemple - indiquer différentes informations sur le poste déployé.
II. Créer le connecteur Webhook
Au sein de Microsoft Teams, nous allons ajouter un nouveau connecteur sur le canal dans lequel nous souhaitons pusher des messages. Cliquez sur l'icône "..." au niveau du canal souhaité, dans mon cas "Déploiements (WDS-MDT)" au sein d'une équipe "Notifications", et cliquez sur "Connecteurs".
Vous avez ensuite accès à la liste des connecteurs déjà ajoutés à ce canal et ceux que vous pouvez ajouter. La liste grossie au fil du temps, ce qui est une bonne chose. Pour notre part, nous allons ajouter le connecteur "Webhook entrant (Incoming Webhook)" ; cliquez sur le bouton "Ajouter".
Il faut donner un nom à notre Webhook, par exemple "webhook-mdt-wds", ce qui sera en quelque sorte le nom utilisé pour poster les messages dans Teams. Vous pouvez même lui attribuer une image en cliquant sur le bouton "Télécharger une image". Ensuite, descendez un peu... et cliquez sur "Créer".
Après quelques secondes, le connecteur Webhook doit être créé, vous avez désormais la possibilité de copier une URL. Cette URL est importante car elle permet d'envoyer des données à ce canal, nous l'utiliserons pour la publication des messages.
Dans le menu des connecteurs, on remarque le webhook est présent et qu'il est possible de revenir sur sa configuration, chose qui n'a pas d'utilité ici. Vous pouvez fermer cette fenêtre.
Nous allons passer à la suite puisque la configuration de Teams est terminée, le canal est prêt à recevoir des messages via le Webhook entrant.
III. Publier un message dans Teams avec PowerShell
Pour la publication du message dans Teams en utilisant PowerShell, on va exécuter une requête Web avec une méthode POST pour envoyer nos données à destination du Webhook. Je vous propose d'utiliser mon script PowerShell baptisé "New-TeamsMessage" pour disposer d'un code prêt à l'emploi pour réaliser cette opération, vous retrouverez également quelques exemples et des explications sur l'utilisation du script : New-TeamsMessage
Par exemple, en exécutant mon script de la façon suivante :
.\New-TeamsMessage.ps1 -WebhookURL "https://outlook.office.com/webhook/a9999b3f-1001-4711-f4h9-5e6fffggggg@aaaaa-bbbbb-cccccc/IncomingWebhook/28g90bdcb7ad312ab7afe6598ca7f69b/4a10bd21-2017-fbfb-ffff-585f639e84b0" -MessageText "Hello Teams! From PowerShell"
Vous obtiendrez ceci dans Teams :
Dans le principe, c'est assez simple,on stockage dans une variable l'URL de notre Webhook :
$WebhookURL = "https://outlook.office.com/webhook/a9999b3f-1001-4711-f4h9-5e6fffggggg@aaaaa-bbbbb-cccccc/IncomingWebhook/28g90bdcb7ad312ab7afe6598ca7f69b/4a10bd21-2017-fbfb-ffff-585f639e84b0"
Puis, on définit une hashtable dans PowerShell pour contenir les paramètres de notre message :
$Body = @{ 'text'= "Mon message" }
On construit la requête que l'on va envoyer au Webhook :
# Build the request $Params = @{ Headers = @{'accept'='application/json'} Body = $Body | ConvertTo-Json Method = 'Post' URI = $WebhookURL }
Puis on exécute la requête en utilisant la hashtable de paramètres $Params :
Invoke-RestMethod @Params
Pour personnaliser encore plus les messages envoyés à Teams, par exemple pour inclure un bouton d'actions ou encore des images dans votre message, je vous propose de lire cet article à propos de l'API Connectors et le support de "schema.org/ViewAction" : https://dev.outlook.com/Connectors/Reference
Qu'allez-vous envoyer comme message dans Teams à partir de PowerShell ?
Sinon pour ceux que ça intéresse d'envoyer des messages depuis Linux avec Curl ou encore des notifications directement depuis Azure, je vous recommande de lire l'article de Stanislas Quastana sur le sujet : Remonter des informations Azure dans Microsoft Teams avec les Webhooks
Petite question idiote, j’essaie de faire un script en php qui utilise cURL pour poster un message sur teams et ca ne fonctionne pas.
Y’a une limitation de ce coté ?
Bonjour,
Voici un petit fix du script, suite à une erreur rencontrée récemment :
Error : Bad payload received by generic incoming webhook.
La page de la doc ayant été mise à jour le 29/06 https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using?tabs=PowerShell#tabpanel_1_PowerShell
fin du script New-TeamsMessage.ps1 :
# Build the request
# see following page last updated 2023-06-29
# https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using?tabs=PowerShell#tabpanel_1_PowerShell
$Params = @{
Method = ‘Post’
ContentType = ‘Application/Json’
Body = $Body | ConvertTo-Json
Uri = $WebhookURL
}
# Send the request to Microsoft Teams
Try{
Invoke-RestMethod @Params
}Catch{
Write-Output « Error ! Impossible to publish this message in Microsoft Teams ! »
Write-Host $_
Write-Host $_.ScriptStackTrace
}
Merci pour le fix