Microsoft Teams governance

How to list private and shared channels in Microsoft Teams

List every private and shared channel with Microsoft Graph PowerShell, count them for each team in the Teams admin centre, or run Altivane's Team Channels report for a workbook.

By the Published

To list private and shared channels in Microsoft Teams, read every team with Get-MgTeam, then each team's channels with Get-MgTeamChannel, filtered by membershipType. Microsoft says team members can't see the private or shared channels they aren't members of, so compare the result with each team's counts in the Teams admin centre.

Choose the method that fits the job
MethodBest fit
PowerShellA CSV of every private and shared channel, with its team and creation date.
Admin centreCounts of private and shared channels for each team, and 1 team's channels.
AltivaneRecommended for governance reviews, with every channel of every team in 1 workbook.

Before you start

Use an account with the Teams Administrator role: Microsoft says Teams service admins can access teams they aren't a member of. The PowerShell example requests Team.ReadBasic.All and Channel.ReadBasic.All; your organisation may require administrator consent.

Know the 3 kinds. A standard channel is open to the whole team. A private channel is open only to the team members added to it, guests included. A shared channel can include people who aren't in the team, from inside or outside the organisation. The script lists the channels each team hosts as they are when it runs. The examples read and export; they create, change or delete no channel.

Option 1

List private and shared channels with PowerShell

Install the modules once, then connect and export each team's private and shared channels. The filter runs in Microsoft Graph, so standard channels never come back.

PowerShell
# Install once, if the modules are not already installed.
Install-Module Microsoft.Graph.Authentication, Microsoft.Graph.Teams -Scope CurrentUser
PowerShell
$ErrorActionPreference = 'Stop'
Connect-MgGraph -Scopes 'Team.ReadBasic.All', 'Channel.ReadBasic.All' -NoWelcome
try {
    $teams = @(Get-MgTeam -All -Property 'id', 'displayName')
    $select = 'displayName', 'membershipType', 'createdDateTime', 'description'
    $report = @(foreach ($team in $teams) {
        if (-not $team.Id) { continue }
        foreach ($kind in 'private', 'shared') {
            $query = @{
                TeamId = $team.Id
                Filter = "membershipType eq '$kind'"
                Property = $select
            }
            foreach ($channel in Get-MgTeamChannel @query -All) {
                [pscustomobject]@{
                    Team = $team.DisplayName
                    Channel = $channel.DisplayName
                    Kind = $channel.MembershipType
                    Created = $channel.CreatedDateTime
                    Description = $channel.Description
                }
            }
        }
    })
    if ($report.Count -eq 0) {
        Write-Output "None of the $($teams.Count) teams has a private or shared channel."
    } else {
        $report | Sort-Object Team, Kind, Channel |
            Export-Csv -Path './private-and-shared-channels.csv' -NoTypeInformation -Encoding utf8
        Write-Output "$($report.Count) private and shared channels exported."
    }
} finally {
    Disconnect-MgGraph | Out-Null
}

The CSV has 1 row for each private or shared channel. The script selects only the properties it needs, because Microsoft says filling in a channel's email address is slow. It reads 2 calls for each team, so a large tenant takes a while. Remove 'shared' from the loop to list private channels only.

List 1 team's channels of every kind

Reconnect with Connect-MgGraph, then read 1 team's channels by its ID.

PowerShell
# Run while connected to Microsoft Graph. Replace the example team ID.
$teamId = '00000000-0000-0000-0000-000000000000'
Get-MgTeamChannel -TeamId $teamId -All | Select-Object DisplayName, MembershipType, CreatedDateTime

Option 2

Review channels in the admin centre

  1. Sign in to the Microsoft Teams admin centre for the correct tenant.
  2. Go to Teams > Manage teams. The grid counts Private channels and Shared channels for each team; if a column is missing, add it with Edit columns.
  3. Select a team by its name to open its profile, which lists its members and channels. Each channel has its own page with its members.
  4. Leave the page without adding or removing a channel or member, so nothing changes.

This suits a quick count, or checking 1 team. It does not suit a list of every private and shared channel by name, since each team's channels are on its own page.

Common questions

Why are some private channels missing from the list?

The account that signed in probably isn't a member of them, and the call leaves those out. Compare the list with the Private channels and Shared channels counts under Teams > Manage teams in the Teams admin centre, and open a team there to see its channels.

Who can be in a private channel?

Only people already in the team, guests included. To export the team's members, see how to export team members and owners in Microsoft Teams. A channel's own members are on its profile in the Teams admin centre.

Can I stop people creating private or shared channels?

Yes. Teams policies, under Teams > Teams policies in the admin centre, have Create private channels and Create shared channels. Team owners can also decide whether members may create private channels in their team.

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