Add contact to distribution list programmatically

2019-08-07 11:38发布

问题:

I am really stuck in this issue and searching didn't yield me a lot. Most answers I found either get Contacts not add them or use LDAP.

The best I've been able to do is display the window where you add people to the distribution list but I am not able to do that part programmatically

Here is the my best attempt:

Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application();
NameSpace oNS = oApp.GetNamespace("MAPI");
//Get Global Address List.
AddressLists oDLs = oNS.AddressLists;
AddressList oGal = oDLs["Global Address List"];
AddressEntries oEntries = oGal.AddressEntries;
AddressEntry oDL = oEntries["MyDistributionList"];

//Get Specific Person
SelectNamesDialog snd = oApp.Session.GetSelectNamesDialog();
snd.NumberOfRecipientSelectors = OlRecipientSelectors.olShowTo;
snd.ToLabel = "D/L";
snd.ShowOnlyInitialAddressList = true;
snd.AllowMultipleSelection = false;
//snd.Display();
AddressEntry addrEntry = oDL;
if (addrEntry.AddressEntryUserType == Microsoft.Office.Interop.Outlook.OlAddressEntryUserType.olExchangeDistributionListAddressEntry)
{
    ExchangeDistributionList exchDL = addrEntry.GetExchangeDistributionList();
    AddressEntries addrEntries = exchDL.GetExchangeDistributionListMembers();

    string name = "John Doe";
    string address = "John.Doe@MyCompany.com";
    exchDL.GetExchangeDistributionListMembers().Add(OlAddressEntryUserType.olExchangeUserAddressEntry.ToString(), name, address);
    exchDL.Update(Missing.Value);
}

Using this i can access the Distribution List but I get "The bookmark is not valid" exception on the

exchDL.GetExchangeDistributionListMembers().Add(OlAddressEntryUserType.olExchangeUserAddressEntry.ToString(), name, address);

line.

I have access on said list.

EDIT:

回答1:

The thing is that when you use the Outlook API, you use its functionality as a user, not as an admin.
More than that, you can only do things that you can do through Outlook UI.

Outlook doesn't allow you to modify distribution lists, so you won't be able to do it using the outlook API.

There are 2 possible ways to do it:

  1. Use the NetApi functions NetGroupAddUser or NetLocalGroupAddMembers, depending on whether the group is a local or global group. This will require importing those functions with P/Invoke and won't work on universal groups.

2. Use LDAP to find the group you need, and add the users you want to it. This can be done using the System.DirectoryServices namespace like this:

using(DirectoryEntry root = new DirectoryEntry("LDAP://<host>/<DC root DN>"))
using(DirectorySearcher searcher = new DirectorySearcher(root))
{
    searcher.Filter = "(&(objName=MyDistributionList))";
    using(DirectoryEntry group = searcher.findOne())
    {
        searcher.Filter = "(&(objName=MyUserName))";
        using(DirectoryEntry user = searcher.findOne())
        {
             group.Invoke("Add", user.Path);
        }
    }
}

These just wrap the old COM ADSI interfaces, that's why I use group.Invoke(). It takes a bit more practice, but is much more powerful than the NetApi functions.