Public and Private teams
In Microsoft Teams there are two types of team, Public and Private.
Public means anyone in the organisation (tenant) can join the team at any time without any approval
Private means owners of the team must admit new members.
I’m not in love with the names as these types have no bearing as to there being external guests (from other organisations/tenants) in the team. Open and Closed might make more sense, but it is what it is.
By default both Private and Public teams are discoverable. Meaning when users go to join or create a team
Note, originally private teams were not discoverable, this default changed in 2018 to allow a better user experience to find and join private teams.
Public teams are always discoverable. Private teams are discoverable by default, but when creating a private team, users can elect to make the team not searchable and discoverable. I.e. hidden from the join team screen and search. These are Non-discoverable private teams or Hidden Teams.
The use case here is a team that is not appropriate for people to know about outside of the members.
How can an administrator find non-discoverable
An administrator might have reason to find or report on non-discoverable/hidden teams
Teams admin center has some basic Team reporting and shows Privacy for Teams as Public, Private or “1Mgmt.Teams.Lifecycle.List.Column.Privacy.HiddenMembership-“ which equates to Hidden
Note I have removed a bunch of columns for an easier screenshot
Example hidden team
The challenge is you can’t sort, filter or export this report. So you can’t easily find all the hidden teams.
Finding Hidden Teams with PowerShell
Fortunately, it’s easy to find hidden teams by PowerShell. From the Powershell console run:
# Install the Microsoft Teams PowerShell Module from PSGallery
Install-Module -Name MicrosoftTeams -Repository PSGallery -Force
# Connect to Microsoft Teams
# Get hidden teams
get-team -Visibility HiddenMembership | Format-Table –AutoSize
The PowerShell might take a while as it cycles through all your teams. You can also use –Visibility Private or –visibility Public to list those teams.
That will give you a complete list of the hidden teams, their groupid, display name and description.
From here if you also want the owners and members you can do that too
Foreach ($team in $HiddenTeams)
Get-TeamUser -GroupId $team.groupid | Select-Object User,Name,Role | Format-Table
You could also neatly format this all into a single object/report, rather than just spewing it to the console, but hopefully you get the idea.