Добавление участников в список рассылки Outlook GAL с помощью C# в консольном приложении

Я пытаюсь написать консольное приложение C#, которое может программно обновлять список рассылки Outlook (DL) в глобальном списке адресов (GAL). У меня есть разрешение на обновление этого DL. Я могу сделать это в интерактивном режиме на моем компьютере с помощью Outlook, и я могу сделать это в коде Perl, используя Win32::NetAdmin::GroupAddUsers,

После добавления ссылки на библиотеку COM "Библиотека объектов Microsoft Outlook 14.0", а затем доступ через:

using Outlook = Microsoft.Office.Interop.Outlook;

Я могу успешно читать из DL, даже возвращаясь через DL внутри "основного" DL, в котором выполняется поиск. Вот этот рабочий код (критика не нужна для этой части):

private static List<Outlook.AddressEntry> GetMembers(string dl, bool recursive)
{
    try
    {
        List<Outlook.AddressEntry> memberList = new List<Outlook.AddressEntry>();

        Outlook.Application oApp = new Outlook.Application();
        Outlook.AddressEntry dlEntry = oApp.GetNamespace("MAPI").AddressLists["Global Address List"].AddressEntries[dl];
        if (dlEntry.Name == dl)
        {
            Outlook.AddressEntries members = dlEntry.Members;
            foreach (Outlook.AddressEntry member in members)
            {
                if (recursive && (member.AddressEntryUserType == Outlook.OlAddressEntryUserType.olExchangeDistributionListAddressEntry))
                {
                    List<Outlook.AddressEntry> sublist = GetMembers(member.Name, true);
                    foreach (Outlook.AddressEntry submember in sublist)
                    {
                        memberList.Add(submember);
                    }
                }
                else {
                    memberList.Add(member);
                }
            }
        }
        else
        {
            Console.WriteLine("Could not find an exact match for '" + dl + "'.");
            Console.WriteLine("Closest match was '" + dlEntry.Name +"'.");
        }

        return memberList;
    }
    catch
    {
        // This mostly fails if running on a PC without Outlook.
        // Return a null, and require the calling code to handle it properl
        // (or that code will get a null-reference excception).
        return null;
    }
}

Я могу использовать вывод этого для тщательного изучения членов, так что я думаю, что немного понимаю объекты DL / member.

Но следующий код НЕ добавит члена в DL:

private static void AddMembers(string dl)
{
    Outlook.Application oApp = new Outlook.Application();
    Outlook.AddressEntry ae = oApp.GetNamespace("MAPI").AddressLists["Global Address List"].AddressEntries[dl];
    try {
        ae.Members.Add("EX", "Tuttle, James", "/o=EMC/ou=North America/cn=Recipients/cn=tuttlj");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    ae.Update();
}

Аргументы Members.Add() определены здесь, и значения, показанные в моем коде, получены именно из изучения моего собственного объекта Member из другого DL.

Исключением является просто "Закладка недействительна". Подобный вопрос задавался ранее, но решение было использовать P/Invoke или LDAP. Я действительно понятия не имею, как использовать P/Invoke (строго программист на C# и Perl, а не Windows/C/C++), и у меня нет доступа к серверу LDAP, поэтому я действительно хочу, чтобы это работало через Microsoft.Office.Interop.Outlook объекты.

Любая помощь очень ценится!

1 ответ

Решение

После экспериментов с несколькими различными объектами.NET, используя System.DirectorServices.AccountManagement как написано в разделе "Добавление и удаление пользователей из групп Active Directory в.NET" - вот, наконец, код, который мне подходит. Закрываю свой вопрос.

Другие вопросы по тегам