4

すべての AD ユーザー名 (1,500 を超える) のリストがあり、そのリストに含まれるすべてのユーザーの電子メール アドレスを取得する最良の方法を知りたいです。

具体的には、呼び出してユーザー名のリストを提供し、メソッドに、最初のリストで提供されたすべてのユーザー名の電子メール アドレスを含む同じサイズのリストを返すメソッドを作成します。

http://lozanotek.com/blog/articles/149.aspxに示すように、従来の LDAP の方法を使用して電子メール アドレスを取得する方法は既に知っています。Foreach を使用できることはわかっていますが、より効率的な方法を探しています。 AD に 1,500 回以上クエリを実行することなく、1,500 を超える電子メール アドレスを取得する方法。

4

3 に答える 3

2

ねえ私は同じものを探していました、そしてこれは私のために働きました:http: //forums.asp.net/t/1610245.aspx/1

于 2013-01-02T17:38:54.947 に答える
0

以下でこのコードを使用しましたが、これはSrinivasが話しているのと同じコードであることがわかりました。

DirectoryEntry entry = new DirectoryEntry("LDAP://YourDomain"); 
DirectorySearcher dSearch = new DirectorySearcher(entry); 
dSearch.Filter = "(objectClass=user)"; 
foreach (SearchResult sResultSet in dSearch.FindAll()) 
{ 
    if (sResultSet.Properties["mail"].Count > 0) 
        Response.Write(sResultSet.Properties["mail"][0].ToString() + "<br/>"); 
}
于 2013-01-02T18:01:10.603 に答える
0

リンクのメソッドを使用すると、AD を 1500 回クエリするのではなく、1500 人のユーザーすべてをオブジェクトとして返す 1 つのクエリを実行することになります。次に foreach ループを使用して、各オブジェクトを繰り返し処理し、ユーザーの電子メールを取得します。

AD を 1500 回クエリする例は、すべてのユーザー名の ArrayList があり、次の (疑似コード) を実行した場合です。

ArrayList UserNames = new ArrayList();
Foreach(string name in UserNames)
{
   //Query AD to get email of user by passing in name
}

これを高速化する 1 つの方法は、マルチスレッドを追加し、各スレッドが AD への異なるクエリを同時に処理するようにすることです。たとえば、クエリにフィルターを追加して、A で始まる名前のみを返し、1 つのスレッドがそれを処理し、別のスレッドが B で始まる名前を処理するようにすることができます。これには、AD へのクエリがさらに必要になりますが (アルファベットの各文字に対して 26、1)、返されたデータを並行して処理できます。

非常に古いドメイン コントローラーを使用していない限り、AD に負荷がかかることを心配する必要はありません。私はすべての AD (ユーザー、グループ、コンピューター、およびそれらの間の関係) を毎晩データベースにキャッシュしており、8000 人を超えるユーザーがいます。これを行うのは、AD への呼び出しが遅くなる傾向があり、ユーザーが永遠に待たされることなくグループ メンバーシップ情報を Web ページから利用できるようにするためです。このキャッシングにより、AD に対して 1 分間に数千回の呼び出しが行われますが、これは 3 時間の実行時間の間、私の会社のワークフローを妨げることはありません。

更新:
申し訳ありませんが、あなたの質問をすぐに読んで、すべての名前のリストを使用してメソッドを試みていることを見逃しました. 前に述べたようにマルチスレッド方式を使用できますが、処理する各ユーザー名を別のスレッドに渡す (制御不能にならないようにスレッドの数を制限する!!) か、1 つのクエリを使用してすべてを取得することができます。 foreach ループ内のリストにユーザーが存在するかどうかを確認します。バイナリ ツリーまたは別の並べ替えられたコレクションを使用してリストを簡単に走査できるようにすることで、ユーザーが存在するかどうかをすばやく確認できます。リストからユーザーを削除することもできます。これは、その後の検索を高速化することが判明したためです。

于 2013-01-02T17:49:34.807 に答える