Início > Active Directory Modules for Windows Powershell, Windows PowerShell > PoSh – Comparando e adicionando grupos diferentes entre duas contas de usuário

PoSh – Comparando e adicionando grupos diferentes entre duas contas de usuário

julho 20, 2015

Olá pessoALL,

Este é mais um post sobre PoSh e um atividade do dia a dia de IT-Pros que gerenciam o Active Directory Domain Services, a equalização de grupos entre contas de usuários.

A contratação de um novo colaborador, a mudança de área devido a uma oportunidade entre outras motivos são situações que pode gerar uma demanda que dependendo do número de grupo aos quais uma conta de usuário modelo está associada, pode ser um tanto chato de se fazer uma comparação com o objetivo de determinar quais são as diferenças entre a conta de modelo e a conta de destino.

Solicitações como “usuário X deixou o setor Z e agora está no setor Y, então é preciso que ele tenha todos os acessos necessários para o setor Y, não tenha mais os acessos ao recursos do setor Z e como modelo o usuário M pode ser usado para obter os grupos que o usuário X precisa ser membro”.

Quando este tipo de situação acontece, normalmente eu vejo IT-Pros fazendo a comparação no que chamamos de olhômetro, usando scripts em VBScript com códigos enormes, nada produtivos e dificeis de entender, planilhas do MS Excel com o uso de fórmulas, enfim.

Existem diversas formas de chegarmos ao objetivo de compararmos os grupos que duas contas de usuários são membros e encontrar a diferença, mas como fazer isso com PoSh? Primeiramente o que eu gostaria de recomendar é: abra o PowerShell e execute o comando Get-Command e veja os CmdLets disponíveis.

O CmdLet Get-Command permite listar todos os CmdLets disponíveis e carregados na sessão do PoSh e se você verificar com atenção, verá que existem alguns muito poderosos e que permitem a execução de ações fantásticas. No caso deste post, nós vamos falar sobre o CmdLet Compare-Object.

Com o CmdLet Compare-Object é possível verificar a diferença entre dois objetos como por exemplo, conteúdo de arquivos, objetos do AD DS, etc. A sintáxe mais simples do CmdLet é Compare-Object -ReferenceObject ObjectName -DifferenceObject DiffObjectName.

O que a sintáxe acima faz? O CmdLet verifica o resultado do objeto em -ReferenceObject, verifica o resultado do objeto em -DifferenceObject, compara o resultado e apresenta apenas o que há de diferente entre eles. Se você quer ter mais informações sobre o CmdLet Compare-Object, acesso o help do mesmo – Compare-Object.

Vontando agora ao nosso objetivo, como podemos fazer uso do CmdLet Compare-Object para verificar o que há de diferente entre duas contas de usuário? Primeiro, você precisa entender como obter a informação que precisamos ter para alcançarmos nosso objetivo, então, como listar os grupos que uma conta de usuário é membro?

Para mostrarmos isto, nós precisamos de um CmdLet do Active Directory Modules for Windows PowerShell chamado Get-ADUser. Através deste CmdLet é possível listarmos as propriedades de uma ou mais contas de usuários. Vamos ver como ele funciona:

 Compare-Object-AD-User-Accounts_0001

O comando Get-ADUser -Identity UserAccount mostra algumas informações sobre a conta do usuário, mas por padrão, ele não exibe todas e principalmente a que precisamos visualizar que é o atributo MemberOf.

Para visualizarmos o restante dos atributos é preciso utilizar o parâmetro -Properties *  ou então podemos filtrar o atributo que desejamos informando o nome do atributo como mostrado abaixo:

Compare-Object-AD-User-Accounts_0002

Agora podemos visualizar o atributo que precisamos, apenas não conseguimos visualizar completamente seu conteúdo devido a quantidade de grupos que está truncada. Este tipo de situação precisa ser resolvida, pois o resultado da comparação entre dois objetos com este tipo de saída não fica nada amigável.

