Veja como fazer uma sugestão de login, baseado no nome completo da pessoa (e validar se existe no AD), no PowerShell.

Para esse script, iremos perguntar o nome, para testar possibilidades de login, iremos:

  • Remover os acentos;
  • Deixa tudo em minúsculo;
  • Retira pontos e virgulas;
  • Retirar espaços duplos;
  • Retirar palavras que não usaremos (como “de”)

Nesse exemplo, iremos sugerir a seguinte regra/ordem de preferência de nomes para o login considerando o nome Fulano da Silva Paz (altere conforme desejar):

  • primeiro+ultimo
  • primeiro+penultimo (somente se houver mais de 3 nomes)
  • primeiro+penultimo+primeiraletra_ultimo (somente se houver mais de 3 nomes)
  • primeiro+primeiraletra_ultimo
  • primeiro+primeiraletra_penultimo (somente se houver mais de 3 nomes)
  • primeiro+primeiraletra_penultimo+ultimo (somente se houver mais de 3 nomes)
  • primeiro+primeiraletra_penultimo+primeiraletra_ultimo (somente se houver mais de 3 nomes)
  • primeiraletra_primeiro+ultimo
  • primeiraletra_primeiro+penultimo (somente se houver mais de 3 nomes)
  • primeiraletra_primeiro+primeiraletra_penultimo+ultimo (somente se houver mais de 3 nomes)
  • primeiraletra_primeiro+primeiraletra_penultimo+primeiraletra_ultimo (somente se houver mais de 3 nomes)
  • Repetir a MESMA sequência, adicionando um hífen entre cada nome

Com todas as opções de login, iremos retirar opções duplicadas, muito curtas (menos de 4 letras) e muito longas (mais de 12). Para ilustrar o resultado, para o nome Fulano da Silva Paz seriam sugeridos os seguintes logins (ordenando pelas melhores sugestões em primeiro):

  • fulanopaz
  • fulanosilva
  • fulanop
  • fulanos
  • fulanospaz
  • fulanosp
  • fpaz
  • fsilva
  • fspaz
  • fsilvap
  • fulano.paz
  • fulano.silva
  • fulano.p
  • fulano.s
  • fulano.spaz
  • fulano.sp
  • f.paz
  • f.silva
  • fs.paz
  • f.silvap

Vamos ao código PowerShell:

$NOME_COMPLETO = Read-Host -Prompt 'Informe o nome completo da pessoa (ex: Fulano da Silva Paz)'
$testelogin = @()
$login = $null
VAMOS PADRONIZAR O NOME (REMOVER OS CARACTERES INDESEJADOS, ACENTOS, DEIXAR EM MINUSCULO E RETIRAR PALAVRAS COMO "de" "da)
$NOME_TESTELOGIN = $NOME_COMPLETO.ToLower().Replace("."," ").Replace("-"," ").Replace(","," ").Replace(" "," ")
$NOME_TESTELOGIN = [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding(1251).GetBytes($NOME_TESTELOGIN))
$NOME_TESTELOGIN = $NOME_TESTELOGIN.Replace(" e "," ").Replace(" da "," ").Replace(" das "," ").Replace(" de "," ").Replace(" do "," ").Replace(" dos "," ")
$Array_Nome = $NOME_TESTELOGIN.Split(" ")
$testelogin += $Array_Nome[0] + "." + $Array_Nome[$Array_Nome.Count-1]
if ( (($Array_Nome.Count) -gt 2)) { $testelogin += $Array_Nome[0] + "." + $Array_Nome[$Array_Nome.Count-2] }
if ( (($Array_Nome.Count) -gt 2)) { $testelogin += $Array_Nome[0] + "." + $Array_Nome[$Array_Nome.Count-2] + $Array_Nome[$Array_Nome.Count-1].SubString(0,1) }
$testelogin += $Array_Nome[0] + "." + $Array_Nome[$Array_Nome.Count-1].SubString(0,1)
if ( (($Array_Nome.Count) -gt 2)) { $testelogin += $Array_Nome[0] + "." + $Array_Nome[$Array_Nome.Count-2].SubString(0,1) }
if ( (($Array_Nome.Count) -gt 2)) { $testelogin += $Array_Nome[0] + "." + $Array_Nome[$Array_Nome.Count-2].SubString(0,1) + $Array_Nome[$Array_Nome.Count-1]}
if ( (($Array_Nome.Count) -gt 2)) { $testelogin += $Array_Nome[0] + "." + $Array_Nome[$Array_Nome.Count-2].SubString(0,1) + $Array_Nome[$Array_Nome.Count-1].SubString(0,1) }
$testelogin += $Array_Nome[0].SubString(0,1) + "." + $Array_Nome[$Array_Nome.Count-1]
if ( (($Array_Nome.Count) -gt 2)) { $testelogin += $Array_Nome[0].SubString(0,1) + "." + $Array_Nome[$Array_Nome.Count-2] }
if ( (($Array_Nome.Count) -gt 2)) { $testelogin += $Array_Nome[0].SubString(0,1) + $Array_Nome[$Array_Nome.Count-2].SubString(0,1) + "." + $Array_Nome[$Array_Nome.Count-1] }
if ( (($Array_Nome.Count) -gt 2)) { $testelogin += $Array_Nome[0].SubString(0,1) + "." + $Array_Nome[$Array_Nome.Count-2] + $Array_Nome[$Array_Nome.Count-1].SubString(0,1) }
$testelogin = $testelogin | Where-Object {$_}
$testelogin = $testelogin | Where {($_.length -ge 4) -and ($_.length -le 12)}
$testelogin = $testelogin.Replace(".","") + $testelogin
$testelogin = $testelogin | Select -unique
Write-host "Os possiveis logis sao:"
Write-host $testelogin

Adicionalmente, pode obter a lista de usuários do AD e usar nosso método que fala sobre Comparando membros de dois arrays no PowerShell para deixar a melhor opção de login e que não existe no AD, execute:

#VAMOS CONSULTAR O AD PARA OBTER O MELHOR LOGIN DISPONIVEL
$AdList = Get-ADUser -filter *
$login = $testelogin | Where {$AdList.samaccountname -NotContains $_} | Select-Object -first 1
Write-host "O login que melhor encaixa na regra: $login"

Caso você possua múltiplos domínios, leia sobre como criar uma lista de todos os usuários de todos os domínios em nosso 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.

Entre em contato conosco pelo e-mail equipe@nvlan.com.br.

NVLAN - Consultoria