Início > Active Directory Modules for Windows Powershell, Windows PowerShell > PoSh – Como criar usuários no AD DS a partir de um CSV?

PoSh – Como criar usuários no AD DS a partir de um CSV?

julho 13, 2015

Olá pessoALL,

Este é mais um post de PoSh! sobre algo que ainda existem muitas dúvidas quando IT-Pros se aventuram ao criarem usuários em lotes ou “bulk” no Active Directory.

Frequentemente eu vejo alguns erros como desconhecimento de qual delimitador CmdLets como Import-CSV e Export-CSV entendem por padrão e como declarar as colunas de um arquivo CSV corretamente para esta finalidade.

Com relação ao delimitador, quem pretende criar usuários ou qualquer outro tipo de objeto no Active Directory através de PoSh deve ter em mente que por padrão os CmdLets Import-CSV e Export-CSV usam a vírgula “,” como delimitador padrão.

Então, se você criar uma tabela no MS Excel e salvar esta mesma tabela como CSV (MS DOS) (*.csv), no final você terá um arquivo CSV com o seguinte conteúdo se abrir com o Notepad:

CreateBulkOfADUsers_0001

CreateBulkOfADUsers_0002

Como podemos visualizar, o delimitador que o MS Excel usou para criar o arquivo CSV foi ponto e vírgula “;”. Mas no que isto interfere no momento de importar este conteúdo?

Vejamos na prática o que acontece quando usamos o comando Import-CSV C:\Shared\BulkOfUsers.csv | Ft -AutoSize e o Import-CSV C:\Shared\BulkOfUsers.csv -Delimiter “;” | Ft -AutoSize.

CreateBulkOfADUsers_0003

Percebeu a diferença? No primeiro comando o CmdLet não reconhece o delimitador ponto e vírgula, pois ele espera encontrar uma vírgula que existe apenas na formação do Display Name do usuário e ainda há informações que foram perdidas como SAM, e-mail, etc.

Agora, quando utilizamos o parâmetro -Delimiter e informamos o ponto e vírgula como delimitador, o resultado é complemente diferente e todas as informações encontradas no arquivo são exibidas corretamente.

Mas o que aconteceria se eu tentasse utilizar a saída do primeiro comando após o pipe “|” para passar as colunas como argumentos para um comando? Uma mensagem de erro muito comum informando que determinado parâmetro do CmdLet informado após o pipe não pode ser nulo.

O que acontece neste caso é que se você tentar passar os valores atuais com base nas colunas para um CmdLet após o pipe ele não irá reconhecer nenhuma informação. Por exemplo, New-ADUser -SamAccountName $_.UserName irá retornar um erro informando que o valor para este parâmetro é nulo.

Neste tipo de situação você pode tanto alterar todos os sinais de ponto e vírgula caso não exista combinações que utilizem a vírgula, quanto utilizar o parâmetro -Delimiter que é a melhor opção na minha opinião para resolver este tipo de problema.

Outro erro comum e que não é tão fácil de ser identificado está relacionado a nomenclatura das colunas no arquivo CSV. É muito comum utilizarmos termos mais amigáveis e no idioma nativo, mas por experiência própria eu digo que isso nem sempre será a melhor abordagem.

O melhor a se fazer no momento de nomear as colunas do CSV é utilizar LDAP Display Name para representá-los. Por exemplo: a coluna onde você terá a informação do SamAccountName deve ter o nome de sAMAccountName, a coluna do primeiro nome deve ter o nome de GivenName, etc.

Mas eu não sei o nome dos atributos a serem utilizados. Vou ter que consultar isso no Active Directory ou em outro local? A resposta é sim. Através do próprio help do comando New-ADUser é possível obter estas informações. Digite no PowerShell o comando Get-Help New-ADUser -Online e você será direcionado para a página online de ajuda.

Após executarmos o comando para visualizar o help se você procurar pelo parâmetro SamAccountName você visualizará a seguinte informação em destaque:

CreateBulkOfADUsers_0004

