Microsoft Graph Deep Dive Series — Part 6 — Teams

This quick reference guide is designed for Microsoft Teams administrators who are new to Microsoft Graph PowerShell. Each section contains simple, practical commands that you can use immediately to manage Teams, channels, members, and settings.

Before start the article we need to add the following permissions to our Registred Entra Id Application (Check how to create the App in Part 4 of the series) :

Team.ReadBasic.All, TeamSettings.ReadWrite.All, Channel.ReadBasic.All, ChannelSettings.ReadWrite.All, Group.ReadWrite.All

Every time you add and grant new permissions, you need to disconnect using command (Disconnect-Graph) and connect again using the following connection script (Registred Entra Id Application must be already created, Check how to create the App in Part 4 of the series).

Here’s Permission added and granted.

We also need to connect with this script :

# -------------------------------------------------- Change this variables -----------------------------------------
# Connect using app credentials
$TenantId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$ClientId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$ClientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# -------------------------------------------------- Noting to change here -----------------------------------------
$Scope = "https://graph.microsoft.com/.default"
$AuthUrl =
"https://login.microsoftonline.com/$TenantId/oauth2/v2.0/token"
$Body = @{
    client_id = $ClientId
    scope = $Scope
    client_secret = $ClientSecret
    grant_type = "client_credentials"
}
$Connection = Invoke-RestMethod -Method POST -Uri $AuthUrl -Body $Body -ContentType "application/x-www-form-urlencoded"
$AccessToken = $Connection.access_token

# Convert token to SecureString
$SecureToken = ConvertTo-SecureString -String $AccessToken -AsPlainText -Force

# Use the token for authentication
Connect-MgGraph -AccessToken $SecureToken

List All Teams in Organization

Permissions : Team.ReadBasic.All , Group.Read.All

# Get all teams in your tenant
Get-MgGroup -Filter "resourceProvisioningOptions/Any(x:x eq 'Team')" | Select-Object DisplayName, Id, Description

Get Specific Team by Name

Permissions : Team.ReadBasic.All

$TeamName = "IT-Team"
# Search for a team by name
Get-MgGroup -Filter "displayName eq '$TeamName'" 

Get Team Details

Permissions : Team.ReadBasic.All

Let’s get IT-Team details :

# Team Name
$TeamName = "IT-Team"

# Get Team ID
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Get detailed Team information
Get-MgTeam -TeamId $TeamId | Select-Object DisplayName, Description, Visibility, CreatedDateTime, WebUrl 

Check Team Settings

Permissions : TeamSettings.Read.All

Let’s get IT-Team settings :

# Team Name
$TeamName = "IT-Team"

# Get Team ID
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# View team settings (messaging, fun settings, etc.)
Get-MgTeam -TeamId $TeamId | Select-Object DisplayName, FunSettings, GuestSettings, MemberSettings, MessagingSettings

Update Team Settings

Permissions : TeamSettings.ReadWrite.All

In this example we’ll updtate Team Name of IT-Team to “Updated_IT-Team“.

# Team Name
$TeamName = "IT-Team"

# Get Team ID
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Update team display name and description
Update-MgTeam -TeamId $TeamId -DisplayName "Updated_IT-Team" -Description "New description for Updated_IT-Team"

Result in Teams admin center :

Delete Team

Permissions : Group.ReadWrite.All

In this example, we’ll delete Marketing Team :

# Team Name
$TeamName = "Marketing-Team"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Delete a team (moves to deleted items)
Remove-MgGroup -GroupId $TeamId

As you can see here, Marketing-Team is deleted :

List All Channels in Team

Permissions : Channel.ReadBasic.All

Let’s get channels of “Updated_IT-Team” :

# Team Name
$TeamName = "Updated_IT-Team"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Get all channels
Get-MgTeamChannel -TeamId $TeamId | Select-Object DisplayName, Description, MembershipType

Get Specific Channel Details

Permissions : Channel.ReadBasic.All

Let’s get the “System-Tickets” channel details from “Updated_IT-Team” :

# Team Name
$TeamName = "Updated_IT-Team"
$ChannelName = "System-Tickets"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Get channel by name
$Channel = Get-MgTeamChannel -TeamId $TeamId | Where-Object {$_.DisplayName -eq $ChannelName}
$Channel | Select-Object Id, DisplayName, Description, WebUrl

Create Standard/Private Channel

Permissions : Channel.Create, ChannelSettings.ReadWrite.All

In the following code, you need to change $ChannelType variable to specify standard channel (value = standard ) private channel (value = private )

Let’s create new standard channel called “Project1 Updates” in “Updated_IT-Team

# Team Name + Info
$TeamName = "Updated_IT-Team"
$NewChannelName = "Project Alpha Updates"
$ChannelDescription = "Channel for project Alpha status updates"
$ChannelType = "standard"           # private for private channel      &     standard for standard channel

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Create a new standard channel
$ChannelParams = @{
    DisplayName = $NewChannelName
    Description = $ChannelDescription
    MembershipType = $ChannelType
}
New-MgTeamChannel -TeamId $TeamId -BodyParameter $ChannelParams

Result in Teams Admin Center :

Update Channel

Permissions : ChannelSettings.ReadWrite.All

Let’s update description of “Project Alpha Updates” Channel :

# Team Name + Info
$TeamName = "Updated_IT-Team"
$ChannelName = "Project Alpha Updates"
$NewDescription = "Updated description for Project Alpha Updates"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Get Channel Id
$ChannelId = (Get-MgTeamChannel -TeamId $TeamId | where DisplayName -EQ $ChannelName).Id


