使用Unified Communications Managed API获取Lync在线会议的链接地址
最近在项目上遇到一个问题,需要能够在程序中获取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大致有以下几种:
- Lync 2010/2013 SDK
- Exchange Web Services (EWS)
- Unified Communications Managed API (UCMA)
- 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在线会议的链接地址的更多相关文章
- 使用Vue.js和Axios从第三方API获取数据 — SitePoint
更多的往往不是,建立你的JavaScript应用程序时,你会想把数据从远程源或消耗一个[ API ](https:/ /恩.维基百科.org /维基/ application_programming_ ...
- 劳动节脑洞大开!利用Debug API 获取 加壳客户端的MD5值
系统 : Windows xp 程序 : 某游戏客户端 程序下载地址 :不提供 要求 : 远程注入 & 获取MD5值 使用工具 : vc++6.0 & OD 案例说明: 该游戏客户端对 ...
- html5获取经纬度,百度api获取街区名,并使用JS保存进cookie
引用js<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak= ...
- 利用腾讯企业邮箱开放API获取账户未读邮件数初探
公司一直使用腾讯提供的免费企业邮箱服务,今天用管理员帐户登录后发现,原来现在腾讯的企业邮箱也开放了部分API 你可以通过开放接口实现以下功能: 数据同步 数据同步可以帮助你同步部门成员信息,你还可以创 ...
- 通过Alexa API获取Alexa排名
我们通会用Alexa的网站(或其它站长工具网站)来栓查我们的网站流量排名,这样就必须去那些网站.实际上,可以通过Alexa XML API 获取网站的Alexa相关的数据(XML格式的),再使用XM ...
- 在C#中调用API获取网络信息和流量
原文 在C#中调用API获取网络信息和流量 最近一项目中要求显示网络流量,而且必须使用C#. 事实上,调用 IpHlpApi.dll 的 GetIfTable API 可以轻易获得网络信息和网络流量. ...
- 利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)
利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)作者:Tuuzed(土仔) 发表于:2008年3月3日23:12:38 版权声明:可以任意转载,转载时请 ...
- C# 通过豆瓣网络编程API获取图书信息
这篇文章主要是关于如何通过豆瓣API获取信息的书籍,起初,我看到了原来的想法的内容是"C# 网络编程之网页简单下载实现"中通过HttpWebResponse类下载源代码,再通过正則 ...
- 【转】百度API获取城市名地名(附源码)
在做一个软件时,用到了定位功能.网上有很多关于google 的GPS定位,但网上关于google定位都没有用, 搜索下原因:(这里建议大家在中国就尽量不使用系统自带的定位) 因为Google的服务器不 ...
随机推荐
- For循环打印正三角,倒三角,菱形
A:正三角形: 内循环的判断条件:y<=x for(int x=0; x<5; x++) { for(int y=0; y<=x; y++) { System.out.print(& ...
- 安装ant
从ant官方网站下载ant安装包:apache-ant-1.9.7-bin.tar.gz,解压 tar xvf apache-ant-1.9.7-bin.tar.gz -C /usr/java/ 配置 ...
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...
- EasyPR--开发详解(3)高斯模糊、灰度化和Sobel算子
在上篇文章中我们了解了PlateLocate的过程中的所有步骤.在本篇文章中我们对前3个步骤,分别是高斯模糊.灰度化和Sobel算子进行分析. 一.高斯模糊 1.目标 对图像去噪,为边缘检测算法做准备 ...
- ystep jQuery流程、步骤插件
今天小菜给大家带来又一款给力jQuery插件:ystep. 从名称上大致可以看出,这是一个流程步骤插件. 如果无意外的话,这可能是小菜近期最后一个作品了...苦逼的小菜即将创业,可能就没时间折腾啦~好 ...
- .NET 的 Debug 和 Release build 对执行速度的影响
这篇文章发布于我的 github 博客:原文 在真正开始讨论之前先定义一下 Scope. 本文讨论的范围限于执行速度,内存占用什么的不在评估的范围之内. 本文不讨论算法:编译器带来的优化基本上属于底层 ...
- mysql 截取身份证出生日期
,) ,) as date), '%m-%d') as 生日 from t_person
- Html5 绘制五星红旗
Html5+JavaScript 在Canvas上绘制五星红旗,具体思路如下图所示: 绘制思路在上图中已有说明,具体代码如下: <script type="text/javascrip ...
- avascript中的this与函数讲解
徐某某 一个半路出家的野生程序员 javascript中的this与函数讲解 前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大 ...
- ATM模拟器(附代码及运行结果)
源代码: import java.util.Scanner; class Account{ String identify; String name; String date; String key; ...