Utilizando esta informação você deverá gerar um arquivo CSV com os nomes das colunas de forma semelhante ao mostrado na primeira imagem deste post.

Seguindo estas duas recomendações sua chance de cometer erros reduz consideravelmente no momento da execução de um script de criação automático e em grandes quantidades, mas como seria este script? Muito mais simples do que você pode imaginar.

Import-Module ActiveDirectory
Import-Csv C:\SHARED\BulkUsers.csv -Delimiter “;” | ForEach-Object {
If (!(Get-ADObject -Filter “sAMAccountName -eq ‘$_.sAMAccountName'”)) {
New-ADUser -Name $_.Name -UserPrincipalName $_.UserPrincipalName -SamAccountName $_.sAMAccountName -GivenName $_.GivenName -DisplayName $_.DisplayName -SurName $_.Surname -City $_.City -State $_.State -HomePhone $_.TelephoneNumber -Office $_.Office -EmailAddress $_.Mail -Path “OU=NSFW_CORP,DC=nosafeforwork,DC=net”
Write-Host “The user $_.sAMAccountName created successful.”
}
Else {
Write-Host “The user $_.sAMAccountName already exists.”
}
}

Como podemos ver no código acima, é possível automatizar a criação de várias contas de usuários de forma bem simples e que também pode ser reaproveitado para a criação de outros objetos como grupos, unidades organizacionais, etc. Let’s rock and roll right now!

Agora vamos pensar um pouco além… Suponhamos que você trabalhe em um grande organização e que o processo de admissão de novos colaboradores é algo quase que diário. Digamos que em sua organização a solicitação de criação destas contas seja feita através de um software de ITSM onde existem informações que precisam ser inseridas.

Que tal aproveitar este conhecimento adquirido aqui e fazer uma automatização mais robusta? Pensando um pouco podemos chegar a seguinte estrutura para resolver este tipo situação:

  1. são criados os diretórios ITSM_Bulk_Users\Approved e ITSM_Bulk_Users\Concluded.
  2. é criado um arquivo de referência chamado Bulk_Users.csv contendo as colunas necessárias para a criação da conta do usuário em ITSM_Bulk_Users.
  3. uma solicitação é aberta no software de ITSM e é aprovada.
  4. a própria ferramenta de ITSM gera uma cópia do arquivo Bulk_Users.csv em ITSM_Bulk_Users\Approved e renomeia este novo arquivo para o número da solicitação registrada no ITSM, por exemplo 80001.csv.
  5. a ferramenta de ITSM edita o arquivo 80001.csv e inclui na próxima linha do arquivo as informações sobre a conta de usuário a ser criada que devem ser equivalentes as colunas no arquivo de referência.
  6. você cria, por exemplo, uma tarefa agendada em um servidor com um script que irá verificar o conteúdo do diretório ITSM_Bulk_Users\Approved e caso houve algum arquivo dentro deste diretório, a criação da conta do usuário será feita automaticamente.
  7. após criada, o script move o arquivo utilizado na criação da conta de usuário do diretório ITSM_Bulk_Users\Approved para o diretório ITSM_Bulk_Users\Concluded.

CreateBulkOfADUsers_0005

E este é apenas um exemplo do que poderia ser feito usando algumas linhas de código em PoSh. Easy, isn’t it?

O código acima faz o que foi desenhado anteriormente e pode ficar ainda mais robusto, pois não há uma validação para procurar por uma conta de usuário existente como no primeiro, poderiamos inserir uma etapa para que os grupos de uma conta de referência serem inseridos na nova conta, você pode extrair estas informações da base de dados alimentada pelo software de ITSM no lugar do próprio software criar os arquivos necessários, etc.

As possibilidades são infinitas e cabe somente a você colocar as mãos na massa e fazer aquela atividade diária e manual ficar mais produtiva e automatizada com PoSh.

Espero que tenham gostado deste conteúdo e que ele sirva de base para resolver algumas demandas do dia a dia.

Até o próximo post…

%d blogueiros gostam disto: