Of course, you can do it in System.DirectoryServices.
I think what you really need is to learn how to use System.DirectoryServices. If you don't have a good book yet, I recommend this one.
It's not that hard, really. You just need to master two classes, DirectoryEntry and DirectorySearcher. DirectoryEntry is representing a LDAP object on the LDAP server. Assuming you have sufficient permissions, you can make changes on any LDAP object, including the contact object using DirectoryEntry. Each LDAP object has a number of attributes. TWo important attributes you need to know are objectCategory
and objectClass
. For the contact object, the objectCategory
should be person
and objectClass
should be contact
. You may also like to check the "targetAddress" attribute on the contact object, which stores the email address. There are a bunch of Exchange extended attributes on contact object. You probably like to check each of them one by one. To browse the objects on LDAP server, you can use a tool like AD Explorer or ADSI Edit
To do a search, you need to provider four things to DirectorySearcher.
- Search root
- LDAP search filter
- Search Scope
- Returned attributes
If your machine is already joined to a domain and you are logging in as a domain user, here is a sample on how to list out all contacts in your domain.
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);
}
}
The first three lines are to help you to find the correct LDAP path to the root of your domain. It works only if you are logging in as a domain user. If you know the correct LDAP path of your domain, you can just feed it into DirectoryEntry directly.
I put all four parameters into DirectorySearcher. When you are getting familiar with Directory Services programming, you can skip some of them and .NET will provide a default value for you.
The result returned from DiectorySearcher is SearchResult. Note that SearchResult always return a collection of objects to you even though targetAddress
is not a multivalue attribute. It's because some of the attributes on the LDAP object may be multi-value.
Another important information you can get from SearchResult is the Path
. You can create a DirectoryEntry object using this Path later. To update your contact object, you need to use its Properties
method and CommitChanges
method.
DirectoryEntry de = new DirectoryEntry(result.Path);
de.Properties["targetAddress"].Value = "SMTP:[email protected]";
de.CommitChanges();
Finally, you can actually easily find a lot of online tutorial on both DirectorySearcher and DirectoryEntry. Try google it.