As a consultant, technician or system owner, staying up to date with Microsoft 365 is a daunting task. With changes seemingly happening daily, how do you keep up?
The Challenge
There are multiple sources for information on what happening with Microsoft 365
- Service Health tells you about the current status of each service in your tenant
- Message Center tells you about new features and breaking changes to your specific tenant
- Microsoft 365 Roadmap tells you about what is planned and rolling out for each service
- Office Pro Plus what’s new tells you about new features and capabilities of Word, Excel, PowerPoint, etc.
Some of the information requires that you have admin privileges in your tenant. The introduction of the Global Reader role helps in some capacity. Still, there are a lot of different places where you can find this information. A good example is the information about your tenant being migrated from Skype for Business to Teams, this is informed about through the message center, if you are not checking it you may miss the windows to postpone the upgrade.
The Solution
Use Graph and PowerShell to get this information, run it in Azure Automation and publish it to a dedicated team with channels per feature and source. From there your team can leverage the per channel notification in Teams where you can get notified of all new posts that arrives in a specific channel. In this way, you can easily get information about news that interest you and your focus area. Some may be interested in Teams, others may be interested in Intune.

Here you can set how you want to be notified from this channel, I chose to get a notification in my activity feed whenever a new item arrives
How to get there
Einar Asting, who I have worked with for the past two years at a customer site, has created and published all this on his blog and GitHub with how to get started and how to run it though Azure Automation. Check out his articles
- Part I – Microsoft 365 Roadmap
- Part II – Office 365 Health Status
- Part III – Microsoft Message Center – Announcements
- Part IV – Azure Resource Health
- Part V – Office ProPlus updates
How I use the scripts
The above routines work great, but they post to the same channel. I want to sort the information in the separate channels to make sure I do not get information overload. I have therefore a script that creates the team and all the channels which you can find in my public GitHub. I have also added the If Else routine to change the URI based on the category of the roadmap, health status, and message center items. I did not want to do this via a pull request to the original scripts as it requires much more work to get working and is more like an optional feature.
Caveat
The script post message cards using webhooks. There may be other methods to do this, but it works. The caveat is that you must manually create the webhook for each channel and there are 23 channels. It is a onetime job, so I guess you survive. I checked with Microsoft, there is no way to create a webhook today programmatically.
How to post categories to different channels
#Teams webhooks for Microsoft 365 Roadmap add to top of script $M365RInfra = "Your Webhook URI" $M365RExchange = "Your Webhook URI" $M365RTeamsSkype = "Your Webhook URI" $M365RSPOOF = "Your Webhook URI" $M365RYammer = "Your Webhook URI" $M365RIntune = "Your Webhook URI" $M365RSecurity = "Your Webhook URI" $M365RNextGenApps = "Your Webhook URI" $M365ROffice = "Your Webhook URI" $M365RCompliance = "Your Webhook URI" #Determine which channel the post belongs to, place before the final invoke-restmethod if ($category -match "exchange"){$uri=$M365RExchange} elseif ($category -match "Lync" -or $category -match "Skype" -or $category -match "teams"){$uri=$M365RTeamsSkype} elseif ($category -match "sharepoint" -or $category -match "onedrive"){$uri=$M365RSPOOF} elseif ($category -match "Intune"){$uri=$M365RIntune} elseif ($category -match "Yammer"){$uri=$M365RYammer} elseif ($category -match "ATP" -or $category -match "Cloud App Secruity"){$uri=$M365RSecurity} elseif ($category -match "Planner" -or $category -match "Stream" -or $category -match "Forms" -or $category -match "Bookings" -or $category -match "Whiteboard"){$uri=$M365RNextGenApps} elseif ($category -match "Office" -or $category -match "Outlook" -or $category -match "PowerPoint" -or $category -match "To-Do" -or $category -match "Visio" -or $category -match "OneNote" -or $category -match "Excel" -or $category -match "Project" -or $category -match "Access" -or $category -match "Word"){$uri=$M365ROffice} elseif ($category -match "Compliance" -or $category -match "Information Protection" ){$uri=$M365RCompliance} else {$uri=$M365RInfra} #Teams webhooks for Health Status add to top of script $HCInfra = "Your Webhook URI" $HCExchange = "Your Webhook URI" $HCTeamsSkype = "Your Webhook URI" $HCSPOOF = "Your Webhook URI" $HCYammer = "Your Webhook URI" $HCIntune = "Your Webhook URI" #Determine which channel the post belongs to, place before the final invoke-restmethod if ($inc.Workload -match "exchange"){$uri=$HCExchange} elseif ($inc.Workload -match "Lync" -or $inc.Workload -match "Skype" -or $inc.Workload -match "teams"){$uri=$HCTeamsSkype} elseif ($inc.Workload -match "sharepoint" -or $inc.Workload -match "onedrive"){$uri=$HCSPOOF} elseif ($inc.Workload -match "Intune"){$uri=$HCIntune} elseif ($inc.Workload -match "Yammer"){$uri=$HCYammer} else {$uri=$HCInfra} #Teams webhooks for Message Center add to top of script $MCInfra = "Your Webhook URI" $MCExchange = "Your Webhook URI" $MCTeamsSkype = "Your Webhook URI" $MCSPOOFB = "Your Webhook URI" $MCYammer = "Your Webhook URI" $MCIntune = "Your Webhook URI" #Determine which channel the post belongs to, place before the final invoke-restmethod if ($inc.AffectedWorkloadDisplayNames -match "exchange"){$uri=$MCExchange} elseif ($inc.AffectedWorkloadDisplayNames -match "Skype" -or $inc.AffectedWorkloadDisplayNames -match "teams"){$uri=$MCTeamsSkype} elseif ($inc.AffectedWorkloadDisplayNames -match "sharepoint" -or $inc.AffectedWorkloadDisplayNames -match "onedrive"){$uri=$MCSPOOFB} elseif ($inc.AffectedWorkloadDisplayNames -match "Intune"){$uri=$MCIntune} elseif ($inc.AffectedWorkloadDisplayNames -match "Yammer"){$uri=$MCYammer} else {$uri=$MCInfra}