Asignación de políticas en Microsoft Teams

Hace poco he tenido que preparar un tenant para el correcto despliegue de Teams en una compañía con más de 800 usuarios. Su idea era activar o desactivar ciertas funcionalidades de Microsoft Teams en función del perfil del usuario. Como tenían tres perfiles diferentes, lo que hicimos es crear tres políticas diferentes en cada uno de los apartados del centro de administración de Teams y establecer en cada política las funcionalidades a las que podría acceder el usuario.

Para facilitar la administración de estas políticas, se crearon tres grupos en el Directorio Activo (DA) de la compañía que contenían los usuarios de cada uno de los tres perfiles.

Actualmente dentro de Teams hay una serie de políticas que se pueden asignar directamente a un grupo de Microsoft 365. Cuando accedamos a ellas, se mostrará la opción de 'Group policy assignment' (o 'Asignación de directivas de grupo' si lo visualizas en español):

**Imagen 1.- Acceso a la asignación de política de grupo.**

Al acceder a esa pestaña, lo único que hay que hacer es añadir el grupo y asignarle la política. Se establece también un orden (rank) que indica qué política actuará primero en caso de que el usuario perteneciese a varios grupos.

**Imagen 1.- Grupos asignados.**

Hay que tener en cuenta que las políticas se aplican a los usuarios siguiendo una jerarquía. Prevalecen las que se apliquen a un usuario de forma directa (Direct) y posteriormente las que se asignen a través de grupos (en el orden del ranking). Si el usuario no tiene ninguna política asignada de estos dos tipos, se le aplicará la política Global de la compañía (Org-wide default). Se puede ver en el siguiente esquema:

**Imagen 3.- Jerarquía de Políticas.**

El problema que me encontré es que, actualmente, hay una serie de políticas en Teams que no se pueden asignar a través de grupos, sino que hay que hacerlo de forma directa. Os pongo un listado de las políticas y si es posible asignarlas a través de grupos, bien sea a través del Centro de Administración de Teams, o con PowerShell:

POLÍTICACENTRO ADMIN TEAMSPOWERSHELL
Meeting policy (CsTeamsMeetingPolicy)SISI
Messaging policy (CsTeamsMessagingPolicy)SISI
Live events policy (CsTeamsMeetingBroadcastPolicy)SISI
App permission policy (CsTeamsAppPermissionPolicy)NONO
App setup policy (CsTeamsAppSetupPolicy)NOSI
Call park policy (CsTeamsCallParkPolicy)SISI
Calling policy (CsTeamsCallingPolicy)SISI
Caller ID policy (CsCallingLineIdentity)NONO
Teams policy (CsTeamsChannelsPolicy)SISI
Emergency calling policy (CsTeamsEmergencyCallingPolicy)NONO
Emergency call routing policy (CsTeamsEmergencyCallRoutingPolicy)NONO
Dial plan (CsTenantDialPlan)NONO
Voice routing policy (CsVoiceRoutingPolicy)NONO

Para poder hacer la asignación de forma masiva en el caso de las políticas que no se asignan mediante grupos (a través del Centro de Administración), programé un script de PowerShell que me facilitase esa labor. Se trata de sacar los usuarios de uno de esos grupos del M365 y recorrer los usuarios para ir asignándoles las políticas de forma directa.

Os pongo alguna de las líneas para que podáis utilizarlas si os veis en la misma problemática que yo:

  • En primer lugar, cargamos los módulos necesarios:
1#Instalación del módulo de Teams y Skype
2
3Install-Module -Name MicrosoftTeams
4
5Import-Module SkypeOnlineConnector
6
  • En un Array guardamos todas las políticas que se asignan a nivel de Usuario (en mi caso, sólo necesitaba asignar 4 porque en las otras se utilizan las Globales):
1$DirectPoliciesTypes = @('TeamsAppPermissionPolicy',
2'TeamsAppSetupPolicy', 'CallingLineIdentity',
3'TeamsEmergencyCallingPolicy' )
4
  • En otra variable guardo el nombre de la política a aplicar (en mi caso llamé igual a todas):
1$namePolicy = "NAMEPOLICY"
2
  • Ahora hacemos la conexión (en la variable adminUser ha de estar un usuario con permisos de administrador de Microsoft Teams):
1$creds= Get-Credential -UserName $adminUser -Message "Credenciales
2del usuario."
3
4$connAz = Connect-AzureAD -Credential $creds
5
6$connTeams = Connect-MicrosoftTeams -Credential $creds
7
8$sfbSession = New-CsOnlineSession -Credential $creds
9
10Import-PSSession $sfbSession
11
  • Obtenemos los usuarios (miembros) del grupo que queramos (variable grupoAD):
1$myGr=Get-AzureADGroup -Filter "DisplayName eq '$($grupoAD)'"
2
3$members= Get-AzureADGroupMember -ObjectId $myGr.ObjectId -All 1
4

