最近在项目上遇到一个问题,需要能够在程序中获取Lync会议的链接地址。Lync是微软出品的一套即时通信(IM)客户端软件,配合Microsoft Lync Server使用,其前身是Microsoft Office Communicator(MOC)。与Live Messenger相比,Lync更适合企业内部使用,因为它还具备一定的与企业级应用组件进行整合的功能。在Microsoft Office 2010/2013中,Lync已成为Office中的一个套件。

在企业内部使用Outlook和Lync的读者一定知道,Outlook中有一个Lync的插件,当启用了该插件后,即可在“日历”视图中通过单击New Lync Meeting按钮来安排一个带有Lync在线会议链接地址的Appointment:

正如上图所示,在这个Appointment窗口中,有个Join Lync Meeting的超级链接,鼠标移动到这个链接上,会提示出其所对应的超级链接地址,也就是Lync在线会议的链接地址。现在,我们就需要通过编写C#程序的方式,来获得这个Lync在线会议的链接地址。

SDK的选择

经过上网搜索研究,与Outlook和Lync相关的SDK大致有以下几种:

  1. Lync 2010/2013 SDK
  2. Exchange Web Services (EWS)
  3. Unified Communications Managed API (UCMA)
  4. Unified Communications Web API (UCWA)

Lync 2010/2013 SDK主要是通过Automation对象来实现Lync客户端的操作,因此,使用Lync SDK时,Lync客户端需要一直运行,否则无法获得Automation对象。Lync SDK也支持Suppress UI的模式,这样开发者就可以屏蔽Lync的用户界面,而使用自己的软件界面来使用Lync客户端的功能,但无论是否是Suppress UI的模式,都需要Lync客户端一直运行。

Exchange Web Services (EWS)是一套访问Exchange Server的API,通过使用EWS,可以在程序中通过Exchange Server发送电子邮件、管理电子邮件、安排Outlook会议,以及管理自己的Outlook文件夹等等。

Unified Communications Managed API (UCMA) 是一套基于.NET的API,通过使用UCWA,可以获得Microsoft Lync Server的增强状态信息、即时消息、电话、视频、音频、会议等的访问和控制功能。

Unified Communications Web API (UCWA) 是UCMA的Web版,通过Javascript、Json等技术向异构平台提供UCMA的功能。

终上所述,在我们的应用中,应该选择Unified Communications Managed API (UCMA)来实现Lync在线会议链接地址的获取。

代码实现

首先需要安装Unified Communications Web API,这可以到微软的官方网站下载。下载安装之后,即可开始编写代码。

创建一个控制台应用程序(Console Application),添加对Microsoft.Rtc.Collaboration.dll程序集的引用。之后,还需要会议组织者在企业中的电子邮件地址,以及Lync服务器的地址。前者容易获得,读者可以使用自己的邮件地址进行测试;而Lync服务器的地址,则可以在托盘中右键单击Lync图标,在弹出的菜单中选择显示Lync详细信息的选项来获得。

下面的代码完整地展示了通过UCMA来获取Lync在线会议的链接地址,具体内容请参考代码中的注释:

