从Active目录中获取特定用户(非当前用户)域名

时间:2011-08-01 11:17:05

标签: c# asp.net .net active-directory

虽然我意识到网上有很多关于这个问题的资料,但这个问题似乎并不多。

我希望在C#中查询Active Directory,不仅可以获取用户名,还可以获取用户的域名。我不是在寻找当前用户或当前会话的域名。

原因是许多用户来自多个域,并且与通过U.I操纵用户凭据的管理员名称不同。

因此,当管理员添加用户时,我需要检查用户的域名并输入用户名之前的域名,例如域\用户名 由于添加的用户的域名可能不一定与之前添加的用户相同。

2 个答案:

答案 0 :(得分:1)

因此,域名的netbios名称是userPrincipalName中域名的第一个组成部分(例如brian@contoso.com是CONTOSO \ brian),这纯属巧合。绝对没有理由他们必须在AD中匹配。

获取用户域的netBIOS名称的位置来自该域的crossRef对象。为了做到这一点,你需要得到用户的distinguishedName的域部分(这是以DC =开头的字符串部分),然后使用这样的过滤器在配置NC中搜索匹配的crossRef :(&(objectClass) =交叉引用)(NCNAME =))。然后,您可以检查nETBIOSName属性。

要获取配置NC的DN以进行搜索,您可以向LDAP:// RootDSE询问configurationNamingContext属性。

答案 1 :(得分:0)

可能的解决方案是使用LDAP。这将允许您连接和查询不同的域。全名存储为userprincipal,例如username@domainname.com

对于给定的域名,您仍然需要知道要连接到哪个树。此外,除非域名在林中,否则如果您纯粹使用用户名搜索,则可能会获得重复的域用户名。

如果域位于林中,则可以使用快捷方式在林根上使用全局编录进行搜索。然后,您将在每个子域中进行搜索。这可能需要一段时间,具体取决于要搜索的树的大小。

修改

这些是用于检查我使用过的LDAP的一些代码片段。你应该能够将它们组合成有用的东西。

LdapConnection connection = new LdapConnection(new LdapDirectoryIdentifier(_Parser.Host, _Parser.Port));
connection.Bind(new System.Net.NetworkCredential(_Parser.Username, _Parser.Password));

x --- snip

request = new SearchRequest();
request.Filter = query;
request.Scope = SearchScope.Subtree;
request.DistinguishedName = _Parser.SearchBase;

response = (SearchResponse)connection2.SendRequest(request);

响应包含一系列结果,然后您可以枚举这些结果以查找您感兴趣的条目。

LDAP查询使用反向抛光表示法&amp;我认为你想要的是(samaccountname=<your value here>)替换你想要查找的用户名。你不需要引用这个值。

用一个字符串替换_Parser.SearchBase,该字符串是您要开始搜索的对象的dn。这可能是您的域根,例如dc = somedomain,dc = com,如果您的域名是somedomain.com host应该是您要连接的AD服务器的名称。使用3268作为端口,因为它是全局编录,因为它是只读的更快并具有所有分区。指定用于连接的用户名username@somedomain.com。

查找名为userprincipalname的属性。 msdn文档应该可以帮助您了解如何读取结果对象。

西蒙