2009-09-04 18 views
1

私は、ユーザーのSIDからユーザーのActive DirectoryのDirectoryEntryオブジェクトをロードし、次のコードを持っている:ユーザーのDirectoryEntryをロードする最も効率的な方法は何ですか?

public static DirectoryEntry GetUserDirectoryEntry(SecurityIdentifier sid) 
{ 
    return new DirectoryEntry(string.Format("LDAP://<SID={0}>", sid.Value)); 
} 

これを行うには、より効率的な方法はありますか?パフォーマンスの問題からコードを最適化する必要があります。できるだけ速いコードに絞る必要があります。必ずしもSIDからロードする必要はありません。私は、ユーザーDirectoryEntryを取得する最も効率的な方法を知る必要があります。

編集:私は.Net 2.0を使用することに制限されています。

答えて

1

私はそれはあなたがあなたのDirectoryEntryをロードする方法に大きな違いをもたらすとは思わない - SIDによって、または完全修飾DNによるかどうか - それはちょうど

それを動作するようにADのバインド操作のための時間の設定量を要しますバインドは実際にDirectoryEntryをインスタンス化するときには発生しません。DirectoryEntryでプロパティを使用するか、.NativeObjectプロパティにアクセスするまで遅延します。

どのようにしても、一意に識別する値に基づいてDirectoryEntryを作成するだけで時間がかかります。

マルク・

1

フィルタをさらに定義し、条件にタイプを指定するようにしてください。

+0

はを見てください。ディレクトリサーチャークラスを使用する方が効率的だと言っていますか? –

+0

検索で私はLDAP照会(ADを検索)を使用していることを意味しました。実行するすべてのLDAPクエリは検索としてカウントされます。 –

2

ディレクトリ内のオブジェクトにアクセスする手段にかかわらず、ディレクトリ操作はかなり遅いです。より多くの文脈がなければ、より効率的なアプローチを推奨することは難しいですが、一般的には、一度に複数のユーザーを集めてマルチスレッド化し、問題を回避するためにキャッシュすることを考えましたか?

さらに効率的だとは言えませんが、.NET 3.5では新しいSystem.DirectoryServices.AccountManagement名前空間を試しましたか?誰でもが最適化されていれば、それはマイクロソフトだが、私たちは以前に全力を失ったと思う。

+0

私は、.Net 2.0の使用に制限されていると付け加えて、質問を編集しました。また、私は一度に1人のユーザーを引き出すだけでいいです。 –

1

どうSystem.DirectoryServices.Protocols名前空間について。 ADSIを使用するオーバーヘッドはなく、はるかに高速でなければなりません。最初は扱いにくいようですが、それに慣れるとそれほど悪くありません。さらに、適切な非同期検索を実行できます。私は、検索をしていないよ

関連する問題