【问题标题】:perl LDAP entry not recognisedperl LDAP 条目无法识别
【发布时间】:2017-09-26 12:49:35
【问题描述】:

我们正在编写一个 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 循环,以防万一搜索返回更多记录?提前致谢。

【问题讨论】:

  • Perl 中没有类型转换。

标签: perl active-directory netldap


【解决方案1】:

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

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

去掉那个-&gt;dn,如果$act-&gt;entry(0)返回一个Net::LDAP::Entry,它应该可以工作。

【讨论】:

  • 谢谢!完全错过了 :) 删除 -&gt;dn 后代码现在可以工作了
  • @VivekBAhmed 有时会发生这种情况,需要退后一步或其他人才能看到问题。请查看How to Ask 了解如何接受解决您问题的答案。
猜你喜欢
  • 1970-01-01
  • 2018-07-01
  • 2021-11-01
  • 2013-10-14
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
相关资源
最近更新 更多