Staying up to date with #Microsoft365 using #MicrosoftTeams

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.

channelnotification

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

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.

TeamsNotification script.PNG

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}