从Active directory获取指定用户(非当前用户)域名



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

我希望在c#中查询活动目录,不仅可以获得用户名,还可以获得用户的域名。我不是在寻找当前用户或当前会话的域名。

这样做的原因是许多用户将来自多个域,并且不会与通过ui操纵用户凭据的管理员同名。

所以当管理员添加用户时,我需要检查用户的域名并在用户名之前输入,例如domain username因为添加的用户的域名可能不一定与之前添加的用户相同。

因此,域名的netbios名称是userPrincipalName中域名的第一个组件(例如brian@contoso.com是CONTOSObrian)纯粹是巧合。它们绝对没有理由必须在AD中匹配。

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

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

一个可能的解决方案是使用LDAP。这将允许您连接和查询不同的域。全名存储为用户主体,例如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,剪断

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

响应包含一个结果集合,然后您可以枚举以找到您感兴趣的条目。

LDAP查询使用反向波兰符号&我认为你想要的是(samaccountname=<your value here>)替换为你想要寻找的用户名。你不需要引用值

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

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

西蒙

最新更新