1

我正在尝试在 Perl 中实现一个简单的 LDAP 查询。我想从域中的所有“dnsZone”对象中检索“dc”属性。我首先使用 dsquery 编写它,它运行良好:

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

现在,当我尝试在 Perl 中实现这一点时,我在查询“dc”属性时收到以下错误。当我查询“dc”和“name”属性(看起来相同)时,我没有问题。

“ADODB.Fields”中的 OLE 异常:

在与请求的名称或序号对应的集合中找不到项目。

我在想属性缓存的方向,也许该属性还没有可用。但我不知道应该如何使用 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();
}

有人看到我做错了吗?

4

1 回答 1

0

当查询匹配一个(或多个)不具有任何请求属性的条目时,ldap 客户端无法查找结果可能会出现此类问题。

从查询中删除属性并使用 dc 作为过滤器可能有助于检查您是否处于这种情况:

  • 从查询中删除$attrs,运行查询并检查结果计数。
  • 使过滤器仅匹配具有 dc: 的条目"(&(objectClass=dnsZone)(dc=*))",运行查询(无 $attrs)并检查结果计数。
  • 比较结果计数。

如果第二个查询带来的结果比前一个少,这意味着原始查询匹配没有dc(仅请求时dc出错,两个属性都没有错误)的条目。

这也意味着 objectClassdnsZone不会DomainComponent像您在使用它作为过滤器来读取 dc 时所期望的那样强制该属性。

于 2015-12-29T20:54:04.870 回答