Powershell da semana #4 - Gerenciar Resource Delegates

Pessoal, continuando a série de scripts da semana, este é o cenário que atendi recentemente em um projeto:

Você deve adicionar / remover Resource delegates, porém nada pode afetar o acesso ao calenário, ou seja, regras que já existem (processamento automático, BookInPolicy, etc não podem ser afetados).

Infelizmente A Microsoft ainda não permite este tipo de manobra via interface gráfica sem que haja alteração de mais atributos da sala de reunião.

Sendo assim, quero compartilhar a função que desenvolver para tratar esta necessidade.

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 função no powershell

Depois de conectar ao exchange online, copie e cole os seguintes comandos, conforme suas funcionalidades:

Adicionar Resource Delegate

function Add-CalendarResourceDelegate {
        <#
    .SYNOPSIS
        This command adds Resource Delegates to Room Mailboxes without changing it's default behavior.
    .DESCRIPTION
        This command adds Resource Delegates to Room Mailboxes without changing it's default behavior.

        PS C:\WINDOWS\system32> Add-CalendarResourceDelegate -RoomName <RoomMailbox> -Delegate <DelegateMailbox>
    .EXAMPLE
        PS C:\WINDOWS\system32> Add-CalendarResourceDelegate -RoomName room.alias -Delegate user.alias
        
        After running the command the user is added as resource delegate to the room mailbox.
    .EXAMPLE
        PS C:\WINDOWS\system32> add-CalendarResourceDelegate -RoomName room@domain.com -Delegate user.alias

        You can also mix how you want to inform the room mailbox and delegate information.
    .NOTES
        Version:    1.0
        Author:     Carlos Oliveira
        Contact:    carlos.oliveira@cloudsquad.com.br 
    #>
    [cmdletbinding()]
    Param(
        $RoomName
        , $Delegate
    )
    begin{}
    process {
        Write-Debug "Geting ResourceDelegate list"
        $resourceDelegates = (Get-CalendarProcessing -Identity $RoomName).ResourceDelegates
        Write-Debug "Curent ResourceDelegate list $resourceDelegates"
        Write-Debug "Find Identity"
        $DelegateIdentity = (Get-Mailbox $Delegate).Identity
        Write-Debug " :: $DelegateIdentity"
        Write-Debug "Simulate adding operation"
        $resourceDelegates.Add($DelegateIdentity)
        Write-Debug "Expected ResourceDelegate list $resourceDelegates"
        Write-Debug "Apply configs"
        Set-CalendarProcessing -Identity $RoomName -ResourceDelegates $resourceDelegates
        Write-Debug "Applied ResourceDelegate list $resourceDelegates"
    }
    end {}
}

Remover Resource Delegate

function Remove-CalendarResourceDelegate {
    <#
    .SYNOPSIS
        This command removes Resource Delegates to Room Mailboxes without changing it's default behavior.
    .DESCRIPTION
        This command removes Resource Delegates to Room Mailboxes without changing it's default behavior.

        PS C:\WINDOWS\system32> Remove-CalendarResourceDelegate -RoomName <RoomMailbox> -Delegate <DelegateMailbox>
    .EXAMPLE
        PS C:\WINDOWS\system32> Remove-CalendarResourceDelegate -RoomName room.alias -Delegate user.alias
        
        After running the command the user is removed as resource delegate to the room mailbox.
    .EXAMPLE
        PS C:\WINDOWS\system32> Remove-CalendarResourceDelegate -RoomName room@domain.com -Delegate user.alias

        You can also mix how you want to inform the room mailbox and delegate information.
    .NOTES
        Version:    1.0
        Author:     Carlos Oliveira
        Contact:    carlos.oliveira@cloudsquad.com.br
    #>
    [cmdletbinding()]
    Param(
        $RoomName
        , $Delegate
    )
    begin{}
    process {
        Write-Debug "Geting ResourceDelegate list"
        $resourceDelegates = (Get-CalendarProcessing -Identity $RoomName).ResourceDelegates
        Write-Debug "Curent ResourceDelegate list $resourceDelegates"
        Write-Debug "Finding Identity"
        $DelegateIdentity = (Get-Mailbox $Delegate).Identity
        Write-Debug " :: $DelegateIdentity"
        Write-Debug "Simulating remove operation"
        $resourceDelegates.Add($DelegateIdentity) | Out-Null
        Write-Debug "Expected ResourceDelegate list $resourceDelegates"
        Write-Debug "Applying settings"
        Set-CalendarProcessing -Identity $RoomName -ResourceDelegates $resourceDelegates
        Write-Debug "Applied ResourceDelegate list $resourceDelegates"
        Write-Warning -Message "'$DelegateIdentity' removed successfully" 
    }
    end {}
}

Para estas funções em caso de dúvidas vocês podem usar o comando

Get-Help Add-CalendarResourceDelegate -Full
Get-Help Remove-CalendarResourceDelegate -Full

Lá você terá informações sobre a sintaxe, casos de uso, etc.

Por fim, caso tenha interesse em rodar o comando em massa, você deve fazer o seguite

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:

Adicionar Resource Delegate em massa

$path = "C:\caminho_para_o_csv\Users.csv"
$users = Import-Csv -Path $path
$roomName = "RoomMailbox"
foreach ($user in $users){
    Add-CalendarResourceDelegate -RoomName $roomName -User $User.EmailAddress 
}

Remove Resource Delegate em massa

$path = "C:\caminho_para_o_csv\Users.csv"
$users = Import-Csv -Path $path
$roomName = "RoomMailbox"
foreach ($user in $users){
    Remove-CalendarResourceDelegate -RoomName $roomName -User $User.EmailAddress 
}

Em ambas situações:

$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

Atingimos mais um objetivo manipulando os Resource Delegates de uma sala de reunião e prevenindo que outras features de agendamento fossem afetadas, como acontece via interface gráfica.

Vejo vocês na próxima dica. Até a próxima!