質問

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

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

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

役に立ちましたか?

解決

キャッシュしたいプロパティを制御するには、「RefreshCache()」を呼び出して、保持したいプロパティを渡します。

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

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

entry.RefreshCache(new string[] {"cn", "www" });

他のヒント

Active Directory は情報の保存において非常に効率的であり、取得によってパフォーマンスがそれほど低下することはありません。本当に名前を保存したい場合は、名前を何らかのツリー構造に保存して、すべての人々の関係を確認できるようにする必要があるでしょう。人数に応じて、毎日必要な情報をすべて取得し、キャッシュされたコピーに対してすべてのリクエストをクエリすることもできます。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top