Políticas do Microsoft Teams com PowerShell

O Microsoft Teams tem tido uma grande adoção como ferramenta unificada de colaboração, comunicação e engajamento entre equipes.

O Teams também tem sido adotado em larga escala como ferramenta de instituições de ensino para aulas colaborativas.

Praticamente todas as funcionalidades que o Teams proporciona podem ser controladas através de políticas. As políticas podem ser alteradas para fazer com que recursos/funcionalidades estejam ou não acessíveis pelos usuários.

Essas políticas podem ser acessadas, editadas e atribuídas através da console de administração do Teams ou via PowerShell. Por padrão existem políticas globais com parâmetros determinados. Muitas empresas acabam não mudando estes parâmetros pois eles tendem a funcionar de uma maneira satisfatória para elas.

O intuito deste post não é discutir sobre as políticas em si, mas sim no gerenciamento destas políticas via PowerShell.

Como principal base de exemplos vamos usar a política de reunião (Meeting Policy) como exemplo. Abaixo um print de parte dessa política.

Nessa política padrão, chamada de global, qualquer pessoa da organização é admitida automaticamente na reunião. Pessoas de fora da organização ficam no lobby, aguardando para serem admitidas.

Abaixo uma imagem com todas as políticas que podem ser atribuídas aos usuários:

Os usuários precisam de uma política aplicada. Quando uma política é alterada, essa alteração é automaticamente aplicada para todos os usuários que têm aquela política.

Se uma política nova for criada ela deverá ser atribuída aos usuários.

Quando se tem um ambiente pequeno, todas as alterações podem ser realizadas pelo próprio portal assim como a atribuição. Quando o ambiente é maior, a atribuição das políticas pode ser realizada via PowerShell para facilitar a vida de quem está atribuindo essas políticas.

Antes de ir para o PowerShell um ponto é importante. Como sabemos o PowerShell é modular, muitas vezes podemos conseguir a mesma informação com diferentes módulos.

Neste caso criar e atribuir políticas para os usuários é realizado com o módulo do Skype for Business Online.

Outro ponto importante, as funcionalidades dos módulos podem sofrer alterações. Por exemplo, quando se cria um Time é possível colocar uma foto para esse time. Essa funcionalidade está presente até o módulo 0.9x (Módulo do MicrosoftTeams). Se for usar o módulo 1.05, por exemplo, não existe essa possibilidade.

Para baixar o módulo do Teams: https://www.powershellgallery.com/packages/MicrosoftTeams

Para baixar o módulo do Skype for Business Online: https://www.microsoft.com/download/details.aspx?id=39366

O primeiro ponto é vermos todas as políticas da imagem acima no PowerShell.

Política no PortalPolítica no PowerShell
Meeting PolicyTeamsMeetingPolicy
Messaging policyTeamsMessagingPolicy
Live events policyTeamsMeetingBroadcastPolicy
App permission policyTeamsAppPermissionPolicy
App setup policyTeamsAppSetupPolicy
Call park policyTeamsCallParkPolicy
Calling policyTeamsCallingPolicy
Caller ID policyCallingLineIdentity
Teams policyTeamsChannelsPolicy
Emergency calling policyTeamsEmergencyCallingPolicy
Emergency call routing policyTeamsEmergencyCallRoutingPolicy
Dial planTenantDialPlan
Voice routing policyOnlineVoiceRoutingPolicy

Obs: ao usar o comando das políticas, sempre tem o CS na frente

O primeiro passo pode ser verificar quais políticas existem para aquela necessidade. Como na maioria das vezes, vamos verificar o Meeting Policy:

O comando que vamos usar é (Módulo do Skype):

Get-CSTeamsMeetingPolicy | fl identity

Podemos ver que além da Global existem diversas outras políticas. Fora a política Global222 e MeetingPolicies, todas as outras são padrões do Teams. Essas duas políticas diferentes das que são padrões foram criadas para os usuários.

