如何使用Microsoft.Office.Interop.Outlook获取用户拥有的通讯组列表
Outlook Interop 实现查询当前用户拥有的通讯组列表方案
你现在使用的GetMemberOfList方法只能获取当前用户加入的组,要获取用户作为所有者的通讯组,需要通过读取全局地址列表中通讯组的扩展MAPI属性来匹配当前用户信息,具体实现如下:
首先定义需要用到的MAPI属性常量:
// 通讯组管理员的MAPI属性标识 const string PR_MANAGED_BY_ENTRYID = "http://schemas.microsoft.com/mapi/proptag/0x3FFB0102";
实现获取所有拥有的通讯组的方法:
private List<Microsoft.Office.Interop.Outlook.ExchangeDistributionList> GetCurrentUserOwnedGroups() { var ownedGroups = new List<Microsoft.Office.Interop.Outlook.ExchangeDistributionList>(); var appOutlook = new Microsoft.Office.Interop.Outlook.Application(); var session = appOutlook.Session; Microsoft.Office.Interop.Outlook.AddressEntry currentUser = session.CurrentUser.AddressEntry; if (currentUser.Type != "EX") return ownedGroups; var exchUser = currentUser.GetExchangeUser(); if (exchUser == null) return ownedGroups; // 获取当前用户的EntryID用来匹配组管理员 string currentUserEntryId = exchUser.EntryID; // 读取全局地址列表 Microsoft.Office.Interop.Outlook.AddressList gal = session.GetGlobalAddressList(); if (gal == null) return ownedGroups; foreach (Microsoft.Office.Interop.Outlook.AddressEntry addrEntry in gal.AddressEntries) { // 仅处理Exchange通讯组类型的地址条目 if (addrEntry.AddressEntryUserType == Microsoft.Office.Interop.Outlook.OlAddressEntryUserType.olExchangeDistributionListAddressEntry) { var exchDL = addrEntry.GetExchangeDistributionList(); if (exchDL == null) continue; try { // 读取组的管理员EntryID属性 byte[] managedByBytes = addrEntry.PropertyAccessor.GetProperty(PR_MANAGED_BY_ENTRYID) as byte[]; if (managedByBytes == null) continue; // 把二进制EntryID转成Outlook可识别的字符串格式 string managedByEntryId = session.GetAddressEntryFromID(session.BinaryToString(managedByBytes)).EntryID; // 匹配当前用户ID,匹配成功即为当前用户拥有的组 if (managedByEntryId == currentUserEntryId) { ownedGroups.Add(exchDL); Debug.WriteLine($"Owned Group: {exchDL.Name}"); } } catch (Exception ex) { // 无权限读取属性的组直接跳过即可 Debug.WriteLine($"Skip group {addrEntry.Name}: {ex.Message}"); } } } return ownedGroups; }
组成员修改方法
拿到匹配的ExchangeDistributionList对象之后,直接调用对应接口即可完成成员修改操作:
- 添加成员:调用
exchDL.AddMember(AddressEntry)方法 - 移除成员:调用
exchDL.RemoveMember(AddressEntry)方法 - 保存修改:调用
exchDL.Save()方法提交更改
注意:如果企业全局地址列表体量较大,遍历会有一定耗时,可以根据业务需求增加名称关键词过滤、本地缓存等逻辑优化性能。该方案全程基于Outlook Interop接口实现,不需要额外调用Active Directory接口。
内容的提问来源于stack exchange,提问作者Jeremy Hartman
相关产品推荐
相关产品推荐

