2

我们正在编写一个 Perl 代码(从 Unix 运行),它将重置 Windows AD 用户的密码。(我们没有使用 powershell,因为我们被要求不要使用 Windows 脚本)。

使用以下 Perl 代码,我们可以连接到 AD 用户目录并查询正确的用户。

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

my $CERTDIR     = "<cert path>";
my $AD_PASS     = "$CERTDIR/.VDIAD_pass";
my $sAN = "vahmed";

### Generate Random Password ###
my $randompass = askPasswd();
my $uninewpass;
my $mail;
my $fullname;
my $name;
my $distName;
my $finalresult;


my @AD_passwords = get_domain_pass();

my $result = reset_AD_Password();

#Reset AD user password
sub reset_AD_Password {                              
    my $ad = Net::LDAP->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->error() . "\n";
            exit 2;
    }

    my $acc_name            = 'sAMAccountName';
    my $acc_fullname        = 'displayName';
    my $acc_base            = 'manager';
    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 1 if ($act->count() !=1 );
my $samdn = $act->entry(0)->dn;

$fullname = $samdn->get_value($acc_fullname);
$mail = $samdn->get_value($acc_mail);   

    }
}

但是,我们在线上得到一个错误:

$fullname = $samdn->get_value($acc_fullname);
    $mail = $samdn->get_value($acc_mail);

错误状态“无法通过包(可分辨名称)定位对象方法“get_value”(也许您忘记加载(可分辨名称))”
但是,当我们将$samdn替换为以下代码时,代码可以正常工作:

foreach my $entry ($act->entries){
        $name           = $entry->get_value($acc_name);
        $fullname       = $entry->get_value($acc_fullname);
        $distName       = $entry->get_value($acc_distName);
        $mail           = $entry->get_value($acc_mail);
    }

代码似乎无法将$samdn识别为Net::LDAP::Entry记录。
我们尝试过类型转换$samdn但得到了同样的错误。有人可以帮助解决这个问题,因为我们不喜欢使用 for 循环,以防万一搜索返回更多记录?提前致谢。

4

1 回答 1

0

您没有将 Net::LDAP::Entry 分配给$samdn. 您正在分配第一个条目的dn

#                         VVVV
my $samdn = $act->entry(0)->dn;

摆脱它->dn,它应该可以工作,如果$act->entry(0)返回一个 Net::LDAP::Entry。

于 2017-09-26T12:51:57.620 回答