Powershell da semana #3 - Adicionar BookInPolicy a salas de reunião

O powershell da semana vai ajudar você administrador que precisa concluir o seguinte requisito: suas salas de reunião precisam ter aceite/recusa automáticos porém apenas determinados usuários

Caso qualquer outro usuário tente agendar reuiões naquela sala, ela automaticamente irá recusar a solicitação.

Um exemplo prático disso seria uma sala de treinamento que só pode receber solicitações de agendamento do time de RH. Qualquer pessoa que não esteja dentro da lista de RH receberá uma recusa automática da sala, enquanto que quem for membro terá o comportamento de agendamento automático e tratativa de conflitos de forma automatizada também.

Sem mais delongas, vamos ao Script.

Importante
Todos os códigos devem ser executados após conectar-se remotamente ao Exchange. Para entender melhor como conectar no Exchange Online, consulte a documentação a seguir: https://docs.microsoft.com/pt-br/powershell/exchange/exchange-online/connect-to-exchange-online-powershell/connect-to-exchange-online-powershell?view=exchange-ps

Carregar a função no powershell

Apenas use Ctrl+C / Ctrl+V no Powershell e você irá permitir a execução do comando Add-CalendarBookInPolicy

Função para adicionar membros no BookInPolicy

function Add-CalendarBookInPolicy {
    Param(
        $RoomName
        , $User
    )
    $bookInPolicy = (Get-CalendarProcessing -Identity $RoomName).BookInPolicy
    $UserMbx = Get-mailbox $User
    $bookInPolicy += $UserMbx.LegacyExchangeDN
    Set-CalendarProcessing -Identity $RoomName -BookInPolicy $bookInPolicy -AllRequestInPolicy $false -AllBookInPolicy $false -AutomateProcessing AutoAccept
}

Função para remover membros do BookInPolicy

function Remove-CalendarBookInPolicy {
    Param(
        $RoomName
        , $User
    )
    $roomMbx=Get-mailbox $RoomName
    $bookInPolicy = (Get-CalendarProcessing -Identity $roomMbx).BookInPolicy
    $UserIdentity = (Get-Mailbox $User).LegacyExchangeDN
    $bookInPolicy.Remove($UserIdentity)
    Set-CalendarProcessing -Identity $RoomName -BookInPolicy $bookInPolicy -AllRequestInPolicy $false -AllBookInPolicy $false -AutomateProcessing AutoAccept
}

Executar o cmdlet individualmente

A sintaxe do comando é super simples:

# Para adicionar um membro no BookInPolicy
Add-CalendarBookInPolicy -RoomName RoomMailbox -User UserMailbox
# Para remover um membro do BookInPolicy
Remove-CalendarBookInPolicy -RoomName RoomMailbox -User UserMailbox

Ou seja, em -RoomName vamos colocar a informação da sala de reunião e em -User vamos colocar a informação do User.

Se tiver dúvidas em quais parâmetros são aceitos para consultar uma mailbox recomendo ler este artigo (busque por -Identity). Exemplo:

Add-CalendarBookInPolicy -RoomName "sala@dominio.com" -User usuario@dominio.com.br
Remove-CalendarBookInPolicy -RoomName "sala@dominio.com.br" -user "usuario@dominio.com.br"

Atenção
Caso você receba um alerta dizendo que o usuário já existe na lista, fique tranquilo, o comando vai rodar para cada um dos usuários até o fim.

Importante
também é bom lembrar que não é obrigatório usar aspas na informação de RoomName ou User, desde que não exista espaços na identidade.

Executar o cmdlet em massa

Para executar em massa, basta criar um arquivo CSV com o formato a seguir:

EmailAddress
email1@dominio.com.br
email2@dominio.com.br
email3@dominio.com.br

Salve com o formato CSV (arquivo separado por vírgula) e armazene em um local fácil para execução

Depois de salvar o arquivo execute o comando a seguir:

$path = "C:\caminho_para_o_csv\Users.csv"
$users = Import-Csv -Path $path
$roomName = "RoomMailbox"
foreach ($user in $users){
    Write-Host "Adicionando" $user.EmailAddress "na lista de BookInPolicy"
    Add-CalendarBookInPolicy -RoomName $roomName -User $User.EmailAddress 
}

$Path é o caminho até o arquivo CSV (recomendo salvar como users.csv porque aí é só fazer ctrl+c, ctrl+v mesmo).

$users importa o arquivo CSV no caminho especificado.

$roomName deve contar a informação da RoomMailbox em aspas.

Conclusão

Neste comando facilitamos uma regra que, no Exchange Online, seria bem complexa de se atingir: permitir que apenas um grupo específico de usuários possa enviar solicitações de agendamento para uma sala de reunião e garantir que pessoas que não estão dentro deste grupo recebam uma recusa automática. Obrigado e até a próxima!