A collection of simple and effective PowerShell commands for managing Microsoft Teams using the official MicrosoftTeams PowerShell module.
These scripts are designed to be easy to use, adapt, and automate for day-to-day Teams administration tasks.
- Windows PowerShell 5.1+ or PowerShell Core 7+
- MicrosoftTeams module installed
Install-Module -Name MicrosoftTeams -ForceConnect-MicrosoftTeamsGet-Team | Select DisplayName, GroupId, Visibility# Replace with your Team's GroupId
$groupId = "<your-group-id>"
Get-TeamUser -GroupId $groupId | Select User, Role$teams = Get-Team
foreach ($team in $teams) {
Write-Host "Team: $($team.DisplayName)"
Get-TeamUser -GroupId $team.GroupId | Where-Object {$_.Role -eq "Owner"} | Select -ExpandProperty User
Write-Host ""
}# Replace with the target user's UPN
$user = "user@domain.com"
$teams = Get-Team
foreach ($team in $teams) {
$members = Get-TeamUser -GroupId $team.GroupId
if ($members.User -contains $user) {
Remove-TeamUser -GroupId $team.GroupId -User $user -Confirm:$false
Write-Host "Removed $user from $($team.DisplayName)"
}
}# Replace with Team GroupId and user UPN
Add-TeamUser -GroupId "<group-id>" -User "user@domain.com"Get-CsTeamsMessagingPolicyGet-CsTeamsMeetingPolicyGet-CsTeamsCallingPolicyGet-CsTeamsAppSetupPolicyGet-CsTeamsAppPermissionPolicyGet-CsTeamsMeetingBroadcastPolicyGet-CsTeamsEmergencyCallingPolicyGet-CsTeamsEmergencyCallRoutingPolicyGet-CsCallingLineIdentityGet-CsTeamsUpgradePolicy<#
.SYNOPSIS
Retrieves all Microsoft Teams policies and exports every property to CSV.
.DESCRIPTION
This script gathers every Teams policy type and exports the full object (all properties) into individual CSV files.
Useful for full audits or documentation of tenant configuration.
.PARAMETER ExportPath
Folder path where CSVs will be saved.
.EXAMPLE
.\List-AllTeamsPolicies.ps1 -ExportPath "C:\TeamsPolicies\"
#>
param (
[Parameter(Mandatory = $true)]
[string]$ExportPath
)
function Export-IfPath {
param (
[string]$Name,
[object]$Data
)
if ($ExportPath) {
$fullPath = Join-Path -Path $ExportPath -ChildPath "$Name.csv"
$Data | Export-Csv -Path $fullPath -NoTypeInformation
Write-Host "Exported $Name to $fullPath" -ForegroundColor Green
}
}
# Create folder if it doesn't exist
if (-not (Test-Path $ExportPath)) {
New-Item -Path $ExportPath -ItemType Directory | Out-Null
}
# --- Export all policy types ---
Export-IfPath -Name "MessagingPolicies" -Data (Get-CsTeamsMessagingPolicy)
Export-IfPath -Name "MeetingPolicies" -Data (Get-CsTeamsMeetingPolicy)
Export-IfPath -Name "CallingPolicies" -Data (Get-CsTeamsCallingPolicy)
Export-IfPath -Name "AppSetupPolicies" -Data (Get-CsTeamsAppSetupPolicy)
Export-IfPath -Name "AppPermissionPolicies" -Data (Get-CsTeamsAppPermissionPolicy)
Export-IfPath -Name "MeetingBroadcastPolicies" -Data (Get-CsTeamsMeetingBroadcastPolicy)
Export-IfPath -Name "EmergencyCallingPolicies" -Data (Get-CsTeamsEmergencyCallingPolicy)
Export-IfPath -Name "EmergencyRoutingPolicies" -Data (Get-CsTeamsEmergencyCallRoutingPolicy)
Export-IfPath -Name "CallingLineIdentityPolicies" -Data (Get-CsCallingLineIdentity)
Export-IfPath -Name "UpgradePolicies" -Data (Get-CsTeamsUpgradePolicy)<#
.SYNOPSIS
Retrieves all Teams-related policies assigned to a specific user.
.DESCRIPTION
This script queries the full set of Teams policies assigned to a given user account, using Get-CsOnlineUser.
Useful for auditing or troubleshooting permission and feature access in Microsoft Teams.
.PARAMETER UserPrincipalName
The UPN (email) of the user whose policy assignments you want to view.
.EXAMPLE
.\Get-TeamsUserPolicies.ps1 -UserPrincipalName "user@domain.com"
#>
param (
[Parameter(Mandatory = $true)]
[string]$UserPrincipalName
)
$user = Get-CsOnlineUser -Identity $UserPrincipalName
if (-not $user) {
Write-Error "User not found: $UserPrincipalName"
exit
}
[PSCustomObject]@{
DisplayName = $user.DisplayName
UserPrincipalName = $user.UserPrincipalName
TeamsMessagingPolicy = $user.TeamsMessagingPolicy
TeamsMeetingPolicy = $user.TeamsMeetingPolicy
TeamsCallingPolicy = $user.TeamsCallingPolicy
TeamsAppSetupPolicy = $user.TeamsAppSetupPolicy
TeamsAppPermissionPolicy = $user.TeamsAppPermissionPolicy
TeamsMeetingBroadcastPolicy = $user.TeamsMeetingBroadcastPolicy
TeamsEmergencyCallingPolicy = $user.TeamsEmergencyCallingPolicy
TeamsEmergencyCallRoutingPolicy = $user.TeamsEmergencyCallRoutingPolicy
CallingLineIdentityPolicy = $user.CallingLineIdentityPolicy
TeamsUpgradePolicy = $user.TeamsUpgradePolicy
}Get-CsPhoneNumberAssignment | Where-Object {$_.PstnAssignmentStatus -eq "Assigned"}Set-CsPhoneNumberAssignment -Identity "user@domain.com" -PhoneNumber "+441234567890" -PhoneNumberType DirectRoutingSet-CsPhoneNumberAssignment -Identity "user@domain.com" -PhoneNumber "+441234567890" -PhoneNumberType CallingPlanRemove-CsPhoneNumberAssignment -Identity "user@domain.com" -PhoneNumber "+441234567890" -PhoneNumberType DirectRoutingSet-CsPhoneNumberAssignment -Identity "user@domain.com" -PhoneNumber "+441234567890" -PhoneNumberType DirectRouting -EmergencyLocationId "your-location-id"Get-CsOnlineLisLocationGet-CsPhoneNumber -TelephoneNumberStatus UnassignedGet-CsOnlineVoiceRoutingPolicyGrant-CsOnlineVoiceRoutingPolicy -Identity "user@domain.com" -PolicyName "UK-DirectRouting"Get-CsTenantDialPlan
Get-CsVoiceNormalizationRuleGrant-CsTeamsCallingPolicy -Identity "user@domain.com" -PolicyName "InternationalCalling"<#
.SYNOPSIS
Exports Teams Phone System calling configuration for all users with a LineURI assigned.
.DESCRIPTION
Gathers and exports user-level Teams calling settings such as phone number, LineURI, calling policies, dial plans, and emergency location.
.OUTPUT
Exports to TeamsPhoneUsers.csv in the current directory.
.EXAMPLE
.\Export-TeamsCallingConfig.ps1
#>
# Optional: Connect if not already connected
# Connect-MicrosoftTeams
$users = Get-CsOnlineUser | Where-Object { $_.LineURI -like "tel:*" }
$results = foreach ($user in $users) {
[PSCustomObject]@{
DisplayName = $user.DisplayName
UserPrincipalName = $user.UserPrincipalName
LineURI = $user.LineURI
OnPremLineURI = $user.OnPremLineURI
UsageLocation = $user.UsageLocation
TeamsCallingPolicy = $user.TeamsCallingPolicy
OnlineVoiceRoutingPolicy = $user.OnlineVoiceRoutingPolicy
TenantDialPlan = $user.TenantDialPlan
EmergencyLocation = $user.E911Location
CallingLineIdentity = $user.CallingLineIdentity
TeamsUpgradePolicy = $user.TeamsUpgradePolicy
}
}
$results | Export-Csv -Path ".\TeamsPhoneUsers.csv" -NoTypeInformation -Encoding UTF8
Write-Host "Export complete: TeamsPhoneUsers.csv" -ForegroundColor Green