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!