using System;
using System.Threading;
using Microsoft.Rtc.Collaboration;
using Microsoft.Rtc.Collaboration.ConferenceManagement;
using Microsoft.Rtc.Signaling; namespace ConsoleApplication7
{
class Program
{
static AutoResetEvent platformStartupCompleted = new AutoResetEvent(false);
static AutoResetEvent endpointInitCompleted = new AutoResetEvent(false);
static AutoResetEvent conferenceScheduleCompleted = new AutoResetEvent(false); static void Main(string[] args)
{
var ownerURI = "<在此填写会议组织者URI,格式为:sip:邮箱地址>";
var serverAddress = "<在此填写Lync服务器地址>";
var applicationName = "ConsoleApplication";
// 通过ClientPlatformSettings来初始化一个CollaborationPlatform。
// 注意,Transport Type应使用SipTransportType.Tls。
ClientPlatformSettings clientPlatformSettings = new ClientPlatformSettings(applicationName,
SipTransportType.Tls);
CollaborationPlatform platform = new CollaborationPlatform(clientPlatformSettings);
// 启动CollaborationPlatform实例
platform.BeginStartup(platformEndStartup, platform);
platformStartupCompleted.WaitOne();
Console.WriteLine("Platform initialized..."); // 通过UserEndpointSettings来初始化一个UserEndpoint。
UserEndpointSettings userEndpointSettings = new UserEndpointSettings(ownerURI, serverAddress);
userEndpointSettings.Credential = System.Net.CredentialCache.DefaultNetworkCredentials;
UserEndpoint endpoint = new UserEndpoint(platform, userEndpointSettings);
// 建立UserEndpoint的连接
endpoint.BeginEstablish(endpointEndEstablish, endpoint);
endpointInitCompleted.WaitOne();
Console.WriteLine("Endpoint initialized..."); // 设置会议的创建选项,详细的设置选项请参考ConferenceScheduleInformation类的定义。
ConferenceScheduleInformation conferenceScheduleInformation = new ConferenceScheduleInformation();
conferenceScheduleInformation.AccessLevel = ConferenceAccessLevel.Invited;
conferenceScheduleInformation.Description = "Conference Description";
ConferenceParticipantInformation participantA_Information =
new ConferenceParticipantInformation(ownerURI, ConferencingRole.Leader);
conferenceScheduleInformation.Participants.Add(participantA_Information);
conferenceScheduleInformation.LobbyBypass = LobbyBypass.EnabledForGatewayParticipants;
conferenceScheduleInformation.AutomaticLeaderAssignment = AutomaticLeaderAssignment.SameEnterprise;
ConferenceMcuInformation audioVideoMCU = new ConferenceMcuInformation(McuType.AudioVideo);
conferenceScheduleInformation.Mcus.Add(audioVideoMCU); // 根据会议的创建选项创建新的Lync会议
endpoint.ConferenceServices.BeginScheduleConference(conferenceScheduleInformation,
conferenceEndScheduled, endpoint.ConferenceServices); conferenceScheduleCompleted.WaitOne(); Console.WriteLine("Press anykey to exit.");
Console.ReadLine();
} static void conferenceEndScheduled(IAsyncResult ar)
{
try
{
ConferenceServices session = (ConferenceServices)ar.AsyncState;
Conference conference = session.EndScheduleConference(ar);
// 在控制台输出Lync会议的链接地址
Console.WriteLine(conference.WebUrl);
}
catch
{
throw;
}
finally
{
conferenceScheduleCompleted.Set();
}
} static void endpointEndEstablish(IAsyncResult ar)
{
try
{
UserEndpoint endpoint = ar.AsyncState as UserEndpoint;
endpoint.EndEstablish(ar);
}
catch
{
throw;
}
finally
{
endpointInitCompleted.Set();
}
} static void platformEndStartup(IAsyncResult ar)
{
try
{
CollaborationPlatform collabPlatform = ar.AsyncState as CollaborationPlatform;
collabPlatform.EndStartup(ar);
}
catch
{
throw;
}
finally
{
platformStartupCompleted.Set();
}
}
}
}

执行效果

以下是本程序执行的结果,可以看到,程序已经可以在控制台输出会议链接地址了:

使用Unified Communications Managed API获取Lync在线会议的链接地址的更多相关文章

  1. 使用Vue.js和Axios从第三方API获取数据 — SitePoint

    更多的往往不是,建立你的JavaScript应用程序时,你会想把数据从远程源或消耗一个[ API ](https:/ /恩.维基百科.org /维基/ application_programming_ ...

  2. 劳动节脑洞大开!利用Debug API 获取 加壳客户端的MD5值

    系统 : Windows xp 程序 : 某游戏客户端 程序下载地址 :不提供 要求 : 远程注入 & 获取MD5值 使用工具 : vc++6.0 & OD 案例说明: 该游戏客户端对 ...

  3. html5获取经纬度,百度api获取街区名,并使用JS保存进cookie

    引用js<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak= ...

  4. 利用腾讯企业邮箱开放API获取账户未读邮件数初探

    公司一直使用腾讯提供的免费企业邮箱服务,今天用管理员帐户登录后发现,原来现在腾讯的企业邮箱也开放了部分API 你可以通过开放接口实现以下功能: 数据同步 数据同步可以帮助你同步部门成员信息,你还可以创 ...

  5. 通过Alexa API获取Alexa排名

    我们通会用Alexa的网站(或其它站长工具网站)来栓查我们的网​站流量排名,这样就必须去那些网站.实际上,可以通过Alexa XML API 获取网站的Alexa相关的数据(XML格式的),再使用XM ...

  6. 在C#中调用API获取网络信息和流量

    原文 在C#中调用API获取网络信息和流量 最近一项目中要求显示网络流量,而且必须使用C#. 事实上,调用 IpHlpApi.dll 的 GetIfTable API 可以轻易获得网络信息和网络流量. ...

  7. 利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)

    利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)作者:Tuuzed(土仔)   发表于:2008年3月3日23:12:38 版权声明:可以任意转载,转载时请 ...

  8. C# 通过豆瓣网络编程API获取图书信息

    这篇文章主要是关于如何通过豆瓣API获取信息的书籍,起初,我看到了原来的想法的内容是"C# 网络编程之网页简单下载实现"中通过HttpWebResponse类下载源代码,再通过正則 ...

  9. 【转】百度API获取城市名地名(附源码)

    在做一个软件时,用到了定位功能.网上有很多关于google 的GPS定位,但网上关于google定位都没有用, 搜索下原因:(这里建议大家在中国就尽量不使用系统自带的定位) 因为Google的服务器不 ...

随机推荐

  1. Information Management Policy(信息管理策略)的使用范例

    基础知识 很多人都会定期收拾自己的书架或者抽屉,把里面过旧的资料拿走,为新的资料腾出空间来,这样既可以节省空间,而且当冗余资料过多的时候也会降低你查找的速度和效率.那么,在企业的SharePoint中 ...

  2. Dropbox创造共享新思维——Datastore API

    7月9日,第一届Dropbox开发者大会上,Dropbox发布了Datastore API的beta版本,通过这个API,原始的结构化数据可以在多个设备间的Dropbox内同步.CEO Drew Ho ...

  3. 8天掌握EF的Code First开发系列之动手写第一个Code First应用

    返回<8天掌握EF的Code First开发>总目录 本篇目录 创建控制台项目 根据.Net中的类来创建数据库 简单的CRUD操作 数据库模式更改介绍 本章小结 自我测试 上一篇<8 ...

  4. SQLite3

    记录一个基础的IOS下SQLite的例子: @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSAr ...

  5. 链表&LRU

    简介 链表就是链式存储数据的一种数据结构.双向链表每个数据存储都包含他的前后数据节点的位置信息(索引/指针). class DSChain<T> { //使用栈来进行废弃空间回收 priv ...

  6. GUI - GEB UI库

    最近基于Winform开发了几款产品,感觉Winform有很大的局限性,其最主要的一点在于:控件是基于Windows窗体的,这就导致每个控件都是重量级控件,对复杂的界面来说,其性能和表现力都欠佳.在实 ...

  7. 分享自己写的JS版日期格式化和解析工具类,绝对好用!

    前言 本来想模仿Java里面的SimpleDateFormat()对象的,但是感觉这样用起来不方便,所以还是直接写成单独的方法算了. 原文链接 日期格式化 使用说明 formatDate(date, ...

  8. Underscore.js使用

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象. 他解决了这个问题:"如果我面对一个空白的 ...

  9. Atitit  数据库的事件机制--触发器与定时任务attilax总结

    Atitit  数据库的事件机制--触发器与定时任务attilax总结 1.1. 事件机制的图谱1 2. 触发器的类型2 3. 实现原理 After触发器 Vs Instead Of触发器2 3.1. ...

  10. Github团队开发集成以及eclipse集成

    温馨提示:本篇是用于团队开发协作的github,如果是单人的可以移步本系列另外一篇 集成eclipse较为简单 团队仓库目录结构 TestOrgName xxxsystem configs dbscr ...