Mic*_*tum 7 c# active-directory
我可能只是愚蠢,但我正在尝试使用登录名("域\用户")从C#中找到Active Directory中的用户.
我的"Skeleton"AD搜索功能通常如下所示:
de = new DirectoryEntry(string.Format("LDAP://{0}", ADSearchBase), null, null, AuthenticationTypes.Secure);
ds = new DirectorySearcher(de);
ds.SearchScope = SearchScope.Subtree;
ds.PropertiesToLoad.Add("directReports");
ds.PageSize = 10;
ds.ServerPageTimeLimit = TimeSpan.FromSeconds(2);
SearchResult sr = ds.FindOne();
Run Code Online (Sandbox Code Playgroud)
现在,如果我有用户的完整DN(ADSearchBase通常指向Active Directory中的"我们的用户"OU),那就有效,但我根本不知道如何根据"domain\user"语法查找用户.
任何指针?
您需要设置一个过滤器(DirectorySearcher.Filter),如:
"(&(objectCategory =人)(objectClass的=用户)(sAMAccountName赋= {0}))"
请注意,您只为属性sAMAccountName指定用户名(不包含域).要搜索domain\user,首先找到所需域的命名上下文,然后在那里搜索sAMAccountName.
顺便说一句,在使用String.Format构建LDAP查询字符串时,通常应该小心转义任何特殊字符.它可能不是一个帐户名称,但如果您正在搜索其他属性,例如用户的第一个(givenName属性)或最后一个(sn属性)名称.我有一个实用方法EscapeFilterLiteral来做到这一点:你像这样构建你的字符串:
String.Format("(&(objectCategory=person)(objectClass=user)(sn={0}))",
EscapeFilterLiteral(lastName, false));
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
此实现允许您将*字符视为文字的一部分(escapeWildcard = true)或通配符(escapeWildcard = false).
更新:这与您的问题无关,但您发布的示例并未在其使用的一次性对象上调用Dispose.与所有一次性对象一样,这些对象(DirectoryEntry,DirectorySearcher,SearchResultCollection)应始终使用using语句进行处理.有关详细信息,请参阅此帖子.
| 归档时间: |
|
| 查看次数: |
14192 次 |
| 最近记录: |