我正在尝试在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();
}
有人看到我做错了吗?
答案 0 :(得分:0)
当查询匹配一个(或更多)任何所请求属性的条目时,ldap客户端无法查找结果时,可能会发生此类问题。
从查询中删除属性并使用dc作为过滤器可能有助于检查您是否处于这种情况:
$attrs
,运行查询并检查结果计数。 "(&(objectClass=dnsZone)(dc=*))"
的条目,运行查询(无$ attrs)并检查结果计数。如果第二个查询带来的结果少于前一个查询,则表示原始查询与没有dc
的条目匹配(仅在请求dc
时出错,两个属性都没有错误)。
这也意味着objectClass dnsZone
不会强制使用DomainComponent
属性,因为在将其用作读取dc的过滤器时可能会如此。