Gerenciar listas de distribuição

Gerenciar listas de distribuição

Fala pessoal tudo bem? Neste artigo quero te trazer alguns materiais e dicas que uso para gerenciar listas de distribuição usando PowerShell.

Muita gente, só de ouvir falar no termo “PowerShell”, já fica bastante receosa porque pensa que é algo muito difícil e o que eu quero mostrar para vocês é que não é bem assim.

O PowerShell veio para nos ajudar a ser muito mais produtivos por automatizar tarefas que exijam, principalmente, muita repetição. Neste artigo vamos explorar especificamente esta fantástica funcionalidade.

Este artigo é separado nas seguintes etapas:

Preparando seu ambiente

Se você for um parceiro crie um ambiente de demonstração na página a seguir: https://cdx.transform.microsoft.com/. Tão importante quanto a execução dos scripts, você precisa preparar seu ambiente para realizar as ações que estou para mostrar neste artigo.

Para que você não tenha problemas para implementação, tenha em mente os seguintes requisitos.:

Caso você enfrente qualquer problema na execução dos comandos tenha certeza de que você está cumprindo os requisitos que estou apresentando e que não há qualquer restrição de internet onde você está no momento.

Além disso, veja se não teve qualquer erro de digitação e quando estiver confortável com os conceitos, siga adiante. Por fim, se tiver qualquer outra dúvida use a área de comentários, estou ativamente observando o engajamento do blog e quero que você termine este artigo com o máximo de clareza possível sobre este assunto.

Sem mais delongas, vamos começar!

Criar listas de distribuição

Iniciando com o básico neste primeiro Script nós vamos apenas criar uma lista de distribuição:

Até agora, sem novidades. Como faríamos se fossemos criar um conjunto de listas de distribuição? Digamos, quero adicionar as seguintes listas:

NomeEmail
Financeiro[email protected]
RH[email protected]
Diretoria[email protected]
Gerência[email protected]
Comercial[email protected]
Infraestrutura[email protected]
Suporte[email protected]
Redes[email protected]
TI[email protected]

Neste caso o código vai tomar o seguinte formato e você vai perceber que ele vai se repetir inúmeras vezes.

Vamos às explicações:

$listas (no plural) é a variável que vai armazenar todos os usuários que estavam na lista. Se tiver com dúvidas sobre como montar seu arquivo CSV dê uma olhada neste link.

$lista (no singular) é a variável que vai armazenar apenas um único usuário dentro da lista para realizar a repetição.

Sobre o foreach, podemos simplificar o uso dele desta forma:

Paracada ($item na $coleção)
{
Realize-Ações -Item $item
}

Ou seja, para cada $item dentro de uma $coleção, uma ação deve ser realizada para o $item. Desta forma, o foreach vai ler linha a linha da minha $coleção e, para cada $item localizado, ele irá aplicar a(s) ação(ões) que estiver entre chaves {}.

Para fechar este ponto, temos uma coisa: você reparou que junto com $lista temos um .Nome um .Email? Os cabeçalhos da nossa lista são compreendidos pelo powershell como atributos e você precisa dar a referência de qual dessas informações você quer usar durante o script. Portanto, para o nome da lista de distribuição eu uso $lista.Nome e para o PrimarySmtpAddress eu uso o $lista.Email.

Agora vamos ver se essa criação funcionou? Vou aproveitar a mesma execução anterior de repetição mas vou mudar apenas o código dentro das chaves {} para o que você vê abaixo:

O resultado esperado é algo mais ou menos assim:

PS C:\> foreach ($lista in $listas)
>> {
>>     Get-DistributionGroup -Identity $lista.Nome
>> }                                                                                                                                                                                            
Name       DisplayName GroupType PrimarySmtpAddress
----       ----------- --------- ------------------
Financeiro Financeiro  Universal [email protected]
RH         RH          Universal [email protected]
Diretoria  Diretoria   Universal [email protected]
Gerência   Gerência    Universal [email protected]
Comercial  Comercial   Universal [email protected]
Infraes... Infraest... Universal [email protected]...
Suporte    Suporte     Universal [email protected]
Redes      Redes       Universal [email protected]
TI         TI          Universal [email protected]

