2017-09-28 14 views
1

Nous réinitialisons le mot de passe de l'utilisateur Active Directory en nous connectant via LDAPS. Nous définissons également l'attribut "Changer le mot de passe à la prochaine connexion".
Lorsque nous connecter à la machine Windows, nous effectuons les étapes suivantes:Message de succès de modification du mot de passe Active Directory

  1. Connectez-vous à la machine Windows en utilisant le nouveau mot de passe (mot de passe 1)
  2. La machine invite à changer le mot de passe
  3. Entrez le mot de passe existant (mot de passe 1) et un nouveau mot de passe (mot de passe)

À ce stade, nous attendons le message: Your password has been changed.You will need to use the new password for future logins. Cependant, nous recevons le message suivant: Unknown user name or bad password.
Mais, dans le backend, le système a accepté le nouveau mot de passe (mot de passe 2) que nous sommes en mesure de se connecter en utilisant mot de passe 2. Ce que nous ne pouvons pas comprendre pourquoi nous recevons le message incorrect lorsque le système a accepté le nouveau mot de passe
Devons-nous définir un autre attribut qui affichera le bon message?
Notre code est comme ci-dessous:

#!/usr/bin/perl -w 
######################### 
#This script resets the password in active user directory 
######################### 

use strict; 
use warnings; 
use DBI; 
use Net::LDAP; 
use Net::LDAPS; 
use Authen::SASL qw(Perl); 
use Net::LDAP::Control::Paged; 
use Time::Local; 
use MIME::Lite; 

my $CERTDIR  = "<certpath>"; 
my $AD_PASS  = "$CERTDIR/<certfile>"; 
my $sAN = $ARGV[0]; 
my $uninewpass; 
my $mail; 
my $fullname; 
my $name; 
my $distName; 
my $finalresult; 

### Generate Random Password ### 
my $randompass = askPasswd(); 

### Reading Active directory connection credentials ### 
my @AD_passwords = get_domain_pass(); 

###Reset password### 
my $result = reset_AD_Password(); 


###SUB FUNCTIONS### 

#Reset AD user password 
sub reset_AD_Password {        
    my $result = "fail"; 

    my $ad = Net::LDAPS->new($AD_passwords[0]); 
    my $msg = $ad->bind(dn => "cn=$AD_passwords[2],$AD_passwords[1]", 
         password => $AD_passwords[3], 
         version => 3); 

    if ($msg->code) 
    { 
      print "Error msg:" . $msg->error() . "\n"; 
      print "Error code:" . $msg->code() . "\n"; 
      exit 3; 
    } 

    my $acc_name   = 'sAMAccountName'; 
    my $acc_fullname  = 'displayName'; 
    my $acc_distName  = 'distinguishedName'; 
    my $acc_mail   = 'mail'; 

    my $act = $ad->search(
         base => "$AD_passwords[1]", 
         filter => "(&(objectCategory=person)(sAMAccountName=$sAN))", 
         attrs => [$acc_name, $acc_fullname, $acc_distName, $acc_mail]); 
    die 2 if ($act->count() !=1); 

    if ($act->code) 
    { 
      print "Error msg:" . $act->error() . "\n"; 
      print "Error code:" . $act->code() . "\n"; 
      exit 4; 
    } 

#Store DN for password reset 
my $sANdn = $act->entry(0)->dn; 

# Add quotes and uniCode to the passwords. 
map { $uninewpass .= "$_\000" } split(//, "\"$randompass\""); 
print "$uninewpass\n"; 

#Reset AD Password and change at next logon 
my $rtn = $ad->modify($sANdn, replace => [ 'unicodePwd' => $uninewpass]); 

if($rtn->{'resultCode'} != 0) { 
    print "Error msg:" . $rtn->error() . "\n"; 
    print "Error code:" . $rtn->code() . "\n"; 
    exit 5; 
} 

#Change Password at next logon# 
my $rtn = $ad->modify($sANdn, replace => { pwdLastSet => 0}); 

if($rtn->{'resultCode'} != 0) { 
    print "Error msg:" . $rtn->error() . "\n"; 
    print "Error code:" . $rtn->code() . "\n"; 
    exit 6; 
} 
    $result = "pass"; 
    return $result; 
} 

###Generate password### 
sub askPasswd { 

     use String::Random; 
     my $randPass = new String::Random; 
     my $rndpassword = $randPass->randpattern("CCccn!cnC"); 

     print "Your random password is: " , $rndpassword , "\n"; 

     return $rndpassword; 
} 

###Read Credentials File### 
sub get_domain_pass { 
     open(my $fh, '<:encoding(UTF-8)', $AD_PASS) or die "Could not open file"; 
     my $row = <$fh>; 
     chomp $row; 
     print "$row\n"; 
     my @AD_passwords = split/:/,$row; 
     return @AD_passwords; 
} 
+0

avez-vous envisagé de compresser certaines de ces variables? il est difficile de tester le code car je n'ai pas le même scénario, donc poignarder dans la semi-obscurité ici. –

+0

En outre, vous attendez-vous à ce que 'votre mot de passe a été modifié.Vous devrez utiliser le nouveau mot de passe pour le futur message de connexion à venir de AD? –

+0

@GerhardBarnard le code perl fonctionne très bien. Il crée ** mot de passe 1 ** correctement. Quelles sont les variables que vous suggérez? Chomping? Et oui, nous attendons le 'votre mot de passe a été changé.Vous devrez utiliser le nouveau mot de passe pour le futur message de connexion à venir de AD lorsque l'utilisateur est invité à changer leur mot de passe –

Répondre

0

a finalement trouvé la cause du problème.
Notre réseau dispose de plusieurs serveurs AD. Nous avons mis à jour le mot de passe sur l'un des serveurs AD.
La synchronisation entre les serveurs AD prend un certain temps sur notre réseau.
L'utilisateur se connectait en utilisant un serveur AD différent pour la vérification. Comme ce point, la synchronisation n'a pas eu lieu. Par conséquent, nous recevions le problème.
Nous avons maintenant modifié le code pour mettre à jour le bon serveur AD en fonction du serveur publicitaire utilisé pour authentifier l'utilisateur.