Exchange Online reporting

How to export dynamic distribution groups in Exchange Online

Export dynamic distribution groups and their membership filters with Exchange Online PowerShell, read each group in the Exchange admin centre, or run Altivane's Dynamic Distribution Groups report.

By the Published

To export dynamic distribution groups in Exchange Online, read them with Get-DynamicDistributionGroup -ResultSize Unlimited and keep each group's RecipientFilter, the rule that decides its members. Exchange Online stores each group's member list and refreshes it every 24 hours, so a person who starts to match the filter can wait up to a day for the group's mail.

Choose the method that fits the job
MethodBest fit
PowerShellA CSV of every dynamic group with its filter, owners, outside senders and last refresh.
Admin centreReading 1 group's members and rules, and when each group was last refreshed.
AltivaneRecommended for regular group reviews, with groups open to outside senders and groups Exchange marks as not valid flagged.

Before you start

Use an account in the Organization Management or Recipient Management role group, which Microsoft lists for distribution groups. Microsoft says members of View-Only Organization Management can view the configuration of those features. The example uses the ExchangeOnlineManagement module and asks for no Microsoft Graph permission.

Know how the member list works. Microsoft says that since late May 2026, a group whose rules match 5,000 members or fewer gets its member list straight away when it is created or its rules change. A larger group takes up to 2 hours, and keeps its old list while it waits. Every group's list is then refreshed at least once every 24 hours, so someone who stops matching the filter can keep receiving the group's mail until the next refresh. The examples read and export; they change no group or rule.

Option 1

Export dynamic distribution groups with PowerShell

Install the module once, then connect and export 1 row for each dynamic distribution group.

PowerShell
# Install once, if the module is not already installed.
Install-Module ExchangeOnlineManagement -Scope CurrentUser
PowerShell
$ErrorActionPreference = 'Stop'
Connect-ExchangeOnline
try {
    $groups = @(Get-DynamicDistributionGroup -ResultSize Unlimited)
    $report = @(foreach ($group in $groups) {
        [pscustomobject]@{
            Name = $group.DisplayName
            Address = $group.PrimarySmtpAddress
            RecipientFilter = $group.RecipientFilter
            IncludedRecipients = "$($group.IncludedRecipients)"
            Owners = ($group.ManagedBy -join '; ')
            AcceptsExternalMail = -not $group.RequireSenderAuthenticationEnabled
            HiddenFromAddressLists = $group.HiddenFromAddressListsEnabled
            LastRefreshed = $group.CalculatedMembershipUpdateTime
        }
    })
    if ($report.Count -eq 0) {
        Write-Output 'The tenant has no dynamic distribution groups.'
    } else {
        $report | Sort-Object Name |
            Export-Csv -Path './dynamic-distribution-groups.csv' -NoTypeInformation -Encoding utf8
        Write-Output "$($report.Count) dynamic distribution groups exported."
    }
} finally {
    Disconnect-ExchangeOnline -Confirm:$false
}

The CSV has 1 row per group. RecipientFilter is the filter Exchange applies, IncludedRecipients is set for a group built from the standard recipient types, and LastRefreshed is when Exchange last calculated the member list. A group with AcceptsExternalMail true takes mail from anyone on the internet, which matters most for a group that reaches every mailbox.

Compare a group's stored members with its filter

Reconnect with Connect-ExchangeOnline, then count the stored members and the recipients who match the filter now. Check the address first: Microsoft warns that a $null or non-existent -Identity value returns every group.

PowerShell
# Run while connected to Exchange Online. Replace the example group.
$address = 'allstaff@example.com'
$group = Get-DynamicDistributionGroup -Identity $address
$stored = @(Get-DynamicDistributionGroupMember -Identity $address -ResultSize Unlimited)
$now = @(Get-Recipient -RecipientPreviewFilter $group.RecipientFilter -ResultSize Unlimited)
Write-Output "Stored members: $($stored.Count). Matching the filter now: $($now.Count)."

A difference usually means the stored list has not caught up with a change yet.

Option 2

Review dynamic distribution groups in the admin centre

  1. Sign in to the Exchange admin centre for the correct tenant.
  2. Go to Recipients > Groups > Dynamic distribution list. The Last refreshed column shows when each group's member list was last calculated.
  3. Select a group, open the Members tab and select View all members to read the stored list. The same tab holds the group's membership rules.
  4. On the Settings tab, read Delivery management for whether people outside your organisation can send to the group.
  5. Close the group without saving, so nothing changes.

This suits looking at 1 group. Microsoft says previewing who matches a filter is only in PowerShell, and the rules of a group with a custom recipient filter can't be changed in the admin centre.

Common questions

Why isn't a new starter getting the group's mail?

The member list is stored and refreshed every 24 hours, so a new mailbox that matches the filter joins at the next refresh. Read CalculatedMembershipUpdateTime or the Last refreshed column, and compare the stored members with the preview in the second block.

Why can't I edit the rules in the admin centre?

The group uses a custom recipient filter. Microsoft says those rules can be changed only in Exchange Online PowerShell; groups built from the standard recipient types and conditions can be changed in the admin centre.

How do I export the members of an ordinary distribution group?

Ordinary groups keep a fixed member list that Get-DistributionGroupMember reads. See how to export distribution group members in Exchange Online.

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