Microsoft 365 health

How to export Message center posts in Microsoft 365

Export Message center posts with Microsoft Graph PowerShell, filter them by tag in the Microsoft 365 admin centre, or run Altivane's Message Centre report for a workbook of every post.

By the Published

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.

Choose the method that fits the job
MethodBest fit
PowerShellA CSV of every post, those with an action due first, for planning or a change board.
Admin centreReading, filtering and sharing posts as they arrive.
AltivaneRecommended 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.Read.All; 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.

PowerShell
# Install once, if the modules are not already installed.
$modules = 'Microsoft.Graph.Authentication', 'Microsoft.Graph.Devices.ServiceAnnouncement'
Install-Module $modules -Scope CurrentUser
PowerShell
$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 = $_.Body.Content 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.

PowerShell
# Run while connected to Microsoft Graph.
Get-MgServiceAnnouncementMessage -All | Where-Object IsMajorChange |
    Sort-Object ActionRequiredByDateTime |
    Select-Object Id, Title, ActionRequiredByDateTime, LastModifiedDateTime

Option 2

Review Message center posts in the admin centre

  1. Sign in to the Microsoft 365 admin centre for the correct tenant.
  2. Go to Health > Message center. The Inbox tab lists the active posts, the most recent first.
  3. Select Choose columns to show Act by and Category, then sort by Act by.
  4. 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.
  5. 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.

Common 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.

Talk to us about Altivane

Questions, or pricing? Get in touch.

Contact us