C# LDAPConnection按NT帐户检索用户

C# LDAPConnection按NT帐户检索用户,c#,C#,我正在使用System.DirectoryServices.Protocols库查询Active Directory。我有一个用例,需要从服务器检索以用户的NT帐户名(即:NETBIOSDomainName\UserSamAccountName)开头的用户条目。这是我正在使用的代码: LdapConnection connection = new LdapConnection(userDomain); NTAccount userAccount = new NTAccount(userDomai

我正在使用
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存在于多个域中

有什么方法可以避免我使用的这种黑客攻击吗


请注意,我必须使用这个特定的库。

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

目录服务将允许您轻松地将域设置为查找的一部分。下面的示例返回可用于获取用户帐户的所有详细信息。检查
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;
}

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

范例

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

谢谢你的意见!不幸的是,AccountManagement还有其他问题:具体来说,包含外部SID的组的组扩展会导致库抛出异常。您的代码当然可以工作,但我真的希望有一种方法可以完全使用这个库来完成。(它们在两个不同的DLL中,我希望最终能够完全摆脱第二个DLL。)上面代码中的userDomain字符串应该将其限制在该域。用户域将搜索范围限制为当前林,而不是域。在我的例子中,如果同一个组存在于同一个林中的3个域中,那么我会得到3个条目,每个域一个条目。我在响应条目的可分辨名称中表达了域信息,但问题是NETBiosName和可分辨名称组件并不总是匹配。好的,但问题是如何从NETBiosName轻松获取“DC=mydc,DC=com”。如果我可以这样做,我就可以查询这个字符串的结果条目的可分辨名称。