无法识别 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.
我们正在编写 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.