Quando se tem muitas políticas para um tipo específico de política, pode ser interessante saber quais tem uma configuração específica. Por exemplo, se quisermos saber quais políticas (dentro de meeting policy) que permitem que Todos dentro da empresa possam ser admitidos automaticamente na reunião usamos:

Get-CSTeamsMeetingPolicy | Where-Object {$_.AutoAdmittedUsers -eq ‘EveryoneInCompany’} | fl identity

Podemos notar que no resultado não consta a política Global222. Nessa política essa configuração está diferente.

Se quisermos ver qual a configuração de todas as políticas (dentro de meeting policy) para uma determinada configuração podemos usar o seguinte comando:

Get-CSTeamsMeetingPolicy | ft identity, AutoAdmittedUsers

Com o comando acima podemos ver que a política Global222 tem uma configuração diferente das outras.

Obs: A formatação do resultado pode ficar a cargo do que se achar melhor. Alguns preferem usar format-list, outros format-table. Para estes exemplos não há nenhuma preferência.

Mesmo não sendo a intenção do post de discutir as políticas, precisamos fazer as configurações das políticas via PowerShell. Vamos ver esse como alterar uma configuração em uma política já existente. Vamos pegar essa configuração AutoAdmittedUsers e alterar para EveryoneInSameAndFederatedCompany na política MeetingPolicies (Comando via módulo Skype for Business Online)

Set-CsTeamsMeetingPolicy -Identity MeetingPolicies -AutoAdmittedUsers “EveryoneInSameAndFederatedCompany”

Após rodar o comando, podemos rodar o comando para verificar como está a configuração em todas as políticas:

A criação de políticas pode ser feita via PowerShell. Particularmente, eu prefiro fazer a criação via Portal. Eu tenho essa opinião pois, normalmente, não vão ser criadas diversas políticas, normalmente são poucas. Pelo portal temos a opção de duplicar políticas, resetar a política global e criar novas, que serão baseadas na política atual da Global.

Um ponto interessante é que, por exemplo, a criação da política de Configuração de aplicativos nem é recomendada criar via powershell. Veja: https://docs.microsoft.com/en-us/powershell/module/skype/new-csteamsappsetuppolicy?view=skype-ps

A criação de uma política é simples e não precisamos colocar todos os parâmetros. Os que não forem setados vão pegar as informações da política global.

Vejamos, abaixo temos minha política global que foi alterada:

Get-CsTeamsMeetingPolicy -Identity global

Nessa política foi alterado o AllowTranscription para True.

Para criar uma política nova usamos o os comandos de criação. Abaixo vamos criar uma política de Reunião com a opção de Habilitar a gravação em nuvem desabilitada. Somente vamos colocar esse parâmetro.

New-CsTeamsMeetingPolicy -Identity Global333 -AllowCloudRecording $false

Como Podemos ver a política foi criada igual a política global atual, exceto pelo parâmetro alterado.

Agora vamos ver como alterar o parâmetro AllowTranscription para falso na política global e criar uma nova política:

Set-CsTeamsMeetingPolicy -Identity global -AllowTranscription $false

Após rodar o comando, verificamos como está a política global:

Agora vamos criar uma nova política de reuniões chamada Global444 com as opções AllowMeetNow e AllowWhiteboard desativadas:

New-CsTeamsMeetingPolicy -Identity Global444 -AllowMeetNow $false -AllowWhiteboard $false

Como é possível observar os parâmetros desejados foram alterados e o parâmetro AllowTranscription está desabilitado, pois, neste momento, é assim que ele está na política Global.

Bom, agora para saber quais políticas um usuário tem aplicada? Vou mostrar duas formas.

A primeira é usando o módulo do Skype for Business Online:

Get-CsOnlineUser user@company.com | select teams*

Aqui é possível observar que o usuário tem a política Global222 aplicada. Todas as outras estão em branco, o que significa que a política padrão (Global) está aplicada.

A segunda opção que temos para verificar as políticas do usuário é usando o módulo do Teams:

Get-CsUserPolicyAssignment -Identity user@company.com

