次のようなフィルタ(DirectorySearcher.Filter)を設定する必要があります。
"(&(objectCategory = person)(objectClass = user)(sAMAccountName = {0}))"
プロパティsAMAccountNameにはユーザー名(ドメインなし)のみを指定することに注意してください。domain \ userを検索するには、最初に必要なドメインの名前付けコンテキストを見つけてから、そこでsAMAccountNameを検索します。
ちなみに、String.Formatを使用してLDAPクエリ文字列を作成する場合は、通常、特殊文字をエスケープするように注意する必要があります。アカウント名はおそらく必要ありませんが、ユーザーの名(givenNameプロパティ)や姓(snプロパティ)などの他のプロパティで検索している場合は必要になる可能性があります。これを行うためのユーティリティメソッドEscapeFilterLiteralがあります。次のように文字列を作成します。
String.Format("(&(objectCategory=person)(objectClass=user)(sn={0}))",
EscapeFilterLiteral(lastName, false));
ここで、EscapeFilterLiteralは次のように実装されます。
public static string EscapeFilterLiteral(string literal, bool escapeWildcards)
{
if (literal == null) throw new ArgumentNullException("literal");
literal = literal.Replace("\\", "\\5c");
literal = literal.Replace("(", "\\28");
literal = literal.Replace(")", "\\29");
literal = literal.Replace("\0", "\\00");
literal = literal.Replace("/", "\\2f");
if (escapeWildcards) literal = literal.Replace("*", "\\2a");
return literal;
}
この実装では、*文字をリテラルの一部(escapeWildcard = true)またはワイルドカード文字(escapeWildcard = false)として扱うことができます。
更新:これはあなたの質問とは何の関係もありませんが、あなたが投稿した例では、使用する使い捨てオブジェクトの廃棄を呼び出していません。すべての使い捨てオブジェクトと同様に、これらのオブジェクト(DirectoryEntry、DirectorySearcher、SearchResultCollection)は、通常はusingステートメントを使用して常に破棄する必要があります。詳細については、この投稿を参照してください。