您需要设置一个过滤器(DirectorySearcher.Filter),例如:
“(&(objectCategory=person)(objectClass=user)(sAMAccountName={0}))”
请注意,您只为属性 sAMAccountName 指定用户名(不包括域)。要搜索域\用户,首先找到所需域的命名上下文,然后在那里搜索 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)。
更新:这与您的问题无关,但您发布的示例并未在其使用的一次性对象上调用 Dispose。与所有一次性对象一样,这些对象(DirectoryEntry、DirectorySearcher、SearchResultCollection)应始终被处置,通常使用 using 语句。有关更多信息,请参阅此帖子。