LDAPConnection按NT帐户检索用户

时间:2014-07-29 19:07:46

标签: c#

我正在使用System.DirectoryServices.Protocols库来查询Active Directory。我有一个用例,我需要从用户的NT帐户名称(即:NETBIOSDomainName \ UserSamAccountName)开始从服务器检索用户条目。这是我正在使用的代码:

LdapConnection connection = new LdapConnection(userDomain);
NTAccount userAccount = new NTAccount(userDomain, username);
sid = userAccount.Translate(typeof(SecurityIdentifier));

SearchRequest searchRequest = new SearchRequest
{
    Scope = SearchScope.Subtree,
    Filter = string.Format("(&(objectClass=user)(objectsid={0}))", sid)
};

SearchOptionsControl searchOptions = new SearchOptionsControl(SearchOption.PhantomRoot);
searchRequest.Controls.Add(searchOptions);

SearchResponse response = (SearchResponse)connection.SendRequest(searchRequest);

我遇到的问题是我不知道如何在搜索中包含NetBIOSDomainName。如果我只是通过用户的samAccountName进行搜索,我有时会在响应中获得多个条目,因为多个域中存在相同的SAMAccountName。

有没有办法避免我正在使用的这个黑客?

请注意,我必须使用此特定库。

2 个答案:

答案 0 :(得分:1)

如果您要查询ActiveDirectory,请使用DirectoryServices。添加对System.DirectoryServices.AccountManagement dll的引用,然后您可以使用如下所示的示例。

目录服务允许您轻松地将域设置为查找的一部分。以下示例返回UserPrincipal,可用于获取有关用户帐户的所有详细信息。查看UserPrincipalusing System.DirectoryServices.AccountManagement; public UserPrincipal FindUser(string username, string domain) { var context = new PrincipalContext(ContextType.Domain, domain); var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username); // user will be null if not found // Remember to dispose UserPrincipal once done working with it. return user; } 所有可用属性的msdn

{{1}}

答案 1 :(得分:0)

您可以使用的SearchRequest构造函数重载 - msdn link,您需要设置第一个参数以将其限制为该域

例如

SearchRequest request = new SearchRequest("DC=mydc,DC=com", sFilter, SearchScope.Subtree);