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