1

AD で次のクエリを使用して、ユーザーのメール アドレスを取得しています。

// get a DirectorySearcher object
         DirectorySearcher search = new DirectorySearcher();

         // specify the search filter
         search.Filter = "(&(objectClass=user)(anr=" + login + "))";

         // specify which property values to return in the search
         search.PropertiesToLoad.Add("mail");        // smtp mail address

         // perform the search
         SearchResult result = search.FindOne();

         if (result != null)
         {

             return result.Properties["mail"][0].ToString();
         }
         else
         {

             return null;
         }

ログインが「SRB」である特定のユーザーの場合、クエリは「SRB-PC」と呼ばれるコンピューター オブジェクトを返します。

フィルターがobjectClassを「ユーザー」にする必要があると言っている理由がわかりません。

また、「like」クエリのように戻すのはなぜですか。名前がフィルターと完全に一致するオブジェクトのみを戻す必要があります。

4

3 に答える 3

2

オブジェクトは、 Active Directory 内のオブジェクトのComputerサブクラスです。Userこれが、元の検索でコンピュータを見つける理由です。

このobjectCategory要素は、エンティティを適切に区別するために使用されます:-

オブジェクト クラスとオブジェクト カテゴリのページに記載されているとおり:

Windows Server 2008 より前では、objectClass 属性はインデックス化されていません。これは、複数の値があり、非常に一意でないためです。つまり、objectClass 属性のすべてのインスタンスに最上位クラスが含まれます。これは、インデックスが非常に大きくなり、効果がないことを意味します。特定のクラスのオブジェクトを見つけるには、単一値でインデックス付きの objectCategory 属性を使用します。これらのプロパティを検索フィルターで使用する方法の詳細については、検索対象の決定を参照してください。

したがって、objectClass の代わりに objectCategory を使用して検索する方がはるかに効率的です。

于 2013-07-05T10:04:28.113 に答える
1

OK - フィルターを次のように切り替えました:

search.Filter = string.Format("(&(objectCategory=Person)(anr={0}))", login);

なぜそれが修正されたのかよくわかりませんが、修正されました!

于 2013-07-05T09:15:41.530 に答える