我一直在尝试使用perl中的modify()函数修改ldap中的条目,但是我一直从ldap获取错误代码17,表明修改或添加操作中指定的属性在LDAP服务器的模式中不存在。我很困惑,因为我确信它存在于模式中。
我的代码中的search()返回一个用于我传入函数的msisdn的User objectClass,该对象还包含IndividualContextIdList,这是一个多值对象,在我的例子中有两个值300& 301.我传入的身份证持有302。
我的代码看起来像这样,
sub activate
{
my ($ldap, $msisdn, $id) = @_;
my $result = search($ldap,$record{'dn'},"(&(objectClass=User) (Msisdn=${msisdn}))",$record{'attrs'});
my @entries = $result->entries;
if ( $result->count != 1 ) {
exitError(1, "Subscriber not found");
return;
}
my $dn = $entries[0]->dn;
my $default = "";
my @contextIdListArray = ();
foreach my $entr ( @entries ) {
foreach my $attr ( sort $entr->attributes ) {
# skip binary we can't handle
next if ( $attr =~ /;binary$/ );
# get the key value
my $value = $entr->get_value($attr);
if ($attr =~ /^IndividualDefaultContextId/) {
$default = $value;
}
if ($attr =~ /^IndividualContextIdList/) {
push @contextIdListArray, $entr->get_value($attr);
}
}
}
if ($default eq '') {
$default = $id;
}
push @contextIdListArray, $id;
# what do we want to change
my %whatToChange = ('IndividualContextIdList' => @contextIdListArray, 'IndividualDefaultContextId' => $default);
# time to modify entry
my $res = $ldap->modify ( $dn, replace => { %whatToChange });
if ($res->code != 0) {
exitError($res->code, $res->error.". Modifying ${msisdn}.");
return;
} else {
xmlSuccessSetResponse();
}
return;
}
如果我像这样创建我的%whatToChange,那么修改条目没有问题,
my %whatToChange = ('IndividualContextIdList' => ["300", "301"], 'IndividualDefaultContextId' => "300");
这是我调用modify(),
时遇到的格式化错误<?xml version='1.0' encoding='ISO-8859-1'?>
<webservices>
<method>activate</method>
<response>
<responsecode>17</responsecode>
<responsestring>301: attribute type undefined. Modifying 3548520509.</responsestring>
</response>
</webservices>
到目前为止,我的谷歌搜索没有向我提供任何答案。
非常感谢任何帮助。