Para deixarmos a exibição dos grupos existente dentro do atributo MemberOf mais amigável nós vamos utilizar um pipe “|” e o CmdLet Select-Object com o parâmetro -ExpandProperty MemberOf. Vejamos como a saída ficará agora.

Compare-Object-AD-User-Accounts_0003

Como podemos ver, a visualização ficou muito melhor e já podemos ter uma visão de quais grupos o usuário Aaron Howard é membro. Agora que já sabemos como listar corretamente os grupos que um usuário é membro, vamos ver como podemos comparar o atributo MemberOf entre duas contas de usuários.

Como dito previamente, o CmdLet Compare-Object permite que este tipo de ação seja feita e a forma é muito simples. Vejamos na próxima imagem a comparação do atributo MemberOf entre as contas de usuário Aaron Howard e Andy Jenkins.

Compare-Object-AD-User-Accounts_0004

Neste ponto já é possível determinarmos os grupos que estão presentes somente no usuário Aaron Howard ou somente no usuário Andy Jenkins usando a coluna SideIndicator. Esta coluna possui 3 valores possíveis:

  • == significa que o item está presente no objeto de referência e no diferente (por padrão não é mostrado).
  • => significa que o item está presente somente no objeto informado no parâmetro -DifferenceObject.
  • <= significa que o item está presente somente no objeto informado no parâmetro -ReferenceObject.

Se o nosso objetivo é saber quais grupos o usuário modelo Aaron Howard possui de diferente do usuário de destino Andy Jenkins é possível melhorar a saída desta comparação filtrando apenas com os grupos que estão presentes no usuário modelo.

Compare-Object-AD-User-Accounts_0005

Como podemos ver agora, usando a condição ? {$_.SideIndicator = “<=”} é possível filtrarmos o que desejamos encontrar – os grupos aos quais o usuário Aaron Howard é membro.

Agora vamos imaginar a seguinte situação:

  • um novo colaborador chamado Alfred Arnold (alfred.arnold) inicia no setor de HR.
  • a solicitação de criação de sua conta é concluída.
  • o head do setor de HR informa que o usuário Alfred Arnold deve ter os mesmos grupos de acesso do usuário Aaron Howard.

Como chegar a este resultado usando o comando Compare-Object? Simples!

Compare-Object-AD-User-Accounts_0006

Após concluirmos o comando acima se executarmos novamente o comando para compararmos os grupos do usuário Aaron Howard e do Alfred Arnold acrescentando o parâmetro -IncludeEqual o resultado que será mostrado será este:

Compare-Object-AD-User-Accounts_0007

Como podemos ver, todos os grupos que o usuário Alfred Arnold faz parte estão equalizados com o usuário Aaron Howard. Not bad, huh!?

Com duas linhas de código em PoSh é possível chegar ao objetivo de garantir que os grupos de um usuário X sejam os mesmos grupos que o usuário Y faz parte.

E se nosso objetivo fosse equalizar os grupos do usuário Aaron Howard com o usuário Andy Jenkins como no inicio? Simples também! Já temos a solução para filtrarmos apenas os grupos que o usuário Aaron faz parte, então, equalizar o usuário Andy seria tão simples quanto movimentar os usuários como fizemos para o usuário Alfred.

E se você tiver um processo de criação de usuário automático? Se houver um software de ITSM onde a requisição de admissão de um colaborador é criada? Que tal embarcar este simples processo na criação do usuário garantindo que no final você tenha o que é necessário com o menor esforço possível?

Com PoSh e conhecimento é possível automatizar completamente a criação de um usuário entregando no final todos os detalhes necessários para que o novo colaborador inicie suas atividades sem desgastes, estresse entre outras situações comuns quando há não há um processo bem estruturado de admissão.

É isso galera! Espero que este post seja útil para o dia a dia de vocês e que o trabalho duro comece a ser reduzido com o uso de PoSh!

Até o próximo post…

%d blogueiros gostam disto: