在控制台应用程序中使用 C# 将成员添加到 Outlook GAL 分发列表
Add members to Outlook GAL Distribution List using C# in a Console app
我正在尝试编写一个 C# 控制台应用程序,它可以以编程方式更新全局地址列表 (GAL) 中的 Outlook 通讯组列表 (DL)。我有权更新此 DL。我可以在我的 PC 上使用 Outlook 以交互方式完成它,我可以使用 Win32::NetAdmin::GroupAddUsers
.
在 Perl 代码中完成它
添加对 COM 库的引用后 "Microsoft Outlook 14.0 Object Library",然后通过以下方式访问:
using Outlook = Microsoft.Office.Interop.Outlook;
我可以成功地从 DL 中读取,甚至可以在正在搜索的 "main" 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()
的参数已定义 here,并且我的代码中显示的值完全来自检查来自另一个 DL 的我自己的 Member 对象。
显示的异常只是 "The bookmark is not valid." 之前问过 similar question,但解决方案是使用 P/Invoke 或 LDAP。我真的不知道如何使用 P/Invoke(严格来说是 C# 和 Perl 程序员,而不是 Windows/C/C++ 程序员),而且我无权访问 LDAP 服务器,所以我真的很想通过 Microsoft.Office.Interop.Outlook
个对象使其工作。
非常感谢任何帮助!
在尝试了几个不同的 .NET 对象之后,使用 System.DirectorServices.AccountManagement
中发布的 Adding and removing users from Active Directory groups in .NET 是最终对我有用的代码。结束我自己的问题。
我正在尝试编写一个 C# 控制台应用程序,它可以以编程方式更新全局地址列表 (GAL) 中的 Outlook 通讯组列表 (DL)。我有权更新此 DL。我可以在我的 PC 上使用 Outlook 以交互方式完成它,我可以使用 Win32::NetAdmin::GroupAddUsers
.
添加对 COM 库的引用后 "Microsoft Outlook 14.0 Object Library",然后通过以下方式访问:
using Outlook = Microsoft.Office.Interop.Outlook;
我可以成功地从 DL 中读取,甚至可以在正在搜索的 "main" 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()
的参数已定义 here,并且我的代码中显示的值完全来自检查来自另一个 DL 的我自己的 Member 对象。
显示的异常只是 "The bookmark is not valid." 之前问过 similar question,但解决方案是使用 P/Invoke 或 LDAP。我真的不知道如何使用 P/Invoke(严格来说是 C# 和 Perl 程序员,而不是 Windows/C/C++ 程序员),而且我无权访问 LDAP 服务器,所以我真的很想通过 Microsoft.Office.Interop.Outlook
个对象使其工作。
非常感谢任何帮助!
在尝试了几个不同的 .NET 对象之后,使用 System.DirectorServices.AccountManagement
中发布的 Adding and removing users from Active Directory groups in .NET 是最终对我有用的代码。结束我自己的问题。