【问题标题】:Active Directory change password success messageActive Directory 更改密码成功消息
【发布时间】:2018-03-10 02:42:19
【问题描述】:

我们正在通过 LDAPS 连接来重置 Active Directory 用户密码。我们还设置了“下次登录时更改密码”属性。
当我们登录到 Windows 机器时,我们执行以下步骤:

  1. 使用新密码(密码1)登录windows机器
  2. 机器提示修改密码
  3. 输入现有密码(password 1)和新密码(password 2)

此时我们正在等待消息:Your password has been changed.You will need to use the new password for future logins。
但是我们收到消息:Unknown user name or bad password.
但是,在后端,系统已经接受了新密码(password 2),因为我们可以使用 password 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;
}

【问题讨论】:

  • 您是否考虑过选择其中一些变量?测试代码很困难,因为我没有相同的场景,所以在这里半夜刺伤。
  • 另外,您是否希望 Your password has been changed.You will need to use the new password for future logins 消息来自 AD?
  • @GerhardBarnard perl 代码工作得很好。它正确地创建了 密码 1。您建议使用哪些变量 chomping 是的,当提示用户更改密码时,我们希望来自 AD 的 Your password has been changed.You will need to use the new password for future logins 消息

标签: perl active-directory ldap


【解决方案1】:

终于找到了问题的根源。
我们的网络有多个 AD 服务器。我们正在更新其中一台 AD 服务器上的密码。
AD 服务器之间的同步在我们的网络中需要一些时间。
用户正在使用不同的 AD 服务器登录以进行验证。至此,同步尚未发生。因此我们收到了这个问题。
我们现在已经修改了代码,以根据用于对用户进行身份验证的广告服务器更新正确的广告服务器。

【讨论】:

    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2013-09-11
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    相关资源
    最近更新 更多