我正在使用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。
有没有办法避免我正在使用的这个黑客?
请注意,我必须使用此特定库。
答案 0 :(得分:1)
如果您要查询ActiveDirectory,请使用DirectoryServices。添加对System.DirectoryServices.AccountManagement dll的引用,然后您可以使用如下所示的示例。
目录服务允许您轻松地将域设置为查找的一部分。以下示例返回UserPrincipal,可用于获取有关用户帐户的所有详细信息。查看UserPrincipal
上using 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);