Vamos demonstrar como automatizar o processo de criação de conta no AD a partir de informações de um banco de dados MS SQL (do banco do seu RH, por exemplo), podendo diminuir a atividade da equipe de suporte, agilizar os processos para a empresa, sem aumentar custos e até evitar a necessidade de um gerenciador de identidade.

Antes de mais nada, para executar todo esse fluxo serão necessários várias informações do seu ambiente. Por não termos essas informações, deixaremos algumas partes em cinza de forma genérica, para que você altere conforme a sua realidade.

Para executar o que propomos nesse post, definimos 5 grandes etapas macro que precisam ser executadas.

Explicaremos cada uma delas:

Etapa 1 – Elaborar o fluxo

Para executar a sincronização de dados entre duas bases é necessário um valor único que tenha tanto no cadastro do nosso banco de RH, quanto no AD. No nosso caso vamos simular que é um campo matrícula (mas poderia ser CPF, ou outro campo), essa informação precisa estar cadastrada em algum campo do AD. Aqui iremos considerar que este campo está cadastrado no campo Pager do usuário no AD (altere para a sua realidade);

Tendo a premissa de qual será o campo único entre as duas bases, o primeiro passo é gerar a lista de usuários do AD, com o campo Pager :

Get-ADUser -filter * -Properties pager | ft name,samaccountname,pager

Agora você deve analisar (e corrigir):

  • Existem usuários SEM matricula? Para ver isso, execute o comando (em cada domínio, se possuir mais de um):
  • Existem inconsistências (erros de cadastro, fora de padrão, etc.)? Será necessário corrigir todas as contas e garantir a integridade/qualidade dos dados cadastrados no AD, antes de começar os procedimentos;

Os blocos de scripts a partir daqui devem ser executados na mesma sessão do PowerShell ISE, pois uma variável de saída em uma etapa pode ser necessária em outra parte do script.

Etapa 2 – Obter os dados do SQL

Para executar esse procedimento, você precisará dos dados do dados do banco (lembre-se de criar um usuário que tenha permissão apenas de leitura e apenas nos dados necessários) e do comando (a sintaxe do select) que será executado. Tendo esses dados, utilize esse script (altere as partes em cinza conforme sua realidade):

$connectionString = “Server=SERVIDOR;uid=USUARIO;pwd=SENHAO;Database=DATABASE;Integrated Security=False;”
$connectionString = “Server=”+$SQLSERVER+”\”+$SQLINSTANCE+”;uid=”+$SQLUSER+”; pwd=”+$SQLPASS+”;Database=”+$SQLDATABASE+”;Integrated Security=False;”
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = “select * from Tabela_Func
$connection.Open()
    $command = $connection.CreateCommand()
    $command.CommandText = $SQLQUERY
    $result = $command.ExecuteReader()
    $table = new-object “System.Data.DataTable”
    $table.Load($result)
$connection.Close()

Confirme se funcionou corretamente, executando o comando (e verificando a saída da variável):

$table

Lembre-se de usar trim na sua query para apagar os espaços em branco, no final de cada informação. Você pode verificar se suas variáveis estão com espaço (pode copiar para a área de transferência com o comando $table | fl | clip, abrir no notepad e verificar, por exemplo).

Etapa 3 – Obter os dados do AD

Agora vamos para os dados do Active Directory. Vamos considerar aqui que você possuí 2 domínios e que cadastrará ambos, se não for o caso, altere a linha $ActiveDirectories com a quantidade de domínios (inclua o nome do controlador de domínio) que você possuí (mais ou menos):

$lista_ad = Get-ADUser -filter {pager -like “*”} -Properties pager | select samaccountname,pager

Para confirmar se funcionou corretamente, execute o comando (e veja se retorna todos os objetos desejados):

$lista_ad

Etapa 4 – Comparar os dados

Para continuar funcionando a partir daqui, vamos considerar os campos em comum nas duas consultas (em nosso exemplo a matrícula) existem e estão iguais em ambos (não existem diferenças de forma de escrita, etc.). Lembre-se que você precisará ajustar, conforme a sua realidade.

Para criar uma lista apenas com as informações que existem no banco e não existem no AD (utilizando como referência nosso Post Comparando membros de dois arrays no PowerShell), use o seguinte código:

$novos_usuarios = $table | Where {$lista_ad -NotContains $_.pager}

Verifique se a lista contem apenas novas contas a serem criadas. Para isso, verifique os dados existentes nessa lista com o comando:

$novos_usuarios

Etapa 5 – Criar no AD

Para a próxima parte é importante que você verifique os nomes dos campos (das colunas) que estavam no banco. Vamos colocar como exemplo que os nomes são Nome e Matricula, sendo diferente altere as partes em cinza abaixo:

$novos_usuarios | Foreach-object {
    $BD_Nome = $_.Nome
    $BD_Matricula = $_.Matricula
    New-ADUser -Name “$BD_Nome” -sAMAccountName “$BD_Matricula” -OtherAttributes @{pager=”$BD_Matricula”} -AccountPassword (ConvertTo-SecureString -AsPlainText “DEFINA_UMA_SENHA” -Force) -Enabled $false
    write-host “usuario $BD_Nome criado”
}

Executando todos os códigos acima (testando com calma cada parte até que entenda o que você está fazendo e tendo certeza de todo o fluxo) você acabou de criar um script para criação automática dos usuários no AD. Podendo criar uma rotina/agendamento na frequência que deseja.

Lembrando que, por uma questão de segurança, em nosso exemplo criamos as contas desabilitadas.

Próximos passos

Como o título do Post diz, essa é uma versão mais simples. Se preferir uma versão de código um pouco mais detalhado (implementando múltiplos domínios Active Directory, fazendo o TRIM, considerando erro de conexão ao tentar obter os dados do AD, etc.) deixamos om post Criar contas no seu Active Directory automaticamente de uma lista do SQL, usando o PowerShell – Versão mais detalhada

Fontes/Referências

NVLAN – Comparando membros de dois arrays no PowerShell
NVLAN – Criar contas no seu Active Directory automaticamente de uma lista do SQL, usando o PowerShell – Versão mais detalhada

Mais Informações

Esperamos ter ajudado da melhor forma possível e estaremos sempre a disposição para mais informações.

Se você tem interesse em algum assunto específico, tem alguma dúvida que precisa de ajuda, ou quer sugerir um post, entre em contato conosco pelo e-mail equipe@nvlan.com.br.