Importente:
Se você teve dificuldade em qualquer uma das atividades volte e tente novamente, a partir de agora a coisa vai ficar mais séria.

Adicionando múltiplos usuários à uma única lista de distribuição

Agora que nossos grupos estão criados é hora de adicionar alguns membros, certo?

Para fazer esta ação eu montei uma lista com os seguintes usuários:

Email
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

Salvei esta lista no bloco de notas como “users.csv” porque vou usar daqui a pouco.

Vamos inicialmente adicionar os usuários à lista Contabilidade, que criamos inicialmente para você pegar o ritmo da repetição.

Vou usar o cmdlet Add-DistributionGroupMember para adicionar e vou usar o nosso conhecido foreach.

Vamos às explicações:

$group é uma variável que vai apenas armazenar o e-mail da lista de distribuição.

$users (no plural) é a variável que vai armazenar todos os usuários que estavam na lista. Se tiver com dúvidas sobre como montar seu arquivo CSV dê uma olhada neste link.

$user (no singular) é a variável que vai armazenar apenas um único usuário dentro da lista para realizar a repetição.

Para finalizar, você deve ter reparado que a variável $user está, mais uma vez, chamando o atributo $user.Email, certo? Pois é, veja que a primeira linha da minha lista é exatamente o mesmo Email e, portanto, o comando Import-Csv entende que Email é o cabeçalho da lista.

Depois de executar o comando, normalmente você não tem nenhum output se o usuário foi adicionado com sucesso. Se o mesmo aconteceu com você, já pode comemorar porque possivelmente o comando foi executado corretamente!

A título de curiosidade, vou conferir os usuários adicionados na lista Contabilidade, e isso é o que eu espero receber:

PS C:\WINDOWS\system32> Get-DistributionGroupMember -Identity Contabilidade

Name                     RecipientType
----                     -------------
MeganB                   UserMailbox
DebraB                   UserMailbox
LeeG                     UserMailbox
AllanD                   UserMailbox
GerhartM                 User
BiancaP                  User
GradyA                   UserMailbox
MiriamG                  UserMailbox
Brian Johnson (TAILSPIN) UserMailbox

Terminamos esta fase com todos os usuários devidamente adicionados à lista de distribuição. Novamente, se houve alguma dúvida, volte alguns passos antes de continuar.

Adicionar múltiplos usuários a múltiplas listas de distribuição

Agora, vamos lá… E quando você tem várias listas de distribuição e para cada uma delas você tem um conjunto de membros que precisam ser adicionados em cada um dos grupos, como fica?

Primeiro vamos pensar em como vamos montar uma tabela que possa cumprir os seguintes requisitos:

  • Precisa ter o nome da Lista em que os usuários serão adicionados;
  • Precisa ter uma lista de membros que vão ser adicionados para cada uma das listas.

Não tem uma resposta certa aqui, mas esta forma foi a que imaginei e que pode resolver ambos problemas de maneira rápida e fácil:  

Primeira forma é colocar 1 única linha para cada departamento e ter uma divisão de cada um dos membros em uma segunda coluna.

ListaMembros
Financeiro[email protected];[email protected];[email protected];[email protected];[email protected];
RH[email protected];[email protected];[email protected];[email protected];[email protected];
Diretoria[email protected];[email protected];[email protected];[email protected];[email protected]
Gerência[email protected];[email protected];[email protected];[email protected];
Comercial[email protected];[email protected];[email protected];[email protected]
Infraestrutura[email protected];[email protected];[email protected];[email protected];[email protected];
Suporte[email protected];[email protected];[email protected];[email protected];[email protected];
Redes[email protected];[email protected];[email protected];[email protected];[email protected];
TI[email protected];[email protected];[email protected];[email protected];[email protected];[email protected];[email protected];[email protected];[email protected];

Entretanto, como nós vamos conseguir preparar um powershell que possa atender a tantas coisas ao mesmo tempo?

Nosso powershell precisa olhar linha a linha, saber que para cada grupo cada um dos usuários, separados por “;”, deverá ser adicionado individualmente.

Parece desafiador, mas é perfeitamente possível de fazer.

Aqui temos alguns elementos novos que quero mostrar para vocês. Contudo, não vou entrar na parte das variáveis e do foreach, porque como já os mencionei acima, não quero ser repetitivo.

Vamos aos detalhes sobre estes novos elementos

Iniciamos com a forma em como estamos manipulando o script, porque tudo acontece enquanto a variável $objects está sendo consultada.

Repare também que, se você apenas executar a variável $objects, o PowerShell vai retornar uma tabela para você com as colunas Listas e Membros.

Sendo assim, vou aplicar uma repetição usando Foreach-Object. Lá, eu apenas criei as variáveis Listas e Membros para os respectivos atributos.

Em seguida, você pode ver uma função if ($membros){} e o objetivo dele é justamente identificar se existem membros para cada uma das listas apresentadas.
Vamos supor que tivéssemos uma lista a mais e não tivesse nenhum membro lá; neste caso, o if geraria um valor false para mim e não iria executar a operação em seguida, que é o nosso foreach.

Importante falar sobre a variável $Membros. Se vocês repararem eu coloco que o atributo $_.Membros deve ser separado por “;”. Desta forma, uma sub-lista é criada e, cada vez que aparecer “;” uma nova linha é adicionada. Neste caso, meus usuários armazenados em $Membros, e separados por “;”, se tornam uma sub-lista mais ou menos assim:

[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

E é esta sublista que será processada pelo comando Add-DistributionGroupMember. Individualmente o cmdlet vai identificar os usuários, se são válidos, e em caso positivo adicioná-lo na Lista de Distribuição.

Finalmente, quando eu executar o Foreach, cada membro será adicionado individualmente para as listas de distribuição conforme suas designações.

Para finalizar o assunto, quero aproveitar para falar também sobre fazer um “teste” antes de sair executando o comando.

Para evitar erros, é importante testar exaustivamente seu código até que você tenha certeza de que, o comando executado, vai realizar somente o que você está solicitando. Desta forma, quero ressaltar a importância do -WhatIf no Powershell.

Considerações finais

O objetivo deste tópico foi trazer uma visão de como tornar sua vida muito mais fácil com o Powershell e, não posso deixar de incluir a importância de realizar testes, antes de efetivamente executar os comandos. Como exemplo, vamos usar o último script que mostrei aqui e como poderíamos fazer um “teste”, antes de efetivamente executar o comando:

Viu a diferença? O script está quase igual ao que coloquei antes, porém aqui temos a presença do -WhatIf e este switch é essencial para os testes, porque aqui temos o faz-de-conta e qualquer erro, que possivelmente pudesse ocorrer no script, seria apresentado aqui na tela. No nosso caso, pudemos ver que tudo foi bem sucedido, o que nos dá bandeira verde para seguirmos com a execução real do script, como vocês podem ver abaixo:

PS C:\> $Objects | ForEach-Object {
>>     $Lista= $_.Lista
>>     $Membros = $_.Membros -split ";"
>>     IF ($Membros) {
>>         ForEach ($Membro in $Membros) {
>>             Add-DistributionGroupMember -Identity $Lista -Member $Membro -WhatIf
>>         }
>>     }
>> }                                                                                                                                                                                            What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Financeiro".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Financeiro".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Financeiro".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Financeiro".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Financeiro".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "RH".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "RH".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "RH".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "RH".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "RH".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Diretoria".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Diretoria".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Diretoria".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Diretoria".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Diretoria".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Gerência".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Gerência".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Gerência".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Gerência".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Comercial".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Comercial".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Comercial".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Comercial".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Infraestrutura".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Infraestrutura".
What if: Adicionando membro do grupo de distribuição "[email protected]" ao grupo de distribuição "Infraestrutura".

Com isso, eu concluo meu tópico sobre gerenciamento de listas de distribuição. O que você gostaria que eu explorasse mais sobre listas de distribuição? Me deixe seus comentários!

Obrigado por ter lido até aqui e nos vemos em breve!