Forum Discussion

luvsql's avatar
luvsql
Steel Contributor
Nov 15, 2021

Powershell command to export ALL private Teams memberships, including private Channel memberships

There is currently a major issue that Microsoft is not saying is a bug.  When a user is soft-deleted (what happens when we disconnect that user from the on-premise AD to force the cloud-only conversi...
  • luvsql's avatar
    luvsql
    Dec 21, 2021
    I have one that works perfectly that Microsoft gave to me.

    First install and connect:

    Install-Module PowerShellGet -RequiredVersion 2.2.4.1
    Install-Module -Name MicrosoftTeams -RequiredVersion 3.0.0
    Connect-MicrosoftTeams

    Then:
    1. Copy the ps1 file to your downloads folder
    2. cd C:\Users\username\Downloads
    3. .\TeamsChannelMemberReport.ps1

    Choose option 2 to export all and it will export to downloads.

    Save this as TeamsChannelMemberReport.ps1:

    <#
    .Requires -version 2 - Connect-MicrosoftTeams and then Run the script in Powershell
    Updated on 28 Feb 2021
    .SYNOPSIS
    .\TeamsChannelMemberReport.ps1 - It Can Display all the Teams and its Channels and its members on a List
    Or It can Export to a CSV file
    With Export of Specific teams
    Example 1
    PS C:\Scripts> .\TeamsChannelMemberReportv1.0.ps1
    Teams Channel Member Report
    ----------------------------
    1.Display in Microsoft Teams Shell
    2.Export to CSV File
    3.Display Specific Microsoft Team in Shell
    4.Export Specific Microsoft Team to CSV File
    Choose The Task: 1
    User SMTP Address Role Channel DisplayName Team DisplayName
    ----------------- ---- ------------------- ----------------
    Email address removed Owner General Teams_Azure365pro
    Email address removed Member General Teams_Azure365pro
    Email address removed Member General Teams_Azure365pro
    Email address removed Owner General Teams_Azure365pro
    Email address removed Member General Teams_Azure365pro
    Email address removed Member General Teams_Azure365pro
    Email address removed Owner General InformationTec...
    Email address removed Member General InformationTec...
    Email address removed Owner ServiceDesk Team InformationTec...
    Email address removed Owner Infrastructure Team InformationTec...
    Example 2
    PS C:\Scripts> .\TeamsChannelMemberReportv1.0.ps1
    Teams Channel Member Report
    ----------------------------
    1.Display in Microsoft Teams Shell
    2.Export to CSV File
    3.Display Specific Microsoft Team in Shell
    4.Export Specific Microsoft Team to CSV File
    Choose The Task: 2
    Enter the Path of CSV file (Eg. C:\Teams.csv): c:\teams.csv
    .Author
    Written By: Satheshwaran Manoharan
    Change Log
    V1.0, 13/05/2020 - Initial version
    #>

    Write-host "
    Teams Channel Member Report
    ----------------------------
    1.Display in Microsoft Teams Shell
    2.Export to CSV File
    3.Display Specific Microsoft Team in Shell
    4.Export Specific Microsoft Team to CSV File"-ForeGround "Cyan"

    #----------------
    # Script
    #----------------

    Write-Host " "

    $number = Read-Host "Choose The Task"
    $output = @()
    switch ($number)
    {

    1 {
    $i = 0
    $AllTeams = Get-Team
    Foreach ($Team in $AllTeams)
    {
    $AllChannels = Get-TeamChannel -GroupID $Team.GroupID
    Foreach ($Channel in $AllChannels)
    {
    $AllMembers = Get-TeamChannelUser -GroupId $Team.GroupID -DisplayName $channel.DisplayName
    Foreach ($member in $AllMembers)
    {
    $userObj = New-Object PSObject
    $userObj | Add-Member NoteProperty -Name "User SMTP Address" -Value $member.User
    $userObj | Add-Member NoteProperty -Name "Role" -Value $member.role
    $userObj | Add-Member NoteProperty -Name "Channel DisplayName" -Value $Channel.DisplayName
    $userObj | Add-Member NoteProperty -Name "Team DisplayName" -Value $Team.DisplayName

    $output += $UserObj

    }
    }
    # update counters and write progress
    $i++
    Write-Progress -activity "Scanning Teams . . .Channels . . . Members" -status "Scanned: $i of $($AllTeams.Count)" -percentComplete (($i / $AllTeams.Count) * 100)
    Write-Output $Output
    }
    ;Break}

    2 {
    $i = 0
    $CSVfile = Read-Host "Enter the Path of CSV file (Eg. C:\Teams.csv)"
    $AllTeams = Get-Team
    Foreach ($Team in $AllTeams)
    {
    $AllChannels = Get-TeamChannel -GroupID $Team.GroupID
    Foreach ($Channel in $AllChannels)
    {
    $AllMembers = Get-TeamChannelUser -GroupId $Team.GroupID -DisplayName $channel.DisplayName
    Foreach ($member in $AllMembers)
    {
    $userObj = New-Object PSObject
    $userObj | Add-Member NoteProperty -Name "DisplayName" -Value $member.Name
    $userObj | Add-Member NoteProperty -Name "UserId" -Value $member.UserId
    $userObj | Add-Member NoteProperty -Name "User SMTP Address" -Value $member.User
    $userObj | Add-Member NoteProperty -Name "Role" -Value $member.role
    $userObj | Add-Member NoteProperty -Name "Channel DisplayName" -Value $Channel.DisplayName
    $userObj | Add-Member NoteProperty -Name "Channel Description" -Value $Channel.Description
    $userObj | Add-Member NoteProperty -Name "Channel MembershipType" -Value $Channel.MembershipType
    $userObj | Add-Member NoteProperty -Name "Team GroupID" -Value $Team.GroupId
    $userObj | Add-Member NoteProperty -Name "Team DisplayName" -Value $Team.DisplayName
    $userObj | Add-Member NoteProperty -Name "Team Description" -Value $Team.Description
    $userObj | Add-Member NoteProperty -Name "Team Visibility" -Value $Team.Visibility
    $userObj | Add-Member NoteProperty -Name "Team MailNickName" -Value $Team.MailNickName
    $userObj | Add-Member NoteProperty -Name "Team Classification" -Value $Team.Classification
    $userObj | Add-Member NoteProperty -Name "Team Archived" -Value $Team.Archived
    $userObj | Add-Member NoteProperty -Name "Team AllowGiphy" -Value $Team.AllowGiphy
    $userObj | Add-Member NoteProperty -Name "Team GiphyContentRating" -Value $Team.GiphyContentRating
    $userObj | Add-Member NoteProperty -Name "Team AllowStickersAndMemes" -Value $Team.AllowStickersAndMemes
    $userObj | Add-Member NoteProperty -Name "Team AllowGuestCreateUpdateChannels" -Value $Team.AllowGuestCreateUpdateChannels
    $userObj | Add-Member NoteProperty -Name "Team AllowGuestDeleteChannels" -Value $Team.AllowGuestDeleteChannels
    $userObj | Add-Member NoteProperty -Name "Team AllowCreateUpdateChannels" -Value $Team.AllowCreateUpdateChannels
    $userObj | Add-Member NoteProperty -Name "Team AllowCreatePrivateChannels" -Value $Team.AllowCreatePrivateChannels
    $userObj | Add-Member NoteProperty -Name "Team AllowDeleteChannels" -Value $Team.AllowDeleteChannels
    $userObj | Add-Member NoteProperty -Name "Team AllowAddRemoveApps" -Value $Team.AllowAddRemoveApps
    $userObj | Add-Member NoteProperty -Name "Team AllowCreateUpdateRemoveTabs" -Value $Team.AllowCreateUpdateRemoveTabs
    $userObj | Add-Member NoteProperty -Name "Team AllowCreateUpdateRemoveConnectors" -Value $Team.AllowCreateUpdateRemoveConnectors
    $userObj | Add-Member NoteProperty -Name "Team AllowUserEditMessages" -Value $Team.AllowUserEditMessages
    $userObj | Add-Member NoteProperty -Name "Team AllowUserDeleteMessages " -Value $Team.AllowUserDeleteMessages
    $userObj | Add-Member NoteProperty -Name "Team AllowOwnerDeleteMessages" -Value $Team.AllowOwnerDeleteMessages
    $userObj | Add-Member NoteProperty -Name "Team AllowTeamMentions" -Value $Team.AllowTeamMentions
    $userObj | Add-Member NoteProperty -Name "Team AllowChannelMentions" -Value $Team.AllowChannelMentions
    $userObj | Add-Member NoteProperty -Name "Team ShowInTeamsSearchAndSuggestions" -Value $Team.ShowInTeamsSearchAndSuggestions

    $output += $UserObj

    }
    }
    # update counters and write progress
    $i++
    Write-Progress -activity "Scanning Teams . . .Channels . . . Members" -status "Scanned: $i of $($AllTeams.Count)" -percentComplete (($i / $AllTeams.Count) * 100)
    $output | Export-csv -Path $CSVfile -NoTypeInformation -Encoding UTF8

    }
    ;Break}

    3 {
    $i = 0
    $Teamname = Read-Host "Enter the Team Display name or Range (Eg. Teamname , Team*,*Team)"
    $AllTeams = Get-Team | Where-object {$_.DisplayName -like $Teamname}
    Foreach ($Team in $AllTeams)
    {
    $AllChannels = Get-TeamChannel -GroupID $Team.GroupID
    Foreach ($Channel in $AllChannels)
    {
    $AllMembers = Get-TeamChannelUser -GroupId $Team.GroupID -DisplayName $channel.DisplayName
    Foreach ($member in $AllMembers)
    {
    $userObj = New-Object PSObject
    $userObj | Add-Member NoteProperty -Name "User SMTP Address" -Value $member.User
    $userObj | Add-Member NoteProperty -Name "Role" -Value $member.role
    $userObj | Add-Member NoteProperty -Name "Channel DisplayName" -Value $Channel.DisplayName
    $userObj | Add-Member NoteProperty -Name "Team DisplayName" -Value $Team.DisplayName

    $output += $UserObj

    }
    }
    # update counters and write progress
    $i++
    Write-Progress -activity "Scanning Teams . . .Channels . . . Members" -status "Scanned: $i of $($AllTeams.Count)" -percentComplete (($i / $AllTeams.Count) * 100)
    Write-Output $Output
    }
    ;Break}

    4 {
    $i = 0
    $CSVfile = Read-Host "Enter the Path of CSV file (Eg. C:\Teams.csv)"
    $Teamname = Read-Host "Enter the Team Display name or Range (Eg. Teamname , Team*,*Team)"
    $AllTeams = Get-Team | Where-object {$_.DisplayName -like $Teamname}
    Foreach ($Team in $AllTeams)
    {
    $AllChannels = Get-TeamChannel -GroupID $Team.GroupID
    Foreach ($Channel in $AllChannels)
    {
    $AllMembers = Get-TeamChannelUser -GroupId $Team.GroupID -DisplayName $channel.DisplayName
    Foreach ($member in $AllMembers)
    {
    $userObj = New-Object PSObject
    $userObj | Add-Member NoteProperty -Name "DisplayName" -Value $member.Name
    $userObj | Add-Member NoteProperty -Name "UserId" -Value $member.UserId
    $userObj | Add-Member NoteProperty -Name "User SMTP Address" -Value $member.User
    $userObj | Add-Member NoteProperty -Name "Role" -Value $member.role
    $userObj | Add-Member NoteProperty -Name "Channel DisplayName" -Value $Channel.DisplayName
    $userObj | Add-Member NoteProperty -Name "Channel Description" -Value $Channel.Description
    $userObj | Add-Member NoteProperty -Name "Channel MembershipType" -Value $Channel.MembershipType
    $userObj | Add-Member NoteProperty -Name "Team GroupID" -Value $Team.GroupId
    $userObj | Add-Member NoteProperty -Name "Team DisplayName" -Value $Team.DisplayName
    $userObj | Add-Member NoteProperty -Name "Team Description" -Value $Team.Description
    $userObj | Add-Member NoteProperty -Name "Team Visibility" -Value $Team.Visibility
    $userObj | Add-Member NoteProperty -Name "Team MailNickName" -Value $Team.MailNickName
    $userObj | Add-Member NoteProperty -Name "Team Classification" -Value $Team.Classification
    $userObj | Add-Member NoteProperty -Name "Team Archived" -Value $Team.Archived
    $userObj | Add-Member NoteProperty -Name "Team AllowGiphy" -Value $Team.AllowGiphy
    $userObj | Add-Member NoteProperty -Name "Team GiphyContentRating" -Value $Team.GiphyContentRating
    $userObj | Add-Member NoteProperty -Name "Team AllowStickersAndMemes" -Value $Team.AllowStickersAndMemes
    $userObj | Add-Member NoteProperty -Name "Team AllowGuestCreateUpdateChannels" -Value $Team.AllowGuestCreateUpdateChannels
    $userObj | Add-Member NoteProperty -Name "Team AllowGuestDeleteChannels" -Value $Team.AllowGuestDeleteChannels
    $userObj | Add-Member NoteProperty -Name "Team AllowCreateUpdateChannels" -Value $Team.AllowCreateUpdateChannels
    $userObj | Add-Member NoteProperty -Name "Team AllowCreatePrivateChannels" -Value $Team.AllowCreatePrivateChannels
    $userObj | Add-Member NoteProperty -Name "Team AllowDeleteChannels" -Value $Team.AllowDeleteChannels
    $userObj | Add-Member NoteProperty -Name "Team AllowAddRemoveApps" -Value $Team.AllowAddRemoveApps
    $userObj | Add-Member NoteProperty -Name "Team AllowCreateUpdateRemoveTabs" -Value $Team.AllowCreateUpdateRemoveTabs
    $userObj | Add-Member NoteProperty -Name "Team AllowCreateUpdateRemoveConnectors" -Value $Team.AllowCreateUpdateRemoveConnectors
    $userObj | Add-Member NoteProperty -Name "Team AllowUserEditMessages" -Value $Team.AllowUserEditMessages
    $userObj | Add-Member NoteProperty -Name "Team AllowUserDeleteMessages " -Value $Team.AllowUserDeleteMessages
    $userObj | Add-Member NoteProperty -Name "Team AllowOwnerDeleteMessages" -Value $Team.AllowOwnerDeleteMessages
    $userObj | Add-Member NoteProperty -Name "Team AllowTeamMentions" -Value $Team.AllowTeamMentions
    $userObj | Add-Member NoteProperty -Name "Team AllowChannelMentions" -Value $Team.AllowChannelMentions
    $userObj | Add-Member NoteProperty -Name "Team ShowInTeamsSearchAndSuggestions" -Value $Team.ShowInTeamsSearchAndSuggestions

    $output += $UserObj

    }
    }
    # update counters and write progress
    $i++
    Write-Progress -activity "Scanning Teams . . .Channels . . . Members" -status "Scanned: $i of $($AllTeams.Count)" -percentComplete (($i / $AllTeams.Count) * 100)
    $output | Export-csv -Path $CSVfile -NoTypeInformation -Encoding UTF8

    }
    ;Break}

    Default {Write-Host "No matches found , Enter Options 1 or 2" -ForeGround "red"}

    }

Resources