使用Lync ContactManager获取所有联系人

时间:2011-03-28 13:59:30

标签: c# lync-2010 lync

现在我正在使用LyncClient.ContactManager.BeginSearch方法来查找联系人。但是,我无法弄清楚如何获得所有联系人。我已经尝试将“*”和“%”作为外卡字符传递但是没有用。现在这是我的函数调用。

_lyncClient.ContactManager.BeginSearch("*", SearchProviders.GlobalAddressList, SearchFields.DisplayName, SearchOptions.ContactsOnly, 400, SearchCallback, "Searching Contacts");

2 个答案:

答案 0 :(得分:8)

Lync联系人按组分组,因此您需要从组级别开始。一旦你有了一个小组,你就可以通过它的联系人

进行枚举
foreach(var group in _client.ContactManager.Groups)
{
    foreach (var contact in group)
    {
        MessageBox.Show(contact.Uri);
    }
}

This article适用于后台和更高级的功能

修改:具体来说,对于通讯组扩展问题,我认为示例here存在缺陷。

不是调用BeginExpand并等待WaitHandle,而是提供一个回调方法来处理Expand回调。所以,而不是:

asyncOpResult = DGGroup.BeginExpand(null, null);
asyncOpResult.AsyncWaitHandle.WaitOne();

DGGroup.EndExpand(asyncOpResult);

试试这个:

...
asyncOpResult = DGGroup.BeginExpand(ExpandCallback, DGGroup);
...

public void ExpandCallback(IAsyncResult ar)
{
    DistributionGroup DGGroup = (DistributionGroup)ar.AsyncState;
    DGGroup.EndExpand(ar);

    etc...
}

这对我来说很有效。

答案 1 :(得分:1)

我现在最终进行多次搜索以获取所有联系人。我仔细检查字母表中的每个字母。加载时间足够快,我只需在网格上显示加载图像一段时间即可启动。这对我们拥有的200个左右的联系人来说效果很好,但我建议Paul的解决方案不超过150个。这是我做的:

private static char[] Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
...

public void GetAllContacts()
{
   int initialLetterIndex = 0;

  _lyncClient.ContactManager.BeginSearch(
    Alphabet[initialLetterIndex].ToString();
    SearchProviders.GlobalAddressList,
    SearchFields.FirstName,
    SearchOptions.ContactsOnly,
    300,
    SearchAllCallback
    new object[] { initialLetterIndex, new List<Contact>() }
  );
}

private void SearchAllCallback(IAsyncResult result)
{
  object[] parameters = (object[])result.AsyncState;
  int letterIndex = (int)parameters[0] + 1;
  List<Contact> contacts = (List<Contact>)parameters[1];

  SearchResults results = _lyncClient.ContactManager.EndSearch(result);
  contacts.AddRange(results.Contacts);

  if (letterIndex < Alphabet.Length)
  {
    _lyncClient.ContactManager.BeginSearch(
      Alphabet[letterIndex].ToString(), 
      SearchAllCallback, 
      new object[] { letterIndex, contacts }
    );
  }
  else
  {
    //Now that we have all the contacts 
    //trigger an event with 'contacts' as the event arguments.
  }
}