NOTA: Se incluye -All 1 para que nos devuelva todos los miembros del grupo. Si no se incluye este parámetro, sólo nos devolverá los 100 primeros.

  • Ahora recorremos todos los miembros que tenemos en members y le asociamos la política de forma directa. Esto sólo lo haremos si no la tenía ya aplicada, por eso primero obtendremos qué política tiene y, si no es igual, se la asociamos:
1$n=0 #Se utilizará para ir contando los miembros del grupo
2
3foreach($m in $members)
4
5{
6
7$n++
8
9#Recorremos las políticas que queremos aplicar a cada usuario
10
11#Políticas de Usuario (Direct)
12
13Write-Host "POLÍTICAS QUE SE ASIGNAN DIRECTAMENTE AL USUARIO (DIRECT)"
14-ForegroundColor Cyan
15
16$nup=0
17
18foreach($up in $DirectPoliciesTypes)
19
20{
21
22$nup++
23
24Write-Host "$($nup): Política Direct '$($up)':" -ForegroundColor
25Gray
26
27#Vemos qué política tiene el usuario. Si el Get devuelve null, es que
28el usuario no está en Teams. Si el PolicyName es null, es que tiene
29asociada la política Global.
30
31$userPolicies2=Get-CsUserPolicyAssignment -Identity
32$m.UserPrincipalName -PolicyType $up
33
34if ($userPolicies -ne $null)
35
36{
37
38$polname="Global"
39
40if ($userPolicies2.PolicyName -ne $null)
41
42{
43
44$polname = $userPolicies2.PolicyName
45
46}
47
48Write-Host "$($nup): El usuario $($m.GivenName) tiene asignada la
49política '$($polname)'." -ForegroundColor Gray
50
51if ($userPolicies2.PolicyName -eq $namePolicy)
52
53{
54
55Write-Host
56"$($n)|MIEMBRO|$($m.GivenName)|$($m.UserPrincipalName)|DIRECT|El
57usuario ya tiene la política '$($polname)' en el tipo '$($up)'"
58-ForegroundColor DarkYellow
59
60}else
61
62{
63
64Write-Host
65"$($n)|MIEMBRO|$($m.GivenName)|$($m.UserPrincipalName)|DIRECT|Se
66asigna la política '$($namePolicy)' en el tipo '$($up)' al
67usuario." -ForegroundColor White
68
69try{
70
71switch($up)
72
73{
74
75'TeamsAppPermissionPolicy' {Grant-CsTeamsAppPermissionPolicy -Identity
76$m.UserPrincipalName -PolicyName $namePolicy}
77
78'TeamsAppSetupPolicy' {Grant-CsTeamsAppSetupPolicy -Identity
79$m.UserPrincipalName -PolicyName $namePolicy}
80
81'CallingLineIdentity' {Grant-CsCallingLineIdentity -Identity
82$m.UserPrincipalName -PolicyName $namePolicy}
83
84'TeamsEmergencyCallingPolicy' {Grant-CsTeamsEmergencyCallingPolicy
85-Identity $m.UserPrincipalName -PolicyName $nameEmergencyPolicy}
86
87}
88
89Write-Host
90"$($n)|MIEMBRO|$($m.GivenName)|$($m.UserPrincipalName)|DIRECT|Política
91asociada correctamente" -ForegroundColor Green
92
93}catch
94
95{
96
97Write-Host
98"$($n)|MIEMBRO|$($m.GivenName)|$($m.UserPrincipalName)|DIRECT|ERROR:'$($_.Exception.Message)':
99$($_.ScriptStackTrace)" -ForegroundColor "Red"
100
101}
102
103}
104
105}else{
106
107Write-Host
108"$($n)|MIEMBRO|$($m.GivenName)|$($m.UserPrincipalName)|DIRECT|NO
109SE HAN ENCONTRADO POLITICAS. EL USUARIO NO ESTÁ EN TEAMS"
110-ForegroundColor Magenta
111
112break
113
114}
115
116}
117
118}
119

Con este script conseguiréis asociar las políticas Direct a los usuarios de un Grupo de M365.

Yo tuve algún problema con la conexión del PowerShell ya que al cabo de un tiempo se perdían las credenciales. Lo que hice es meter una validación al principio del foreach de los usuarios para poder continuar a partir del número de usuario en el que se me desconectó (por ejemplo, en el usuario número 284):

1if ($n -lt 284)
2
3{
4
5continue
6
7}
8

NOTA: Si lo que queréis es quitar alguna política directa a un usuario para que le aplique la que le correspondiese por Grupo ,o la Global, debéis usar esta instrucción:

1Grant-CsTeams<nombre política> -Identity $m.UserPrincipalName
2-PolicyName $null
3

Por ejemplo:

1Grant-CsTeamsMeetingPolicy -Identity $m.UserPrincipalName -PolicyName
2$null
3

Pues nada más, espero que os haya resultado interesante y os sirva de ayuda si en algún momento tenéis una problemática similar a la que yo me encontré en este cliente.

Enrique Sánchez Moreno
Cloud Services Manager en ILUNION IT SERVICES