如何测试是否找到了搜索结果?

时间:2011-02-03 13:22:05

标签: perl active-directory ldap

我执行此搜索,其中$_可以是组或用户的DN。

my $m = $ldap->search(
  base => "$_", 
  scope => 'base',
  filter => '(objectClass=Person)',
  attrs => ['sAMAccountName'], 
  );

if (defined($m->entry->entries->get_value('sAMAccountName'))) {
  print $m->entry->entries->get_value('sAMAccountName') . "\n";
}

这个问题是,如果$_是一个组,则sAMAccountName不存在,并且脚本失败。我甚至不确定这是否适用于用户=(

如果sAMAccountName是一个人,是否有人知道如何仅打印$_

2 个答案:

答案 0 :(得分:2)

迭代搜索对象的条目。如果该属性不存在,它将是undef(当然),但不会导致失败,因为我们不会尝试取消引用它的方法调用。

foreach my $entry ($m->entries) {
    my ($uid, $sAMAccountName) = (
        $entry->get_value('uid'),
        $entry->get_value('sAMAccountName'),
    );
}

答案 1 :(得分:0)

因为您的过滤器是:

(objectClass=Person)

然后,当$ _是一个组时,您将不会检索任何条目。

因此,请查看$m->entries()是否为空,而不是那个可怕的定义()调用。

示例:

my $m = $ldap->search(
  base => "$_", 
  scope => 'base',
  filter => '(objectClass=Person)',
  attrs => ['sAMAccountName'], 
  );

my @entries = $m->entries();

if (@entries) {
  print $m->entry->entries->get_value('sAMAccountName') . "\n";
}