Вам нужно установить фильтр (DirectorySearcher.Filter) примерно так:
"(& (ObjectCategory = человек) (объектный = пользователь) (SamAccountName = {0}))"
Обратите внимание, что вы указываете только имя пользователя (без домена) для свойства sAMAccountName. Чтобы найти домен \ пользователь, сначала найдите контекст именования для нужного домена, а затем найдите sAMAccountName.
Кстати, при построении строк запроса LDAP с использованием String.Format, как правило, следует избегать использования любых специальных символов. Вероятно, это не обязательно для имени учетной записи, но может быть, если вы ищете по другим свойствам, таким как имя пользователя (свойство 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. См. этот пост для получения дополнительной информации.