Добавление участников в список рассылки 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" - вот, наконец, код, который мне подходит. Закрываю свой вопрос.