无法识别 perl LDAP 条目

perl LDAP entry not recognised

我们正在编写 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);

错误状态 "Can't locate object method "get_value" via package (distinguished Name) (也许你忘记加载 (distinguished Name))"
但是,当我们将 $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 循环以防万一搜索返回一条记录吗?提前致谢。

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

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

摆脱那个 ->dn 它应该工作,如果 $act->entry(0) returns a Net::LDAP::Entry.