Неожиданное поведение в LDAP-запросе, написанном на Perl

Я пытаюсь реализовать простой запрос LDAP в Perl. Я хочу получить атрибут 'dc' из всех объектов 'dnsZone' из домена. Сначала я написал его с помощью dsquery, и он отлично работает:

dsquery * "DC=iii,DC=hogent,DC=be" -attr dc -scope subtree -filter "(objectClass=dnsZone)"

Теперь, когда я пытаюсь реализовать это в Perl, я получаю следующую ошибку, когда просто запрашиваю атрибут 'dc'. Когда я запрашиваю атрибуты 'dc' и 'name' (которые выглядят одинаково), у меня нет проблем.

Исключение OLE из "ADODB.Fields":

Предмет не может быть найден в коллекции, соответствующей запрошенному имени или порядковому номеру.

Я думал в направлении кэша свойств, возможно, свойство еще не доступно. Но я не знаю, как мне обновить кэш свойств, используя запрос LDAP. Может быть, у него есть вариант getInfoEx([...], 0)?

my $rootDSE = bind_object('RootDSE');

my $base = bind_object($rootDSE->Get('defaultNamingContext'))->{ADsPath};
my $filter = "(objectClass=dnsZone)";
my $attrs = 'dc'; #No error when i change this into 'dc,name'
my $scope = 'subTree';

my $connection = Win32::OLE->CreateObject('ADODB.Connection');
   $connection->{Provider} = 'ADsDSOObject';
   $connection->Open();

my $command = Win32::OLE->CreateObject('ADODB.Command');
   $command->{ActiveConnection} = $connection;
   $command->{CommandText} = "<$base>;$filter;$attrs;$scope;";

my $resultSet = $command->Execute();

until($resultSet->{EOF}) {
    my $fields = $resultSet->{Fields};
    print $fields->{dc}->{Value}."\n";
    $resultSet->MoveNext();
}

Кто-то видит, что я делаю не так?

1 ответ

Проблема такого рода может возникать, если клиенту ldap не удается найти результаты, когда запрос соответствует одной записи (или более), которая не имеет ни одного из запрошенных атрибутов.

Удаление атрибутов из запроса и использование dc в качестве фильтра может помочь проверить, действительно ли вы находитесь в такой ситуации:

  • Удалить $attrs из запроса, запустите запрос и проверьте количество результатов.
  • сделать так, чтобы фильтр совпадал только с записями, имеющими dc: "(&(objectClass=dnsZone)(dc=*))"Запустите запрос (без $ attrs) и проверьте количество результатов.
  • сравнить результаты кол.

Если второй запрос приносит меньше результатов, чем предыдущий, это означает, что исходный запрос соответствует записям, которые не имеют dc (ошибка при запросе dc только без ошибок с обоими атрибутами).

Это также означает, что objectClass dnsZone не делает обязательным DomainComponent атрибут, как и следовало ожидать при использовании его в качестве фильтра для чтения DC.

Другие вопросы по тегам