一个可能的解决方案是使用 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.com
host 应该是您要连接的 AD 服务器的名称。使用 3268 作为端口,因为它是全局目录,因为它是只读的,所以速度更快并且具有所有分区。将您用于连接的用户名指定为 username@somedomain.com。
查找名为 userprincipalname 的属性。 msdn 文档应该可以帮助您了解如何读取结果对象。
西蒙