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.
| Method | Best fit |
|---|---|
| PowerShell | A CSV of every private and shared channel, with its team and creation date. |
| Admin centre | Counts of private and shared channels for each team, and 1 team's channels. |
| Altivane | Recommended 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. and Channel.; 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.
# Install once, if the modules are not already installed.
Install-Module Microsoft.Graph.Authentication, Microsoft.Graph.Teams -Scope CurrentUser$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.
# 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, CreatedDateTimeOption 2
Review channels in the admin centre
- Sign in to the Microsoft Teams admin centre for the correct tenant.
- 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.
- 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.
- 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.
Option 3 ยท Recommended for governance reviews
Run Altivane's Team Channels report
- Open Altivane and choose the tenant.
- Run the Team Channels report for Teams.
- Open the Excel workbook and read the table of the same name: every channel of every team with its Team, Team Email, Channel, Kind, Created and Description. Filter Kind to Private and Shared.
- Run the Team Inventory report next for each team's Private Channels and Shared Channels counts beside its owners and guests.
Altivane reads every team's channels in 1 run, standard ones included, so the list also shows teams with no private or shared channel at all. A team whose channels couldn't be read is named on the workbook's Not read sheet rather than left out without a word. The report needs a tenant signed in with a certificate.
Contact usCommon 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.