2

AD システムでユーザーのクエリを実行する必要があるイントラネットがあります。DirectoryEntry() オブジェクトを使用して接続し、DirectorySearcher() をセットアップしてユーザーを検索しようとしています。最も基本的なものに要約すると、私のコードは次のようになります。

DirectoryEntry directoryObject = new DirectoryEntry("LDAP://RD-HQ/CN=Users,DC=rd-hq,DC=local");
DirectorySearcher ds = new DirectorySearcher(directoryObject);
ds.Filter = ("(&(objectClass=user))");
var test = ds.FindAll();
foreach (SearchResult item in test)
{
}

奇妙なことに、System.DirectoryServices DLL の .NET4.0 バージョンを参照すると、これは私の開発マシンでは機能しますが、.NET3.5 (System.DirectoryServices DLL のバージョンは v2.0.0.0) では機能しません。

私が得る特定のエラーはds.FindAll()メソッドにあり、次のようになります。

例外の詳細: System.DirectoryServices.DirectoryServicesCOMException: 操作エラーが発生しました。

コードをステップ実行すると、directoryObjectオブジェクトが実際には最初の行で正しく初期化されていないことがわかります。コンストラクターは失敗しませんが、すべてのプロパティが例外をスローしています。

私が間違っているかもしれないアイデアはありますか?ありがとう、これはちょっとくだらない、漠然とした質問だと思います。


解決した

OK、ユーザー名とパスワードを受け入れる DirectoryEntry() コンストラクターのオーバーロードを使用して、これを修正できました。

DirectoryEntry directoryObject = new DirectoryEntry("LDAP://RD-HQ/CN=Users,DC=rd-hq,DC=local", "rd-hq.local\mick", "notmypassword");

これが.NET3.5バージョンと.NET4.0バージョンで異なる動作をする理由はまだわかりません.少なくともこのことをよりよく理解するのに役立つ答えを正しいものとして喜んでマークします.

4

1 に答える 1

4

コンストラクターは失敗しませんが、すべてのプロパティが例外をスローしています。

関連するプロパティの 1 つにアクセスすると、DirectoryEntryインスタンスはディレクトリへのバインドを試みます。これが失敗すると、プロパティ アクセサーは例外をスローします。これは、デバッガーからプロパティを表示しようとした場合にも発生します。

ds.FindAll()上記のコードでは、が呼び出されたときにバインドが発生します。

明らかに、ディレクトリへのバインドに問題があります。

.NET Framework のバージョンが違いを生むとは信じがたいです。.NET 3.5 および .NET 4 バージョンで同一のコードと同一の環境を使用している最小限のサンプルにコードを削除します。

「操作エラーが発生しました」というエラー メッセージは一般的なものですが、ディレクトリにアクセスする権限がない場合に発生する可能性があります。そのため、.NET 3.5 と .NET 4 のバージョンが異なる ID で実行されている可能性があります。少なくとも、それがこの同様の問題の原因であると思われます。

DirectoryCOMException によって返される ErrorCode も手がかりになる場合があります。

于 2012-09-12T07:53:55.193 に答える