Microsoft Teams Management
Overview
Microsoft Teams is the collaboration hub for most M365 customers. MSP support tasks include troubleshooting access issues, managing team membership, reviewing channel structure, and investigating meeting problems. All Teams data is accessible through Microsoft Graph.
Core Teams Objects
| Object | Description | API Resource |
|---|---|---|
| Team | Top-level workspace | /teams/{id} |
| Channel | Conversation thread within a team | /teams/{id}/channels/{id} |
| Member | User in a team (owner or member) | /teams/{id}/members |
| Meeting | Online meeting or channel event | /me/onlineMeetings |
| Tab | App integration in a channel | /teams/{id}/channels/{id}/tabs |
Graph API Patterns
List All Teams a User Belongs To
GET /v1.0/users/{userId}/joinedTeams?$select=id,displayName,description,visibility
Response:
{
"value": [
{
"id": "team-guid",
"displayName": "Engineering",
"description": "Engineering team workspace",
"visibility": "private"
}
]
}
List All Teams in the Tenant (Admin View)
GET /v1.0/groups?$filter=resourceProvisioningOptions/Any(x:x eq 'Team')&$select=id,displayName,description,createdDateTime,visibility
Get Team Details
GET /v1.0/teams/{teamId}?$select=id,displayName,description,isArchived,memberSettings,guestSettings,messagingSettings
List Channels in a Team
GET /v1.0/teams/{teamId}/channels?$select=id,displayName,description,membershipType,createdDateTime
Channel types:
standard— Open to all team membersprivate— Invite-only subset of team membersshared— Shared with external users or other teams
Get Team Members
GET /v1.0/teams/{teamId}/members?$select=id,displayName,email,roles
Roles: owner or member (empty array = member)
Add a Member to a Team
POST /v1.0/teams/{teamId}/members
Content-Type: application/json
{
"@odata.type": "#microsoft.graph.aadUserConversationMember",
"roles": [],
"user@odata.bind": "https://graph.microsoft.com/v1.0/users/{userId}"
}
To add as owner: set "roles": ["owner"]
Remove a Member from a Team
DELETE /v1.0/teams/{teamId}/members/{memberId}
Create a New Team
POST /v1.0/teams
Content-Type: application/json
{
"template@odata.bind": "https://graph.microsoft.com/v1.0/teamsTemplates('standard')",
"displayName": "IT Support",
"description": "Internal IT support team",
"visibility": "private",
"members": [
{
"@odata.type": "#microsoft.graph.aadUserConversationMember",
"roles": ["owner"],
"user@odata.bind": "https://graph.microsoft.com/v1.0/users/{ownerUserId}"
}
]
}
Archive a Team (Inactive Projects)
POST /v1.0/teams/{teamId}/archive
Content-Type: application/json
{
"shouldSetSpoSiteReadOnlyForMembers": true
}
Get Channel Messages (Last 20)
GET /v1.0/teams/{teamId}/channels/{channelId}/messages?$top=20&$orderby=createdDateTime desc
Teams Meetings
Get a User's Upcoming Meetings
GET /v1.0/users/{userId}/calendar/events?$filter=start/dateTime ge '2024-01-15T00:00:00' and isOnlineMeeting eq true&$select=subject,start,end,organizer,onlineMeeting&$orderby=start/dateTime
Get Online Meeting Details (Join URL)
GET /v1.0/users/{userId}/onlineMeetings/{meetingId}?$select=subject,startDateTime,endDateTime,joinUrl,participants
Create an Online Meeting
POST /v1.0/users/{userId}/onlineMeetings
Content-Type: application/json
{
"startDateTime": "2024-01-20T14:00:00Z",
"endDateTime": "2024-01-20T15:00:00Z",
"subject": "IT Onboarding Session"
}
Common MSP Workflows
New Employee Teams Onboarding
- Get list of teams the employee's manager belongs to
- Add new user to relevant teams as member
- Add to department-specific private channels
- Add as member (not owner) unless explicitly needed
Employee Offboarding from Teams
- List all teams user belongs to (
/joinedTeams) - For each team: check if user is the sole owner
- If sole owner: assign another owner before removal
- Remove user from all teams
- Archive any teams that were personal/project-specific
Find Teams Without Owners
GET /v1.0/groups?$filter=resourceProvisioningOptions/Any(x:x eq 'Team')&$select=id,displayName
Then for each team:
GET /v1.0/teams/{teamId}/members?$filter=roles/any(r:r eq 'owner')
Empty result = orphaned team, security risk.
Teams Guest Access Audit
List teams with external members:
GET /v1.0/teams/{teamId}/members?$filter=startsWith(email,'#EXT#')
External accounts have #EXT# in their UPN pattern.
Troubleshooting Teams Access
| Symptom | Check | Resolution |
|---|---|---|
| Can't join a team | Check visibility (private requires invite) | Add via API or admin invite |
| Missing from channel | Private channel membership | Add to private channel specifically |
| Can't see messages | Guest/external user restrictions | Review guest settings in team |
| Meeting join fails | License (Teams not in SKU) | Assign Teams service plan |
| Missing in directory | Not synced from AD | Check Azure AD Connect sync |
Permissions Required
| Task | Microsoft Graph Permission |
|---|---|
| List joined teams | Team.ReadBasic.All |
| List all tenant teams | Directory.Read.All |
| Read team members | TeamMember.Read.All |
| Add/remove members | TeamMember.ReadWrite.All |
| Create teams | Team.Create |
| Archive teams | TeamSettings.ReadWrite.All |
| Read messages | ChannelMessage.Read.All |
Related Skills
- M365 Users - User accounts, license verification
- M365 Calendar - Meeting scheduling and calendar integration
- M365 API Patterns - Auth, pagination, delta queries