4

私のアプリケーションの 1 つで、Active Directory にクエリを実行して、特定のユーザーの下にあるすべてのユーザーのリストを取得しています (「直属の部下」を使用しています)。したがって、基本的には、人物の名前が与えられると、AD で検索され、直属の部下が読み取られます。ただし、直属の部下ごとに、ツールは直属の部下の直属の部下をチェックする必要があります。または、より抽象的な: ツールは、人物をツリーのルートとして使用し、ツリー全体をたどってすべての葉 (数百になる場合もあります) の名前を取得します。

さて、これはかなりの回数実行する必要があるため、私の懸念は明らかにパフォーマンスです。私の考えは、それを手動でキャッシュすることです(基本的に、すべての名前を長い文字列に入れてどこかに保存し、1日に1回更新します)。

しかし、おそらく System.DirectoryServices 名前空間の何かを使用して、最初に情報を取得してからキャッシュするよりエレガントな方法があるのではないかと思います。

4

4 に答える 4

3

キャッシュしたいプロパティを制御するには、「RefreshCache()」を呼び出して、ぶらぶらしたいプロパティを渡すことができます。

System.DirectoryServices.DirectoryEntry entry = new System.DirectoryServices.DirectoryEntry();               

// Push the property values from AD back to cache.

entry.RefreshCache(new string[] {"cn", "www" });
于 2008-09-02T09:26:14.133 に答える
2

AD はその種のキャッシュを行うので、パフォーマンスが問題にならない限り、心配する必要はありません。私は、1 時間あたり何千ものヒットを処理する企業イントラネットで、この種のことを 1 日中実行しているソフトウェアを使用しており、この領域でパフォーマンスを調整する必要はありませんでした。

于 2008-08-31T09:46:56.720 に答える
2

情報をどの程度最新にするかによって異なります。レポートに最新のデータが必要な場合は、AD から直接クエリを実行するのが合理的です。また、AD が非常に堅牢であることにも同意します。一般的な専用 AD サーバーは、実際には通常の日常業務ではほとんど使用されませんが、IT 部門やサポート担当者に確認することをお勧めします。

別の方法は、AD データを CSV ファイルにダンプしたり、SQL データベースにインポートしたりするための毎日のスクリプトを用意することです。(Oracle には、結果セット内に複数レベルの階層を自動的に作成できる SELECT CONNECT BY 機能があります。MSSQL は、少し再帰 IIRC を使用して同様のことを行うことができます)。

于 2008-09-02T09:35:08.153 に答える
2

Active Directory は情報の格納において非常に効率的であり、取得によるパフォーマンスへの影響はそれほど大きくありません。名前を保存することに真剣に取り組んでいる場合は、すべての人の関係を確認できるように、ある種のツリー構造に名前を保存することをお勧めします。人数によっては、必要なすべての情報を毎日取得してから、キャッシュされたコピーに対してすべてのリクエストをクエリすることもできます。

于 2008-08-28T20:23:47.303 に答える