# Update channel description
Update-MgTeamChannel -TeamId $TeamId -ChannelId $ChannelId -Description $NewDescription

You can also update Display Name for example :

# Team Name + Info
$TeamName = "Updated_IT-Team"
$ChannelName = "Project Alpha Updates"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Get Channel Id
$ChannelId = (Get-MgTeamChannel -TeamId $TeamId | where DisplayName -EQ $ChannelName).Id

# Update channel DisplayName
Update-MgTeamChannel -TeamId $TeamId -ChannelId $ChannelId -DisplayName "Project Alpha Updates 1"

Delete Channel

Permissions : Channel.Delete.All

Let’s delete “Project Alpha Updates 2” Channel :

# Team Name + Info
$TeamName = "Updated_IT-Team"
$ChannelName = "Project Alpha Updates 2"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Get Channel Id
$ChannelId = (Get-MgTeamChannel -TeamId $TeamId | where DisplayName -EQ $ChannelName).Id

# Delete a channel (cannot delete General channel)
Remove-MgTeamChannel -TeamId $TeamId -ChannelId $ChannelId

Project Alpha Updates 2” Channel is deleted :

List All Team Members & Owners

Permissions : TeamMember.Read.All

Let’s get “Finance-Team” members :

# Team Name
$TeamName = "Finance-Team"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Get all members of a team
Get-MgTeamMember -TeamId $TeamId | Select-Object DisplayName, Roles, UserId

List Team Owners

Permissions : TeamMember.Read.All

# Team Name
$TeamName = "Finance-Team"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Get all owners of a team
Get-MgTeamMember -TeamId $TeamId | where Roles -Contains "owner" | Select-Object DisplayName, Roles, UserId

List Team Members (Non-Owners)

Permissions : TeamMember.Read.All

# Team Name
$TeamName = "Finance-Team"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Get all members of a team
Get-MgTeamMember -TeamId $TeamId | where Roles -notContains "owner" | Select-Object DisplayName, Roles, UserId

Add Member to Team

Permissions : TeamMember.ReadWrite.All

Let’s add user “aymen@globalitnow.com” to “Finance-Team” as Member

# Member username
$UserName = "aymen@globalitnow.com"

# Team Name
$TeamName = "Finance-Team"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Add user as member
$MemberParams = @{
    "@odata.type" = "#microsoft.graph.aadUserConversationMember"
    "user@odata.bind" = "https://graph.microsoft.com/v1.0/users('$UserName')"
    Roles = @("member")
}
New-MgTeamMember -TeamId $TeamId -BodyParameter $MemberParams

Add Owner to Team

Permissions : TeamMember.ReadWrite.All

Let’s add user “e.Girard@globalitnow.com” to “Finance-Team” as Owner :

# Member username
$UserName = "e.Girard@globalitnow.com"

# Team Name
$TeamName = "Finance-Team"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Add user as owner
$OwnerParams = @{
    "@odata.type" = "#microsoft.graph.aadUserConversationMember"
    "user@odata.bind" = "https://graph.microsoft.com/v1.0/users('$UserName')"
    Roles = @("owner")
}
New-MgTeamMember -TeamId $TeamId -BodyParameter $OwnerParams

Remove Member from Team

Permissions : TeamMember.ReadWrite.All

Let’s remove user “aymen@globalitnow.com” from “Finance-Team” Members :

# Member username
$UserName = "aymen@globalitnow.com"

# Team Name
$TeamName = "Finance-Team"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'").Id

# Get member Id
$UserDisplayName = (Get-MgUser -Filter "UserPrincipalName eq '$UserName'").DisplayName
$MemberId = (Get-MgTeamMember -TeamId $TeamId | Where-Object { $_.DisplayName -eq $UserDisplayName }).Id

# Remove a team member
Remove-MgTeamMember -TeamId $TeamId -ConversationMemberId $MemberId

Aymen is no member of “Finance-Team” :

List Messages in Channel

Permissions : ChannelMessage.Read.All

Let’s read the top 10 messages of General Channel of IT-Team :

# Team Name
$TeamName = "Updated_IT-Team"
$ChannelName = "General"

# Get Team Id
$TeamId = (Get-MgGroup -Filter "displayName eq '$TeamName'" ).Id

# Get channel by name
$ChannelId = (Get-MgTeamChannel -TeamId $TeamId | Where-Object {$_.DisplayName -eq $ChannelName}).Id

# Get recent messages from a channel
Get-MgTeamChannelMessage -TeamId $TeamId -ChannelId $ChannelId -Top 10 |
    Select-Object @{Name="Body";Expression={$_.Body.Content}}, CreatedDateTime,
                  @{Name="From";Expression={$_.From.User.DisplayName}}

Thanks

Aymen EL JAZIRI (Microsoft MVP)
Aymen EL JAZIRI (Microsoft MVP)

Hi, I’m Aymen El Jaziri , a passionate System Administrator and Microsoft MVP, with years of hands-on experience in managing and securing modern IT infrastructures.
This blog is where I share technical guides, automation scripts, product reviews, and real-world solutions that help IT professionals simplify their day-to-day work and stay ahead in a fast-evolving cloud ecosystem.
Whether you’re here to troubleshoot an issue, improve your automation game, or learn new best practices , welcome in my blog !
Let’s build a stronger, smarter IT community together.
Feel free to connect with me on LinkedIn for more content, discussions, or collaboration opportunities.

Thanks

Aymen

Articles: 154