虽然我意识到网上有很多关于这个问题的资料,但这个问题似乎并不多。
我希望在C#中查询Active Directory,不仅可以获取用户名,还可以获取用户的域名。我不是在寻找当前用户或当前会话的域名。
原因是许多用户来自多个域,并且与通过U.I操纵用户凭据的管理员名称不同。
因此,当管理员添加用户时,我需要检查用户的域名并输入用户名之前的域名,例如域\用户名 由于添加的用户的域名可能不一定与之前添加的用户相同。
答案 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文档应该可以帮助您了解如何读取结果对象。
西蒙