Aqui a mesma coisa, para as políticas usando a Global Policy não vamos ter resultados. Abaixo o resultado de outro usuário onde todas as políticas foram alteradas (nos dois modelos)

Já que estamos falando em usuário, abaixo vamos ver como alterar a política de um usuário. Vamos pegar o user@company.com que tem como Teams Meeting Policy a política Global222 e vamos mudar para a política Global333 (Usando o módulo do Skype for Business Online):

Grant-CsTeamsMeetingPolicy -Identity user@company.com -PolicyName Global333

Aplicado o comando para alterar essa política, podemos ver o resultado (Usando o Módulo do Teams):

Vendo as políticas pelo comando Get-CsOnlineUser:

Agora que a alteração foi feita, podemos precisar voltar essa política para a padrão. Se observarmos quando a política padrão é usada não aparece nada, apenas quando temos outras políticas. Nesse caso atribuímos a política da mesma forma, mas usando o $null.

O comando a ser usado é (lembrando que estamos usando a política de reuniões – Módulo do Skype):

Grant-CsTeamsMeetingPolicy -Identity user@company.com -PolicyName $null

Para verificarmos usamos um dos comandos para verificar as políticas do usuário:

Podemos ver que não existe mais a política de Reuniões.

Uma observação importante: Os comandos podem demorar um pouco para serem aplicados. Então as vezes podemos aplicar uma política e rodar o comando, por exemplo, Get-CsOnlineUser e o resultado ainda não ter propagado ou aplicado. Isso ocorre com a console do portal. As vezes é necessário fechar o portal e abrir novamente.

A atribuição das políticas para os usuários não é um processo rápido usando os comandos acima. É importante que cada empresa tenha uma estratégia para lidar com as políticas. Algumas não vão nem mexer nas políticas, outras poderão criar diversas políticas a atribuir aos usuários.

É importante lembrar que sempre que um novo usuário for criado ele terá as políticas padrões e devemos atribuir as políticas diferentes, caso seja essa a necessidade. Nesse sentido pode ser melhor deixar a política padrão de uma forma que atinja o maior número de usuários. Por exemplo, se um parâmetro deve ser para todos, o ideal é ter ele na política padrão. Se um outro parâmetro é diferente para poucos usuários o ideal seria criar uma nova política com aquele parâmetro diferente e atribuir a esses usuários.

A atribuição das políticas pode ser feita através de uma variável que contenha diversos usuários. Para isso usamos um foreach.

No exemplo abaixo temos um arquivo chamado usuarios.txt (onde está o UPN de cada usuário) na pasta c:\scripts e vamos aplicar a política Global333 para todos esses usuários.

$users = Get-Content -Path C:\scripts.txt

foreach ($user in $users) {Grant-CsTeamsMeetingPolicy -Identity $user -PolicyName Global333}

Por último pode acontecer de termos muitos usuários para aplicarmos as políticas. Para isso podemos fazer um comando em massa. Essa forma é mais eficaz do que o comando acima. Esse comando usa o módulo do Teams.

Nesse caso vamos imaginar que vamos usar o mesmo arquivo usado acima.

New-CsBatchPolicyAssignmentOperation -PolicyType TeamsMeetingPolicy -PolicyName “Global333” -Identity $users -OperationName “Batch0005”

Caso o comando não funcione corretamente sugiro remover o OperationName que não é requerido.

Quando o comando for executado ele vai gerar um ID. Podemos usar outro comando para verificar como está a execução deste ID:

Esse comando pode ser usado para apenas um usuário. É o meu caso, vou usar:

New-CsBatchPolicyAssignmentOperation -PolicyType TeamsMeetingPolicy -PolicyName “Global222” -Identity user@company.com -OperationName “Batch0005”

Podemos observar que após o comando rodar temos o ID da Operação.

Para ver o resultado (ou andamento) usamos o seguinte comando (use o seu OperationId):

Get-CsBatchPolicyAssignmentOperation -OperationId a9803475-34d7-4304-b556-c077866957d9 | Select -ExpandProperty UserState

Espero que isso possa ajudar!

Até a próxima!!