当然,您可以在 System.DirectoryServices 中完成。
我认为你真正需要的是学习如何使用System.DirectoryServices。如果你还没有一本好书,我推荐this one。
这并不难,真的。你只需要掌握两个课程,DirectoryEntry 和DirectorySearcher。 DirectoryEntry 代表 LDAP 服务器上的一个 LDAP 对象。假设您有足够的权限,您可以对任何 LDAP 对象进行更改,包括使用DirectoryEntry 的联系人对象。每个 LDAP 对象都有许多属性。您需要知道的两个重要属性是objectCategory 和objectClass。对于联系人对象,objectCategory 应为 person,objectClass 应为 contact。您可能还想检查存储电子邮件地址的联系人对象上的“targetAddress”属性。联系人对象上有一堆 Exchange 扩展属性。您可能喜欢一一检查它们。要浏览 LDAP 服务器上的对象,可以使用 AD Explorer 或 ADSI Edit 之类的工具
要进行搜索,您需要向 DirectorySearcher 提供四件事。
- 搜索根
- LDAP 搜索过滤器
- 搜索范围
- 返回的属性
如果您的计算机已加入域,并且您正在以域用户身份登录,这里有一个示例,说明如何列出域中的所有联系人。
DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");
string domainContext = rootDSE.Properties["defaultNamingContext"].Value as string;
DirectoryEntry searchRoot = new DirectoryEntry("LDAP://" + domainContext);
using (DirectorySearcher searcher = new DirectorySearcher(
searchRoot,
"(&(objectCategory=person)(objectClass=contact))",
new string[] {"targetAddress"},
SearchScope.Subtree))
{
foreach (SearchResult result in searcher.FindAll())
{
foreach (string addr in result.Properties["targetAddress"])
{
Console.WriteLine(addr);
}
Console.WriteLine(result.Path);
}
}
前三行用于帮助您找到指向域根目录的正确 LDAP 路径。它仅在您以域用户身份登录时才有效。如果您知道域的正确 LDAP 路径,则可以直接将其输入 DirectoryEntry。
我将所有四个参数都放入DirectorySearcher。当您熟悉目录服务编程时,您可以跳过其中的一些,.NET 将为您提供一个默认值。
DiectorySearcher 返回的结果是SearchResult。请注意,SearchResult 总是向您返回一个对象集合,即使 targetAddress 不是多值属性。这是因为 LDAP 对象上的某些属性可能是多值的。
您可以从SearchResult 获得的另一个重要信息是Path。您可以稍后使用此路径创建一个DirectoryEntry 对象。要更新您的联系人对象,您需要使用其Properties 方法和CommitChanges 方法。
DirectoryEntry de = new DirectoryEntry(result.Path);
de.Properties["targetAddress"].Value = "SMTP:jane.doe@foo.bar";
de.CommitChanges();
最后,您实际上可以很容易地在DirectorySearcher 和DirectoryEntry 上找到很多在线教程。试试谷歌吧。