2017-09-28 23 views
1

LDAPSを介して接続することによりActive Directoryユーザーパスワードをリセットしています。 「次のログオン時にパスワードを変更する」属性も設定しています。
我々はWindowsマシンにログインすると、我々は次の手順を実行します。新しいパスワードを使用してWindowsマシンへActive Directoryパスワード変更メッセージの変更

  1. ログイン(パスワード1
  2. マシンが入力したパスワード
  3. を変更することが求められます既存のパスワード(パスワード)と新しいパスワード(パスワード)

この時点で、メッセージはYour password has been changed.You will need to use the new password for future loginsです。
しかし、私たちはメッセージを受け取ります:Unknown user name or bad password
しかし、バックエンドでは、パスワード2を使用してログインできるので、システムは新しいパスワード(パスワード2)を受け入れました。
システムが新しいパスワードを受け入れたときに間違ったメッセージを受け取っている理由を理解できません
正しいメッセージを表示する別の属性を設定する必要はありますか?
私たちのコードは以下の通りです:

#!/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

これらの変数のいくつかをchompingすることを検討しましたか?私は同じシナリオを持っていないので、ここで半暗闇で刺すようにコードをテストするのは難しいです。 –

+0

さらに、あなたのパスワードは変更されていると思いますか?今後のログインのために新しいパスワードを使用する必要があります。 –

+0

@GerhardBarnard perlコードはうまく動作します。 **パスワード1 **を正しく作成します。あなたは 'chomping'を提案しています。そして、あなたはパスワードが変更されたことを期待しています。パスワードを変更するように促されたときにADから来るようにするために新しいパスワードを使用する必要があります。 –

答えて

0

は最後に、問題の根本的な原因を発見しました。
私たちのネットワークには複数のADサーバーがあります。 ADサーバーのいずれかでパスワードを更新していました。
私たちのネットワークでは、ADサーバー間の同期に時間がかかります。
ユーザーは確認のために別のADサーバーを使用してログオンしていました。この時点で、同期は行われていませんでした。それで私たちはこの問題を受けていました。
これで、ユーザーを認証するために使用される広告サーバーに基づいて正しいADサーバーを更新するコードを変更しました。

関連する問題