用Perl

时间:2015-12-28 13:57:17

标签: perl active-directory ldap ldap-query perlscript

我正在尝试在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();
}

有人看到我做错了吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

如果第二个查询带来的结果少于前一个查询,则表示原始查询与没有dc的条目匹配(仅在请求dc时出错,两个属性都没有错误)。

这也意味着objectClass dnsZone不会强制使用DomainComponent属性,因为在将其用作读取dc的过滤器时可能会如此。