Last active
August 27, 2020 13:44
-
-
Save jhochwald/9807078ca12a2a1978b361249610bfd0 to your computer and use it in GitHub Desktop.
Apply Network Quality of Service (QoS) settings for Microsoft Teams Room Devices.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#requires -RunAsAdministrator | |
#requires -Version 3.0 -Modules NetQos | |
<# | |
.SYNOPSIS | |
Apply QoS Settings for Microsoft Teams Room Devices | |
.DESCRIPTION | |
Apply Network Quality of Service (QoS) settings for Microsoft Teams Room Devices. | |
I use this script to deploy the QoS settings to MTR devices via Intune. | |
.PARAMETER AppPathNameMatchCondition | |
Specifies the name by which an application is run, such as application.exe or %ProgramFiles%\application.exe application. | |
.EXAMPLE | |
PS C:\> .\Set-QoSForMicrosoftTeamsRoomDevices.ps1 | |
.EXAMPLE | |
PS C:\> .\Set-QoSForMicrosoftTeamsRoomDevices.ps1 -AppPathNameMatchCondition 'Teams.exe' | |
.NOTES | |
Idea based on a Twitter chat with @StaleHansen | |
Please ensure to check the Ports! | |
They must match your Teams Admin Center (TAC) settings. | |
.LINK | |
Get-NetQosPolicy | |
.LINK | |
New-NetQosPolicy | |
.LINK | |
https://docs.microsoft.com/en-us/microsoftteams/qos-in-teams-clients | |
.LINK | |
https://twitter.com/StaleHansen/status/1294341225647083522 | |
#> | |
[CmdletBinding(ConfirmImpact = 'Low', | |
SupportsShouldProcess)] | |
param | |
( | |
[Parameter(ValueFromPipeline, | |
ValueFromPipelineByPropertyName)] | |
[Alias('AppName')] | |
[string] | |
$AppPathNameMatchCondition = $null | |
) | |
begin | |
{ | |
$AppSharingPolicy = 'Teams AppSharing' | |
$VideoPolicy = 'Teams Video' | |
$AudioPoliy = 'Teams Audio' | |
} | |
process | |
{ | |
if ($pscmdlet.ShouldProcess('QoS-Settings', 'Apply')) | |
{ | |
#region Audio | |
if (-not (Get-NetQosPolicy -Name $AudioPoliy -ErrorAction SilentlyContinue -WarningAction SilentlyContinue)) | |
{ | |
try | |
{ | |
# Splat the parameters | |
$paramNewNetQosPolicy = @{ | |
NetworkProfile = 'All' | |
IPSrcPortStartMatchCondition = 50000 | |
IPSrcPortEndMatchCondition = 50019 | |
DSCPAction = 46 | |
IPProtocolMatchCondition = 'Both' | |
Name = $AudioPoliy | |
Confirm = $false | |
WarningAction = 'Continue' | |
ErrorAction = 'Stop' | |
} | |
# Do we have an application name? | |
if ($AppPathNameMatchCondition) | |
{ | |
$paramNewNetQosPolicy.Add('AppPathNameMatchCondition', $AppPathNameMatchCondition) | |
} | |
$null = (New-NetQosPolicy @paramNewNetQosPolicy) | |
} | |
catch | |
{ | |
Write-Warning -Message ('Unable to apply {0} QoS Policy' -f $AudioPoliy) | |
} | |
} | |
#endregion Audio | |
#region Video | |
if (-not (Get-NetQosPolicy -Name $VideoPolicy -ErrorAction SilentlyContinue -WarningAction SilentlyContinue)) | |
{ | |
try | |
{ | |
# Splat the parameters | |
$paramNewNetQosPolicy = @{ | |
NetworkProfile = 'All' | |
IPSrcPortStartMatchCondition = 50020 | |
IPSrcPortEndMatchCondition = 50039 | |
DSCPAction = 34 | |
IPProtocolMatchCondition = 'Both' | |
Name = $VideoPolicy | |
Confirm = $false | |
WarningAction = 'Continue' | |
ErrorAction = 'Stop' | |
} | |
# Do we have an application name? | |
if ($AppPathNameMatchCondition) | |
{ | |
$paramNewNetQosPolicy.Add('AppPathNameMatchCondition', $AppPathNameMatchCondition) | |
} | |
$null = (New-NetQosPolicy @paramNewNetQosPolicy) | |
} | |
catch | |
{ | |
Write-Warning -Message ('Unable to apply {0} QoS Policy' -f $VideoPolicy) | |
} | |
} | |
#endregion Video | |
#region AppSharing | |
if (-not (Get-NetQosPolicy -Name $AppSharingPolicy -ErrorAction SilentlyContinue -WarningAction SilentlyContinue)) | |
{ | |
try | |
{ | |
# Splat the parameters | |
$paramNewNetQosPolicy = @{ | |
NetworkProfile = 'All' | |
IPSrcPortStartMatchCondition = 50040 | |
IPSrcPortEndMatchCondition = 50059 | |
DSCPAction = 28 | |
IPProtocolMatchCondition = 'Both' | |
Name = $AppSharingPolicy | |
Confirm = $false | |
WarningAction = 'Continue' | |
ErrorAction = 'Stop' | |
} | |
# Do we have an application name? | |
if ($AppPathNameMatchCondition) | |
{ | |
$paramNewNetQosPolicy.Add('AppPathNameMatchCondition', $AppPathNameMatchCondition) | |
} | |
$null = (New-NetQosPolicy @paramNewNetQosPolicy) | |
} | |
catch | |
{ | |
Write-Warning -Message ('Unable to apply {0} QoS Policy' -f $AppSharingPolicy) | |
} | |
} | |
#end AppSharing | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment