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

この種の問題は、要求された属性のいずれも持たない 1 つ (または複数) のエントリにクエリが一致する場合に、LDAP クライアントが結果のルックアップに失敗することで発生する可能性があります。

クエリから属性を削除し、dc をフィルターとして使用すると、その状況にあるかどうかを確認するのに役立つ場合があります。

  • クエリから削除$attrsし、クエリを実行して結果数を確認します。
  • フィルターを dc: を持つエントリのみに一致さ"(&(objectClass=dnsZone)(dc=*))"せ、クエリを実行し ($attrs なし)、結果の数を確認します。
  • 結果数を比較します。

2 番目のクエリが前のクエリよりも少ない結果をもたらす場合、元のクエリがエントリを持たないエントリと一致することを意味しますdc(要求した場合dcのみエラー、両方の属性でエラーはありません)。

これは、 dc を読み取るためのフィルターとして使用する場合に予想されるように、objectClassが属性dnsZoneを必須にしないことも意味します。DomainComponent

于 2015-12-29T20:54:04.870 に答える