To export Message center posts in Microsoft 365, read the tenant's service update messages and save each post's services, category, act-by date and tags to a CSV. Message center holds the posts that are still current: each post expires and is removed, generally 30 days after the period its text describes. Posts tagged Data privacy are for the Global Administrator and Message Center Privacy Reader roles only.
| Method | Best fit |
|---|---|
| PowerShell | A CSV of every post, those with an action due first, for planning or a change board. |
| Admin centre | Reading, filtering and sharing posts as they arrive. |
| Altivane | Recommended for monthly change reviews, with each run's posts kept in a workbook. |
Before you start
Use an account in an admin role that can read Message center. Most admin roles can; Reports Reader, Directory Readers, Privileged Role Administrator and a few others can't. The Message Center Reader role reads and shares posts with no other admin rights. The PowerShell example requests ServiceMessage.; your organisation may require administrator consent.
Know what a post holds. Its category is preventOrFixIssue, planForChange or stayInformed, a major update is announced at least 30 days ahead when an action is required, and an act-by date is set only when Microsoft needs you to act by a deadline. The examples read and export; they don't mark posts as read, archive them or change any preference.
Option 1
Export Message center posts with PowerShell
Install the modules once, then connect and export every post. Posts with an act-by date that hasn't passed come first, then the latest update first.
# Install once, if the modules are not already installed.
$modules = 'Microsoft.Graph.Authentication', 'Microsoft.Graph.Devices.ServiceAnnouncement'
Install-Module $modules -Scope CurrentUser$ErrorActionPreference = 'Stop'
Connect-MgGraph -Scopes 'ServiceMessage.Read.All' -NoWelcome
try {
$now = (Get-Date).ToUniversalTime()
# Posts with an action due first, soonest first, then the latest update first.
$order = @{ Expression = 'ActionDue'; Descending = $true },
@{ Expression = { if ($_.ActionDue) { $_.ActBy } } },
@{ Expression = 'Updated'; Descending = $true }
$messages = @(Get-MgServiceAnnouncementMessage -All)
$report = @($messages | ForEach-Object {
$due = $null -ne $_.ActionRequiredByDateTime -and
$_.ActionRequiredByDateTime.ToUniversalTime() -ge $now
[pscustomobject]@{
Id = $_.Id
Title = $_.Title
Services = @($_.Services) -join '; '
Category = $_.Category
Severity = $_.Severity
MajorChange = $_.IsMajorChange
ActBy = $_.ActionRequiredByDateTime
ActionDue = $due
Published = $_.StartDateTime
Updated = $_.LastModifiedDateTime
Tags = @($_.Tags) -join '; '
}
} | Sort-Object $order)
if ($report.Count -eq 0) {
Write-Output 'Message center returned no posts.'
} else {
$report | Export-Csv -Path './message-center-posts.csv' -NoTypeInformation -Encoding utf8
$dueCount = @($report | Where-Object ActionDue).Count
Write-Output "$($report.Count) posts exported; $dueCount have an action due."
}
} finally {
Disconnect-MgGraph | Out-Null
}The CSV keeps the post's ID, such as MC123456, the number to quote when you call Microsoft support about a post. Tags holds the labels the service team adds, such as Updated message. Times are in UTC. The post's text is left out to keep the file readable; add Body = $_. to the list to include it, as HTML.
List the major updates only
Reconnect with Connect-MgGraph, then keep the posts marked as major updates.
# Run while connected to Microsoft Graph.
Get-MgServiceAnnouncementMessage -All | Where-Object IsMajorChange |
Sort-Object ActionRequiredByDateTime |
Select-Object Id, Title, ActionRequiredByDateTime, LastModifiedDateTimeOption 2
Review Message center posts in the admin centre
- Sign in to the Microsoft 365 admin centre for the correct tenant.
- Go to Health > Message center. The Inbox tab lists the active posts, the most recent first.
- Select Choose columns to show Act by and Category, then sort by Act by.
- Filter by tag to show the Major update or Retirement posts, and use the Service filter to narrow the list to the services you look after.
- Select a post to read it. Opening a post marks it as read in your own view; other admins' views don't change.
This suits reading posts as they arrive and sharing 1 with a colleague. The columns, filters and read marks belong to your account. For a file to keep after the posts expire, use PowerShell or a report.
Option 3 ยท Recommended for monthly change reviews
Export Message center posts with Altivane
- Open Altivane and choose the tenant.
- Run the Message Centre report.
- Open the Excel workbook and find Message centre: every post, those with an act-by date that hasn't passed first, soonest first, then the latest update first.
- Read Act by and Major Change for the posts to plan for, and Services and Tags for what each one touches.
Each row also has the post's ID, title, category and severity in plain words, and when it was published and last updated, in local time. The workbook from each run stays in the tenant's folder, so last month's posts are still there to compare after Message center has removed them. The report needs a tenant signed in with a certificate.
Contact usCommon questions
Why has a post disappeared?
Each post expires and is removed after a time, generally 30 days after the period its text describes. A post you archived is still there, under the Archive tab, and can be restored to the Inbox.
Why can't another admin see Message center?
Some admin roles have no access to it, Reports Reader, Directory Readers and Conditional Access Administrator among them. Give the person the Message Center Reader role to read and share posts without other admin rights.
Where are the outages?
Not in Message center. Incidents and advisories are in Service health; see how to check Microsoft 365 service health.
Microsoft references
Technical references checked on 7 November 2026. The example scripts have been reviewed and syntax checked; they have not been run against a live tenant.