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):
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.
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:
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ÍTICA | CENTRO ADMIN TEAMS | POWERSHELL | ------------------------------------------------------------------- | -------------------- | ------------ | Meeting policy (CsTeamsMeetingPolicy) | SI | SI | Messaging policy (CsTeamsMessagingPolicy) | SI | SI | Live events policy (CsTeamsMeetingBroadcastPolicy) | SI | SI | App permission policy (CsTeamsAppPermissionPolicy) | NO | NO | App setup policy (CsTeamsAppSetupPolicy) | NO | SI | Call park policy (CsTeamsCallParkPolicy) | SI | SI | Calling policy (CsTeamsCallingPolicy) | SI | SI | Caller ID policy (CsCallingLineIdentity) | NO | NO | Teams policy (CsTeamsChannelsPolicy) | SI | SI | Emergency calling policy (CsTeamsEmergencyCallingPolicy) | NO | NO | Emergency call routing policy (CsTeamsEmergencyCallRoutingPolicy) | NO | NO | Dial plan (CsTenantDialPlan) | NO | NO | Voice routing policy (CsVoiceRoutingPolicy) | NO | NO
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:
1#Instalación del módulo de Teams y Skype23Install-Module -Name MicrosoftTeams45Import-Module SkypeOnlineConnector6
1$DirectPoliciesTypes = @('TeamsAppPermissionPolicy',2'TeamsAppSetupPolicy', 'CallingLineIdentity',3'TeamsEmergencyCallingPolicy' )4
1$namePolicy = "NAMEPOLICY"2
1$creds= Get-Credential -UserName $adminUser -Message "Credenciales2del usuario."34$connAz = Connect-AzureAD -Credential $creds56$connTeams = Connect-MicrosoftTeams -Credential $creds78$sfbSession = New-CsOnlineSession -Credential $creds910Import-PSSession $sfbSession11
1$myGr=Get-AzureADGroup -Filter "DisplayName eq '$($grupoAD)'"23$members= Get-AzureADGroupMember -ObjectId $myGr.ObjectId -All 14
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.
1$n=0 #Se utilizará para ir contando los miembros del grupo23foreach($m in $members)45{67$n++89#Recorremos las políticas que queremos aplicar a cada usuario1011#Políticas de Usuario (Direct)1213Write-Host "POLÍTICAS QUE SE ASIGNAN DIRECTAMENTE AL USUARIO (DIRECT)"14-ForegroundColor Cyan1516$nup=01718foreach($up in $DirectPoliciesTypes)1920{2122$nup++2324Write-Host "$($nup): Política Direct '$($up)':" -ForegroundColor25Gray2627#Vemos qué política tiene el usuario. Si el Get devuelve null, es que28el usuario no está en Teams. Si el PolicyName es null, es que tiene29asociada la política Global.3031$userPolicies2=Get-CsUserPolicyAssignment -Identity32$m.UserPrincipalName -PolicyType $up3334if ($userPolicies -ne $null)3536{3738$polname="Global"3940if ($userPolicies2.PolicyName -ne $null)4142{4344$polname = $userPolicies2.PolicyName4546}4748Write-Host "$($nup): El usuario $($m.GivenName) tiene asignada la49política '$($polname)'." -ForegroundColor Gray5051if ($userPolicies2.PolicyName -eq $namePolicy)5253{5455Write-Host56"$($n)|MIEMBRO|$($m.GivenName)|$($m.UserPrincipalName)|DIRECT|El57usuario ya tiene la política '$($polname)' en el tipo '$($up)'"58-ForegroundColor DarkYellow5960}else6162{6364Write-Host65"$($n)|MIEMBRO|$($m.GivenName)|$($m.UserPrincipalName)|DIRECT|Se66asigna la política '$($namePolicy)' en el tipo '$($up)' al67usuario." -ForegroundColor White6869try{7071switch($up)7273{7475'TeamsAppPermissionPolicy' {Grant-CsTeamsAppPermissionPolicy -Identity76$m.UserPrincipalName -PolicyName $namePolicy}7778'TeamsAppSetupPolicy' {Grant-CsTeamsAppSetupPolicy -Identity79$m.UserPrincipalName -PolicyName $namePolicy}8081'CallingLineIdentity' {Grant-CsCallingLineIdentity -Identity82$m.UserPrincipalName -PolicyName $namePolicy}8384'TeamsEmergencyCallingPolicy' {Grant-CsTeamsEmergencyCallingPolicy85-Identity $m.UserPrincipalName -PolicyName $nameEmergencyPolicy}8687}8889Write-Host90"$($n)|MIEMBRO|$($m.GivenName)|$($m.UserPrincipalName)|DIRECT|Política91asociada correctamente" -ForegroundColor Green9293}catch9495{9697Write-Host98"$($n)|MIEMBRO|$($m.GivenName)|$($m.UserPrincipalName)|DIRECT|ERROR:'$($_.Exception.Message)':99$($_.ScriptStackTrace)" -ForegroundColor "Red"100101}102103}104105}else{106107Write-Host108"$($n)|MIEMBRO|$($m.GivenName)|$($m.UserPrincipalName)|DIRECT|NO109SE HAN ENCONTRADO POLITICAS. EL USUARIO NO ESTÁ EN TEAMS"110-ForegroundColor Magenta111112break113114}115116}117118}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)23{45continue67}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.UserPrincipalName2-PolicyName $null3
Por ejemplo:
1Grant-CsTeamsMeetingPolicy -Identity $m.UserPrincipalName -PolicyName2$null3
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