检索 Lync 状态

Posted

技术标签:

【中文标题】检索 Lync 状态【英文标题】:Retrieving Lync Presence 【发布时间】:2013-05-27 05:33:49 【问题描述】:

我的要求是我需要创建一个 Windows 服务来检索 Active Directory 中每个用户的 Lync 在线状态(可用、忙碌、请勿打扰 ....)。

我搜索了一下,发现下面的 SDK 可以检索 Lync Presence。 Lync 客户端 2010 SDK, 统一通信托管 API, Lync 服务器 2010 开发工具包, 统一通信客户端 API。

请推荐其中最好的 SDK 来满足我的要求。

提前致谢。

【问题讨论】:

【参考方案1】:

每个 SDK 都有一个很好的说明,您可以在这里使用它们:http://www.codelync.com/an-overview-of-the-lync-apis/

对于您想要实现的目标,我建议使用 UCMA - 统一通信客户端 API。它的工作方式是你给它一个你想要监视状态的用户列表,然后它会在每次他们的状态发生变化时回调一个事件。一旦您开始订阅,您就会收到一个在线事件,因此如果您不想收到持续通知,您可以取消订阅。

订阅大量用户的示例可能是:

  var _remotePresenceView = new RemotePresenceView(_endpoint);
_remotePresenceView.PresenceNotificationReceived += _remotePresenceView_PresenceNotificationReceived;
List<RemotePresentitySubscriptionTarget> subscriptions = new List<RemotePresentitySubscriptionTarget>();

subscriptions.Add(new RemotePresentitySubscriptionTarget("sip:first_user@domain));
subscriptions.Add(new RemotePresentitySubscriptionTarget("sip:second_user@domain));
...
subscriptions.Add(new RemotePresentitySubscriptionTarget("sip:nth_user@domain));

_remotePresenceView.StartSubscribingToPresentities(subscriptions);

使用 Remote Presence View 时有一些提示、技巧和陷阱:查看MSDN here。

【讨论】:

汤姆感谢您的回复。在此链接social.msdn.microsoft.com/Forums/en-US/ucmanagedsdk/thread/… 中提到,目前 UCMA 将不支持 Office365-Lync 在线...所以请告诉我我需要为 Lync 在线做什么。 我认为您目前没有为 Office365 做任何事情。您可能可以使用客户端 SDK,但您可以访问的联系人会受到限制 - 可能仅限于您的联系人列表中的联系人。恐怕我对 O365 没有太多经验。 尝试从 Windows 服务的上下文中使用 Lync 客户端 SDK 有点问题... Lync 客户端依赖于处于活动状态的桌面管理器,因此您会经常看到 Lync.exe如果桌面管理器消失,即用户注销操作系统,您通过 SDK 运行的进程将终止。然而,据我所知,在微软开始发布某种官方 API 之前,它是 Office 365 的唯一选择。【参考方案2】:

我也试图找到用户的存在状态,并拿出下面的代码来实现这个要求。

                string _transferUserURI="pass your sipaddress";
                RemotePresenceView _RemotePresence;

                RemotePresenceViewSettings settings = new RemotePresenceViewSettings();
                settings.SubscriptionMode = RemotePresenceViewSubscriptionMode.Default;
                settings.PollingInterval = new TimeSpan(0, 0, 10);
                _RemotePresence = new RemotePresenceView(_appEndpoint, settings);
                _RemotePresence.PresenceNotificationReceived += new EventHandler<RemotePresentitiesNotificationEventArgs>(_RemotePresence_PresenceNotificationReceived);
                //_RemotePresence.SubscriptionStateChanged += new EventHandler<RemoteSubscriptionStateChangedEventArgs>(_RemotePresence_SubscriptionStateChanged);

                RemotePresentitySubscriptionTarget target = new RemotePresentitySubscriptionTarget(_transferUserURI);
                List<RemotePresentitySubscriptionTarget> targets = new List<RemotePresentitySubscriptionTarget>()  target ;
                _RemotePresence.StartSubscribingToPresentities(targets);

和 _RemotePresence_PresenceNotificationReceived 事件

       void _RemotePresence_PresenceNotificationReceived(object sender, RemotePresentitiesNotificationEventArgs e)
    
        try
        
            // Extract the RemotePresenceView that received the notification.
            RemotePresenceView view = sender as RemotePresenceView;
            // A RemotePresentityNotification will contain all the
            // categories for one user; Notifications can contain notifications
            // for multiple users.


            foreach (RemotePresentityNotification notification in e.Notifications)
            
                Console.WriteLine("\nView: " + view.ApplicationContext
                    + " Received a Notification for user "
                    + notification.PresentityUri + ".");

                // If a category on notification is null, the category
                // was not present in the notification. This means there were no
                // changes in that category.
                if (notification.AggregatedPresenceState != null)
                
                    Console.WriteLine("Aggregate State = " + notification.AggregatedPresenceState.Availability + ".");

                    string Availblity = notification.AggregatedPresenceState.Availability.ToString();
                

                if (notification.PersonalNote != null)
                
                    Console.WriteLine("PersonalNote: " + notification.PersonalNote.Message + ".");
                

                if (notification.ContactCard != null)
                
                    // A ContactCard contains many properties; only display
                    // some.
                    ContactCard contactCard = notification.ContactCard;
                    Console.WriteLine("ContactCard Company: " + contactCard.Company + ".");
                    Console.WriteLine("ContactCard DisplayName: " + contactCard.DisplayName + ".");
                    Console.WriteLine("ContactCard EmailAddress: " + contactCard.EmailAddress + ".");
                
            
        
        catch
        

        
    

我希望这是你正在寻找的答案,如果我错了,请纠正我。

【讨论】:

感谢您的代码。但是,我不清楚您是如何创建 App Endpoint 的。 _RemotePresence = new RemotePresenceView(_appEndpoint, settings);

以上是关于检索 Lync 状态的主要内容,如果未能解决你的问题,请参考以下文章

关于Lync/Skype客户端无法获取Outlook忙闲信息的问题

检索 Lync 客户端的呼叫转接(路由)规则

如何检索与特定用户的 Lync 对话

从 UCMA 应用程序中的电话号码检索 Lync 联系人

如何从 lync 客户端 2013 通信中检索 IM 消息

Lync 2013 Web API (UCWA) 位置