异步搜索Outlook全局地址列表

时间:2019-02-24 01:25:10

标签: vb.net active-directory ldap vsto outlook-addin

我想;

  • 搜索MS Outlook的全局地址列表
  • 使用输入 filterStr
  • 异步检索所有所有符合条件的项目
    • 联系人姓氏以 filterStr 开头或联系人姓氏以 filterStr
    • 开头
  • 在列表中显示联系人时显示联系人

我正在使用VB.net使用Visual Studio 2017开发MS Outlook加载项。 (c#代码示例是不错的选择)。我需要此加载项,才能通过“ RICHEDIT60W”的“查找某人”字段来搜索MS Skype for Business之类的联系人。

到目前为止,我已经尝试了以下方法;

  • 在我的表单中使用MS Skype for Business的“ RICHEDIT60W”(搜索字段)
    • 找不到文档
  • 使用MS Outlook的“ RichEdit20WPT”(撰写新电子邮件中的“ TO:”字段)
    • 找不到文档
  • 通过Session.GetGlobalAddressList获取“全局地址列表”
    • 成功,但是循环浏览超过5万个项目太慢了
  • 使用System.DirectorySearcher
    • 这并不总是有效。通过电缆连接到公司网络时,可以创建对象。通过家庭无线网络连接时,出现错误:“指定的域不存在或无法联系”
    • 我确实尝试使用初始化为DirectoryEntry的对象;
    • name.surname.corporation.com,其中我的电子邮件地址是name.surname@corporation.com,这次我收到“ 未指定错误
    • 我尝试使用ADODB按照https://docs.microsoft.com/en-us/windows/desktop/ad/example-code-for-searching-for-users#visual-basic-example中的说明进行连接
    • 这也在第42行(root = GetObject("LDAP://rootDSE")上给我一个错误

问题:如何执行以下任何操作;

  • DirectorySearcher上班
  • 使ADODB方法起作用
  • 使用Outlook或Skype for Business的现有RichEdit控件

2 个答案:

答案 0 :(得分:0)

在较低的级别(仅扩展的MAPI-C ++或Delphi)上,您将需要应用PR_ANR MAPI限制:这是Outlook在解析名称并显示模糊匹配列表时使用的限制。您可以在单独的线程上运行该代码,但一次不会返回匹配项-您将获得整个集合。

如果不能选择扩展MAPI,则可以使用Redemption及其RDOSession.AddressBookGAL.ResolveNamesEx方法:

set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set AdrrEntries = Session.AddressBook.GAL.ResolveNameEx("John")
Debug.Print AdrrEntries.Count & " names were returned by ResolveNameEx:"
Debug.Print "------------"
for each AE in AdrrEntries
    Debug.Print AE.Name
next
Debug.Print "------------"

答案 1 :(得分:0)

我这样解决了;

  • 获取GAL本身和AddressEntries足够快,在那里没有问题
  • 在初始化期间,我仅遍历AddressEntries一次,并且仅将每个Name属性的<{1}}传递给List(Of String),这大约需要3秒
  • 当我需要搜索条目时,我正在使用Linq通过IndexOf函数查询列表,该函数最多花费150ms的时间来获取所有匹配项,并且列表中的项目可立即访问

这符合我的需求,因为  -它可以通过我的家庭网络,甚至在我没有连接的情况下也可以工作(我假设Outlook正在缓存GAL)  -使用Linq进行查询的速度足够快,可以方便地根据用户类型进行搜索