none
Powershell: política de complexidade de senha RRS feed

  • Pergunta

  • Prezados,

    este script funciona quase que perfeitamente.

    Na Function TestPasswordComplexy dá erro em tela:

    New-ADUser : The password does not meet the length, complexity, or history requirement of the domain.
    At C:\Users\Administrator\Documents\scripts\testes\Versoes\Criar_conta_usuario_v.1.4 - test.ps1:123 char:1
    + New-ADUser -SamAccountName $SamAccountName -Name $DisplayName -Displa ...

    O script ainda imprime as saídas abaixo antes de exibir o erro acima: 

    Senhas coincidem.
    .........
    Senha válida.

    Mas se eu retirar/comentar a Function, funciona. Porém retorna do início lá do Menu. Gostaria que retornasse no passo de inserir a senha após o insucesso.

    Por favor, me deem uma ajuda ou um caminho a seguir. Obrigado!

    Clear-Host
    
    # Variáveis FQDN
    $DNSRoot = "@weg.art.br"
    
    # Variáveis MemberOf - Grupos do usuário
    $MemberOfEstMediVol = "Internet Ilimitado"
    $MemberOfConc = "Internet Limitado"
    
    
    do {
    
      do {
        Write-Host "================ Script de Criação de conta  ================"
        write-host ""
        write-host "Digite 'A' para cria uma conta para estagiário."
        write-host "Digite 'B' para cria uma conta para terceiro."
        write-host "Digite 'C' para cria uma conta para funcionário."
        write-host "Digite 'D' para cria uma conta para Diretor."
        write-host ""
        write-host "S - Sair"
        write-host ""
        Write-Host "====================================================================================="
        write-host -nonewline "Digite a opção desejada e tecle Enter: "
        $choice = read-host
        write-host ""
        $ok = @("A","B","C","D","S") -contains $choice
        if ( -not $ok) { write-host "Opção inválida. Digite apenas as letras existentes no Menu." -F red 
                         write-host ""}
                         
      }
      until ( $ok )
      switch ( $choice ) {
        "A" {write-host "Você escolheu a opção 'A' - Estagiário" -F green
    
        # Variáveis que terão valores inseridos pelo usuário
    $Path = "OU=Usuários,OU=Colaboradores,OU=!Departamentos,dc=weg,dc=art,dc=br"
    $GivenName = Read-Host -Prompt 'Digite apenas o primeiro nome do usuário'
    $Surname = Read-Host -Prompt 'Digite o sobrenome do usuário'
    $DisplayName = $GivenName + " " + $Surname
    $Description = Read-Host -Prompt 'Digite a Descrição'
    $SamAccountName = Read-Host -Prompt 'Entre login usuário'
    $UserPrincipalName = $SamAccountName+$DNSRoot
    $Mail = $UserPrincipalName
    
    # Inserir Data de contrato
    Function InserirData {
    $global:expirationDate = ""
      $Date = Read-Host -Prompt 'Entre com a data fim do contrato - dd/mm/aaaa'
      try{
           $global:expirationDate = [DateTime]::ParseExact($date,'dd/MM/yyyy',$null)
      }
      catch{
         Write-Host ""
         Write-Host "            Data $date NÃO VÁLIDA!" -ForegroundColor Red
         Write-Host ""
         Write-Host ""
         Write-Host ""
             Clear-Variable -name date
             InserirData
    
    }
    }
    InserirData
    
    # Inserir senha, confirmação e Teste de complexidade
    Function TestPasswordComplexy {
       do {
    Write-Host "Digite a senha com atenção, pois se errar terá que digitá-la novamente." -ForegroundColor Green
    $secpass = Read-Host "Digite a senha" -AsSecureString
    $secpass2 = Read-Host "Confirme a senha" -AsSecureString
    $secpass_text = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($secpass))
    $secpass2_text = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($secpass2))
    }
    while ($secpass_text -cne $secpass2_text)
    Write-Host "Senhas coincidem." -F green
    Write-Host "........." -F green
    
    
    if ($null -eq (Get-Module -listavailable activedirectory))
    {
        # lida com o problema, a próxima etapa requer o módulo AD.
    }
    $policy = Get-ADDefaultDomainPasswordPolicy
    
    $complexityRulesMet = 0
    if ($policy.ComplexityEnabled)
    {
        # Se a complexidade estiver habilitada, a senha deve conter três das quatro categorias a seguir
        if ($secpass_text -cmatch '[a-z]') { $complexityRulesMet += 1 }  # letra minúscula
        if ($secpass_text -cmatch '[A-Z]') { $complexityRulesMet += 1 }  # letra maiúscula
        if ($secpass_text -match '\d') { $complexityRulesMet += 1 }      # número de 0-9
        if ($secpass_text -match '[`~!@#$%^&*()_+-=\\{}|;'''':",./<>?\[\]]') { $complexityRulesMet += 1 }  # caracteres especiais
    }
    else
    {
        # Domínio não impõe requisito de complexidade
        $complexityRulesMet = 4
    }
    
    if($secpass_text.Length -ge $policy.MinPasswordLength -and $complexityRulesMet -ge 3)
    {
        Write-Host "Senha válida." -ForegroundColor Green
        Write-Host "...." -F green
        Write-Host "........." -F green
    }
    else
    {
        Write-Host "Senha NÃO válida! A senha deve atender aos requisitos de complexidade." -ForegroundColor Red
        Write-Host ""
        Write-Host ""
        TestPasswordComplexy
        
    }
    }
    TestPasswordComplexy
    
    
    New-ADUser -SamAccountName $SamAccountName -Name $DisplayName -DisplayName $DisplayName -GivenName $GivenName -Surname $Surname -Description $Description -EmailAddress $Mail -UserPrincipalName $Mail -ChangePasswordAtLogon $true -Path $Path -AccountPassword $secpass_text -Enabled $true -PasswordNeverExpires $false   
    Set-ADAccountExpiration -Identity $SamAccountName -DateTime $global:expirationDate -Server (Get-ADDomain).PDCEmulator
    Add-ADPrincipalGroupMembership -Identity $SamAccountName -MemberOf $MemberOfEstMediVol
     
    Write-Host "Usuário " -ForegroundColor green -NoNewline
    Write-Host "$DisplayName" -ForegroundColor Black -BackgroundColor White -NoNewline
    Write-Host " e senha criados com sucesso." -ForegroundColor green
    Write-Host "" -F green
    Write-Host "" -F green
          #Clear-Variable * -ErrorAction SilentlyContinue
          break
        }
        "B" {write-host "Você escolheu a opção 'B' - Terceiro" -F green
          break
        }
        "C" {
          write-host "Você escolheu a opção 'C' - Funcionário" -F grenn
          break
        }
        "D" {
          write-host "Você escolheu a opção 'D' - Diretor" -F grenn
          break
        }
      }
    }
    until ( $choice -eq "S" )


    sábado, 19 de dezembro de 2020 13:49