LDAPSを介して接続することによりActive Directoryユーザーパスワードをリセットしています。 「次のログオン時にパスワードを変更する」属性も設定しています。
我々はWindowsマシンにログインすると、我々は次の手順を実行します。新しいパスワードを使用してWindowsマシンへActive Directoryパスワード変更メッセージの変更
- ログイン(パスワード1)
- マシンが入力したパスワード
- を変更することが求められます既存のパスワード(パスワード)と新しいパスワード(パスワード)
この時点で、メッセージは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;
}
これらの変数のいくつかをchompingすることを検討しましたか?私は同じシナリオを持っていないので、ここで半暗闇で刺すようにコードをテストするのは難しいです。 –
さらに、あなたのパスワードは変更されていると思いますか?今後のログインのために新しいパスワードを使用する必要があります。 –
@GerhardBarnard perlコードはうまく動作します。 **パスワード1 **を正しく作成します。あなたは 'chomping'を提案しています。そして、あなたはパスワードが変更されたことを期待しています。パスワードを変更するように促されたときにADから来るようにするために新しいパスワードを使用する必要があります。 –