<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>U COMM</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/perez/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/perez/feed.xml</link>
    <description>Lessons Learned, Lessons Shared for OCS and Lync</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:45:49 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Managing the Over-Subscribed in OCS and Lync</title>
      <link>https://docs.microsoft.com/archive/blogs/perez/managing-the-over-subscribed-in-ocs-and-lync</link>
      <pubDate>Tue, 17 May 2011 07:36:00 GMT</pubDate>
      <dc:creator><![CDATA[Marcper]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/perez/2011/05/17/managing-the-over-subscribed-in-ocs-and-lync/</guid>
      <description><![CDATA[MaxCategorySubscriptions is the system-wide parameter that determines how many users can be watching...]]></description>
      <content:encoded><![CDATA[<p>MaxCategorySubscriptions is the system-wide parameter that determines how many users can be watching a given user for presence changes.&nbsp; By default, this limit is 1000 subscriptions.&nbsp; When a given user reaches this limit (more than 200 users are &lsquo;watching&rsquo; them by having them on their Contact List for example), they can still be added to another user&rsquo;s contact list but presence data is not displayed. In OCS, a message is given that says <strong>Presence Data Unavailable</strong>.&nbsp; In Lync, the message is more precise: <strong>Maximum Followers Reached</strong>.&nbsp; </p>
<p>Managing the oversubscribed&nbsp;can be a&nbsp;challenge for many enterprise customers as Microsoft does not provide out of the box tools for monitoring and identifying the oversubscribed, much less managing the challenge itself.&nbsp; This&nbsp;blog post&nbsp;provides an approach to identifying the degree of oversubscription, the users who are oversubscribed and who they are oversubscribed to, and a method for managing the challenge.&nbsp; </p>
<p style="padding-left: 30px;"><span style="background-color: #ffffff;"><b>Note:&nbsp; </b>The queries and sample code-sets provided in this document are not actual product code and are best tested first in a lab environment before being run against a production pool.&nbsp; While the queries do not result in a change to the product,&nbsp;they will introduce an additional load to the backend database when run.&nbsp; Likewise, since the SQL trigger offered as a potential solution&nbsp;was not released with the product,&nbsp;it is&nbsp;not supported code.</span></p>
<p><span style="background-color: #ffffff;">&nbsp;</span></p>
<h1>How MaxSubscription Works</h1>
<p>When a user is oversubscribed (they are at the MaxSubscription limit), other users who attempt to add them to their contact list will not see Presence data.&nbsp; However, the experience is somewhat inconsistent because the nature of &ldquo;subscriptions&rdquo; is dynamic and the number of subscriptions do not directly correlate to the number of users due to MPOP and modalities (for more information, see this 3<sup>rd</sup> party blog: https://msunified.net/2010/10/25/contacts-vs-subscribers-in-ocs-2007-r2/ ).&nbsp; </p>
<p>In short, there are at least five category subscriptions taken-out on a user for each person who has them on their contact list.&nbsp; As such, 200 users=1000 subscriptions.</p>
<p>Consider the following scenario for &ldquo;Alice&rdquo;:</p>
<ul>
<li>Alice&nbsp;logs into Lync in the morning.&nbsp; 200 other users who have&nbsp;Alice on their contact list login between 9am and lunch.&nbsp; Each user&rsquo;s client takes five category subscriptions out on Alice: calendarData, contactCard, note, device, services, state.&nbsp; At this point, Alice is &ldquo;oversubscribed&rdquo;.&nbsp; Note that I stated each user's "client": if a user is logged into OCS R2 on multiple devices/endpoint (such as a Client Web Access<em> and </em>on a desktop client), then that user will take 10 subscriptions for Alice.</li>
<li>As such, when&nbsp;Bob (who has Alice on his contact list) logs into Lync just before lunch, he sees&nbsp;no presence data for&nbsp;Alice, only a message that states: Max Followers Reached.&nbsp; And then he calls the Help Desk - :)</li>
</ul>
<p style="padding-left: 60px;"><b><i>However &ndash;&nbsp;Bob will not always have this experience.&nbsp; For example:</i></b></p>
<ul>
<li>When everyone leaves for lunch (including Bob), half of the users don't just lock their machines but actually &ldquo;logoff&rdquo; - so their subscriptions to Alice are cancelled/cleared.&nbsp; </li>
<li>After lunch,&nbsp;Bob logs in <i>before most of the other users</i> do.&nbsp; When he does, he will be able to take out a subscription on Alice and see her presence.&nbsp; However, users who login after&nbsp;Alice is eventually oversubscribed later that afternoon will not - even if they could earlier that day.</li>
</ul>
<p>Obviously, the nature of this dynamic can give a user community the impression that the product isn't working effectively, and while oversubscribed users are still accessible via IM - the lack of presence data is certainly a challenge to those who work consistently with that person.&nbsp; </p>
<p>To eliminate the challenge, only two options exist:</p>
<ol>
<li>The subscriptions taken-out against that user must be reduced &ndash; which requires the IT Administrator to either augment the subscription process or to simply augment contact lists.&nbsp;&nbsp;The&nbsp;former&nbsp;requires a tool while the latter requires&nbsp;that the Administrator know who is oversubscribed and what users are regularly taking out subscriptions against them.</li>
<li>The limit for "subscriptions" be raised for certain users.&nbsp; Microsoft does allow for the use of highly-targeted presence policies that enable this configurable limit of MaxCategorySubscriptions to be adjusted.&nbsp; However there is no data&nbsp;published from Microsoft to&nbsp;indicate or calculate how the raising of this limit affects performance of the SQL backend.&nbsp; As such, it is recommended to be used in either limited scope (few users) on a large pool or in a wider scope within a smaller pool (such as for executive-level users) where backend resources are not likely to be running near their limits (see more below).</li>
</ol>
<p>&nbsp;</p>
<h1>Augmenting the Subscription Process via SQL Trigger</h1>
<p>An unsupported sample code-set was developed for the Lync/OCS backend (a SQL trigger) by Microsoft engineer Tommy Mhire (tmhire).&nbsp; This SQL trigger manages the subscription process for those who are already at 900 current subscriptions (though this value is configurable).&nbsp; Our intent is that this sample code should be evaluated and monitored within the Innovate environment first and then gradually introduced to production pools.&nbsp; This is a custom SQL trigger, and while not complex it is certainly not code from the Microsoft Product Group.&nbsp; It is very likely that certain updates to the backend (Cumulative Updates) would result in a resetting of the RTCDYN SQL database which would require the re-application of the trigger, so seeing this as an add-on management &ldquo;tool&rdquo; is probably best until a better solution is found.</p>
<p>Below is some information on the trigger as well as the SQL code itself:</p>
<p>&nbsp;</p>
<p><b><span style="text-decoration: underline;">Behavior of the trigger</span></b></p>
<ul>
<li>Checks who the incoming category subscription is for then checks whether that publisher is over the trigger defined limit of category subscriptions (900)</li>
<li>If the publisher is above the limit, it itemizes the subscribers who have category subscriptions for that publisher who ARE NOT on the publisher&rsquo;s contact list</li>
<li>It then take the subscriber with the oldest category subscription who is not on the publisher&rsquo;s contact list and deletes ALL of their category subscriptions</li>
</ul>
<p><b><span style="text-decoration: underline;">&nbsp;</span></b></p>
<p><b><span style="text-decoration: underline;">&nbsp;</span></b></p>
<p><b><span style="text-decoration: underline;">Behavior in the environment</span></b></p>
<p>Subscribers who are on a publisher&rsquo;s contact list WILL ALWAY see the publisher&rsquo;s presence</p>
<ul>
<li>New subscribers ARE ALWAYS given precedence over old subscribers (i.e. old subscribers are pruned first)</li>
<li>NO CHANGE to behavior is experienced if the publisher is below the category subscription limit</li>
</ul>
<p><b><span style="text-decoration: underline;">&nbsp;</span></b></p>
<p><b><span style="text-decoration: underline;">&nbsp;</span></b></p>
<p><b><span style="text-decoration: underline;">SQL Code</span></b></p>
<p style="padding-left: 30px;">create trigger CategorySubscriptionFixer<br />on rtcdyn.dbo.CategorySubscription <br />FOR INSERT as<br />begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @PublisherId int<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @PublisherId = (select top 1 PublisherId from inserted)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (select COUNT(*) from rtcdyn.dbo.CategorySubscription where <a href="mailto:PublisherId=@PublisherId">PublisherId=@PublisherId</a>) &gt; 900 begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @categorySubscriptionToDelete table (PublisherId int,DeliveryId int)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert @categorySubscriptionToDelete<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select top 1 categorySubscription.PublisherId,categorySubscription.DeliveryId<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from rtcdyn.dbo.CategorySubscription categorySubscription, rtcdyn.dbo.DeliveryContext deliveryContext <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where <a href="mailto:categorySubscription.PublisherId=@PublisherId">categorySubscription.PublisherId=@PublisherId</a> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and categorySubscription.DeliveryId=deliveryContext.DeliveryId<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and deliveryContext.SubscriberId not in (select BuddyId from rtc.dbo.Contact where <a href="mailto:OwnerId=@PublisherId">OwnerId=@PublisherId</a>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete from rtcdyn.dbo.CategorySubscription where<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CategorySubscription.PublisherId = (select top 1 PublisherId from @categorySubscriptionToDelete)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and CategorySubscription.DeliveryId = (select top 1 DeliveryId from @categorySubscriptionToDelete)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;<br />end&nbsp;</p>
<p><b><span style="text-decoration: underline;">&nbsp;</span></b></p>
<p><b><span style="text-decoration: underline;">&nbsp;</span></b></p>
<p><b><span style="text-decoration: underline;">&nbsp;</span></b></p>
<p><b><span style="text-decoration: underline;">Risk / Impact of Use</span></b></p>
<ul>
<li>The trigger introduces minimal impact to SQL so any perf-related impact is seen as negligible at this time &ndash; to be validated during testing</li>
<li>Subscribers who are not on the publisher&rsquo;s contact list MAY BE pruned and left with a stale presence subscription. Given that any contact list falling into this scenario would have hundreds of subscriptions/contacts already, it seems very unlikely a user will ever be impacted by this since the most current subscriptions will be preserved.</li>
</ul>
<p>&nbsp;</p>
<h1>Assessing the OverSubscribed</h1>
<p>Some administrators may wish to understand the scope of this challenge for their environment before determining their next steps (such as adjusting their deployed topology or applying Presence Policies).&nbsp; In my experience, even very large deployments (over 100,000 users) have only 1-2% of the population in this situation. The queries below provide several appraoches for estimating level of over-subscription.&nbsp; Since both OCS R2 and Lync Server leverage a SQL backend and both manage the MaxSubscription and MaxCategory parameters the same way, we can leverage&nbsp;these queries against&nbsp;either backend to gather the relevant data. Once the data is gathered, the choice can be made to simply &ldquo;reset&rdquo; a user to zero subscriptions (affecting all subscribed users&rsquo; contact lists), to eliminate certain subscribers (affecting only their contact list), or apply a Presence Policy to the oversubscribed user.</p>
<h3><strong>Queries</strong></h3>
<p style="padding-left: 30px;"><span style="background-color: #ffffff; color: #000000;"><b>Note:</b> The following queries are not shipped with the product and thus are not officially supported.&nbsp; Microsoft recommends testing these queries before use in production.&nbsp; Special thanks goes - again - to Tommy Mhire for the work done to both draft and validate these for use with some of my customers.</span></p>
<p style="padding-left: 30px;"><span style="background-color: #ffffff; color: #000000;">&nbsp;</span></p>
<h4>Query 1: Identify the Oversubscribed </h4>
<p><i>Use this to see which users are near the max value of category subscriptions (in the problem state or close to the problem state). Based on the default max of 1000 category subscriptions.</i></p>
<p style="padding-left: 30px;">select Publishers.UserAtHost Publisher, SubscriberCountByPublisher.numSubscribers from (<br />&nbsp;&nbsp;&nbsp;&nbsp; select PublisherId, count(*) numSubscribers from <br />&nbsp;&nbsp;&nbsp;&nbsp; rtcdyn.dbo.CategorySubscription CatSubscription <br />&nbsp;&nbsp;&nbsp;&nbsp; group by PublisherId<br />) as SubscriberCountByPublisher<br />inner join rtc.dbo.Resource Publishers on SubscriberCountByPublisher.PublisherId = Publishers.ResourceId<br />where numSubscribers &gt; 990</p>
<h4>Query 2: Identify Users Subscribed to a Specific Publisher</h4>
<p><i>Use this to see all users subscribed to a publisher who's showing as "Maximum Followers Reached". Modify the "where UserResource.UserAtHost = 'user@domain.com' line.</i></p>
<p style="padding-left: 30px;">select SubscriberResource.UserAtHost Subscriber, UserResource.UserAtHost Publisher, Categories.Name Category from <br />rtcdyn.dbo.CategorySubscription CatSubscription <br />inner join rtcdyn.dbo.DeliveryContext DeliveryContext on CatSubscription.DeliveryId = DeliveryContext.DeliveryId<br />inner join rtc.dbo.Resource UserResource on CatSubscription.PublisherId = UserResource.ResourceId<br />inner join rtc.dbo.Resource SubscriberResource on DeliveryContext.SubscriberId = SubscriberResource.ResourceId<br />inner join rtc.dbo.CategoryDef Categories on CatSubscription.CategoryId = Categories.CategoryId<br />where UserResource.UserAtHost = <a href="mailto:'user@domain.com'">'user@domain.com'</a><br />order by Subscriber</p>
<p style="padding-left: 30px;"><em>Query 1 and Query 2 are both effective for &ldquo;inter-pool&rdquo; subscriptions.&nbsp; Since they look to the tables for the subscribed user, they provide data on subscribers homed on other pools.</em></p>
<h4>Query 3: Identify all Subscriptions/Subscribers for an entire Pool </h4>
<p><i>Use this to see all the category subscriptions on a given pool (Alice is subscribed to Bob three times). </i></p>
<p style="padding-left: 30px;">select SubscriberResource.UserAtHost Subscriber, UserResource.UserAtHost Publisher, Categories.Name Category from <br />rtcdyn.dbo.CategorySubscription CatSubscription <br />inner join rtcdyn.dbo.DeliveryContext DeliveryContext on CatSubscription.DeliveryId = DeliveryContext.DeliveryId<br />inner join rtc.dbo.Resource UserResource on CatSubscription.PublisherId = UserResource.ResourceId<br />inner join rtc.dbo.Resource SubscriberResource on DeliveryContext.SubscriberId = SubscriberResource.ResourceId<br />inner join rtc.dbo.CategoryDef Categories on CatSubscription.CategoryId = Categories.CategoryId</p>
<p style="padding-left: 30px;"><em><b>Note:</b> Query 3 does a combination of the work of the first two in that it will not only provide you a list of all subscriptions, but also the details about who the subscribers are.&nbsp; As such, this query should be leveraged with great care as a live pool with significant load would certainly be impacted by running this query (as opposed to running Query 1 first, followed by a targeted search of subscribers for a given user (Query 2). </em></p>
<p style="padding-left: 30px;">&nbsp;</p>
<h1>A Word about Presence Policies</h1>
<p>Since OCS, Presence Policies have been available to administrators for managing subscription levels.&nbsp; These parameters are referenced here: <a href="https://technet.microsoft.com/en-us/library/dd572188(office.13).aspx">https://technet.microsoft.com/en-us/library/dd572188(office.13).aspx</a>.&nbsp; In Lync, these can be set via PowerShell (CSPresencePolicy).&nbsp; </p>
<p>Two elements are detailed in the TechNet article: <strong>CategorySubscriptions</strong> and <strong>PromptedSubscribers</strong>.&nbsp; One might read this and assume "prompting" implies the "<em>asking of permission before you are granted a subscription</em>", but that is simply not the case.&nbsp; When you are prompted you are prompted, when you are not you are not.&nbsp; Nothing about permitting or denying a subscription is within the control of a given user.</p>
<p>As such, the time may come where extending the presence policy for a specific population becomes necessary.&nbsp; I would encourage great care in applying these policies.&nbsp; Some blogs/posts I have seen reference a global setting for this - but there is absolutely no data to suggest what happens when these levels are raised.&nbsp; Subscription processing is on the SQL backend, and for large pools raising these levels simply introduces extra load to the backend on what may or may not be an already busy pool.&nbsp; Care must be exercised in such a way that the backend is monitored when this is done for pools homing any great population.&nbsp; It may be better to re-home users who need a larger subscription base to a smaller pool with more available resources.&nbsp; In that case, an entire pool can be set for a higher than 1000 MaxCategorySubscriptions limit - but that pool may not have more than hundreds of such high-profile users.</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Group Chat Disaster Recovery: Failing over to a Secondary Pool</title>
      <link>https://docs.microsoft.com/archive/blogs/perez/group-chat-disaster-recovery-failing-over-to-a-secondary-pool</link>
      <pubDate>Wed, 02 Mar 2011 09:26:21 GMT</pubDate>
      <dc:creator><![CDATA[Marcper]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/perez/2011/03/02/group-chat-disaster-recovery-failing-over-to-a-secondary-pool/</guid>
      <description><![CDATA[Customers who have deployed Office Communications Server 2007 R2 Group Chat Server often use it for...]]></description>
      <content:encoded><![CDATA[<p>Customers who have deployed Office Communications Server 2007 R2 Group Chat Server often use it for mission-critical business purposes. Such customers require the ability to maintain Office Communications Server 2007 R2 Group Chat Server communications even when an entire site, including the Microsoft Office Communications Server Enterprise pool that hosts Group Chat Server, is lost.<br /><br />To preserve Group Chat Server functionality in such a case, a secondary pool located at a different site must be available that can take over when the primary pool fails, and a failover mechanism must transfer operations to the secondary pool. The following&nbsp;white paper serves as a guide for failing over Group Chat Server from one OCS R2 pool to another.</p>
<p><a href="https://www.microsoft.com/downloads/en/details.aspx?FamilyID=27cfbbb9-73c8-4490-b7a4-31319863ebca&amp;displaylang=en">https://www.microsoft.com/downloads/en/details.aspx?FamilyID=27cfbbb9-73c8-4490-b7a4-31319863ebca&amp;displaylang=en</a></p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>OCS Front-End Health: Logging and Monitoring</title>
      <link>https://docs.microsoft.com/archive/blogs/perez/ocs-front-end-health-logging-and-monitoring</link>
      <pubDate>Sat, 08 Aug 2009 10:21:51 GMT</pubDate>
      <dc:creator><![CDATA[Marcper]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/perez/2009/08/08/ocs-front-end-health-logging-and-monitoring/</guid>
      <description><![CDATA[It goes without saying that monitoring is a best practice – be it a database or an application that...]]></description>
      <content:encoded><![CDATA[<p>It goes without saying that monitoring is a best practice – be it a database or an application that sits at a level higher, any engineering group worth their salt will monitor for health.</p>  <p>But what constitutes health?&#160; For OCS R2, a variety of technologies meet with base OS and hardware to provide the functions of even simple IM and Presence.&#160; To that end, a fairly thorough combination of Monitoring (watching that certain metrics stay within predefined thresholds) and performance counter logging are required to both ensure maximum up-time and a conclusive investigation of root cause for service interruption.</p>  <p>&#160;</p>  <p><strong>Monitoring - OCS Front Ends and the SCOM Management Pack for R2</strong></p>  <p>While it would be nice to have an out of the box, end-all be-all solution, that is not likely.&#160; That said, the Management Pack for R2 provides some baseline information that can inform you of the health of your FE and its sense of connectivity to the world around it – particularly the BE (SQL).&#160; </p>  <p>For example, with regard to connectivity to the SQL BE, a couple of key Front End metrics should be understood:</p>  <blockquote>   <p>Queue Depth – Average number of database requests waiting to be executed</p> </blockquote>  <blockquote>   <p>Queue Latency – Average time (msec) a request is held in the database queue</p> </blockquote>  <p>These two metrics speak to the dialogue between the OCS FE and the SQL BE.&#160; Queue Depth is a measurement of “how big the line is”&#160; for messages waiting to go to SQL, and the Latency metric tells us “how slow the line is” moving to SQL.&#160; Both must be watched because a “big line” that moves fast is indicative of different issues than a line (big or small) that’s not moving at all.&#160; </p>  <p>More importantly, if either of these reach a suboptimal level, users will begin to receive SIP 503 messages (OCS Server Not Available).&#160; As such, alerting for these metrics is highly valuable as the opportunity to catch a problem before it impacts the user community is dependent on your ability to quickly address the root cause of the excessive queuing (SQL Disk I/O, memory shortage, SQL blocking, network, etc.).</p>  <p>&#160;</p>  <p><strong>Logging – What’s not in the SCOM Management Pack</strong></p>  <p>Determining root cause of an OCS outage is no minor feat, and with the SQL BE being a point of consideration the surface area for a root cause search is rather large.&#160; </p>  <p>Unfortunately, the OCS Management Pack is a bit slim on metrics enabled by default – and some are not even present that would absolutely be required for a correlation of data to, say, a SQL Diag report.&#160; This correlation of data would allow an engineer troubleshooting an outage to pinpoint the source of the event more accurately because both the FE and BE are being logged thoroughly.</p>  <p>A list of minimum performance counters for troubleshooting performance on an OCS R2 FE is below:</p>  <p>\AVMCU - 00 - Operations\*    <br />\AVMCU - 01 - Planning\*     <br />\AVMCU - 02 - Informational\*     <br />\CAA - 00 - Operations\*     <br />\CAA - 01 - Planning\*     <br />\CAS - 00 - Planning\*     <br />\CAS - 01 - Informational\*     <br />\LC:Arch Agent - 00 - MSMQ\*     <br />\LC:AsMcu - 00 - AsMcu Conferences\*     <br />\LC:CCS - 00 - TPCP Processing\*     <br />\LC:ClientVersionFilter - 00 - Client Version Filter\*     <br />\LC:DATAMCU - 00 - DataMCU Conferences\*     <br />\LC:DLX - 00 - Address Book and Distribution List Expansion\*     <br />\LC:IIMFILTER - 00 - Intelligent IM Filter\*     <br />\LC:ImMcu - 00 - IMMcu Conferences\*     <br />\LC:LDM - 00 - LDM Memory\*     <br />\LC:QMSAgent - 00 - QoEMonitoringServerAgent\*     <br />\LC:RGS - 00 - Response Group Service Hosting\*     <br />\LC:RGS - 01 - Response Group Service Match Making\*     <br />\LC:RGS - 02 - Response Group Service Workflow\*     <br />\LC:RoutingApps - 00 - UC Routing Applications\*     <br />\LC:SIP - 01 - Peers(_Total)\*     <br />\LC:SIP - 02 - Protocol\*     <br />\LC:SIP - 03 - Requests\*     <br />\LC:SIP - 04 - Responses\*     <br />\LC:SIP - 05 - Routing\*     <br />\LC:SIP - 07 - Load Management\*     <br />\LC:SipEps - 00 - Sip Dialogs(_Total)\*     <br />\LC:SipEps - 01 - SipEps Transactions(_Total)\*     <br />\LC:SipEps - 02 - SipEps Connections(_Total)\*     <br />\LC:SipEps - 03 - SipEps Incoming Messages(_Total)\*     <br />\LC:SipEps - 04 - SipEps Outgoing Messages(_Total)\*     <br />\LC:USrv - 00 - DBStore\*     <br />\LC:USrv - 04 - Rich presence subscribe SQL calls\*     <br />\LC:USrv - 05 - Rich presence service SQL calls\*     <br />\MEDIA - 00 - Operations(*)\*     <br />\MEDIA - 01 - Planning(*)\*     <br />\MEDIA - 02 - Informational(*)\*     <br />\Memory\*     <br />\Network Interface(*)\*     <br />\Process(ASMCUSvc)\*     <br />\Process(ABServer)\*     <br />\Process(AVMCUSvc)\*     <br />\Process(DataMCUSvc)\*     <br />\Process(IMMcuSvc)\*     <br />\Process(QmsAgentSvc)\*     <br />\Process(OcsAppServerHost)\*     <br />\Process(OcsAppServerHost#1)\*     <br />\Process(OcsAppServerHost#2)\*     <br />\Process(OcsAppServerHost#3)\*     <br />\Process(smlogsvc)\*     <br />\Process(RtcHost)\*     <br />\Process(RTCSrv)\*     <br />\Processor(*)\*     <br />\TCPv4\*     <br />\UDPv4\*</p>  <p>In the cases where there is an asterisk (‘*’) there is, within the SCOM MP, more than one counter in that subcategory.&#160; For example, for the single entry, \AVMCU - 00 - Operations\* , there are seven actual counters:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_technet/perez/WindowsLiveWriter/OCSFrontEndHealthLoggingandMonitoring_DAFC/image_2.png" original-url="https://blogs.technet.com/blogfiles/perez/WindowsLiveWriter/OCSFrontEndHealthLoggingandMonitoring_DAFC/image_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_technet/perez/WindowsLiveWriter/OCSFrontEndHealthLoggingandMonitoring_DAFC/image_thumb.png" original-url="https://blogs.technet.com/blogfiles/perez/WindowsLiveWriter/OCSFrontEndHealthLoggingandMonitoring_DAFC/image_thumb.png" width="421" height="138" /></a>&#160;</p>  <p>As such, this “list” is far more comprehensive than just the 60 or so metrics given above.&#160; In fact, the Management Pack has over 300 targets.&#160; </p>  <p>However, it is important to know that <strong>over 60 of the targets in the MP are not enabled by default</strong> – and another <strong>18 targets/categories mentioned above are not included in the MP at all</strong>:</p>  <p>\LC:Arch Agent - 00 - MSMQ\*    <br />\LC:AsMcu - 00 - AsMcu Conferences\*     <br />\LC:CCS - 00 - TPCP Processing\*     <br />\LC:ClientVersionFilter - 00 - Client Version Filter\*     <br />IIMFILTER - 00 - Intelligent IM Filter     <br />LDM - 00 - LDM Memory     <br />RGS - 00 - Response Group Service Hosting     <br />RGS - 02 - Response Group Service Workflow     <br />LC:SIP - 03 – Requests     <br />LC:SIP - 05 – Routing     <br />\LC:SipEps - 00 - Sip Dialogs(_Total)\*     <br />\LC:SipEps - 01 - SipEps Transactions(_Total)\*     <br />\LC:SipEps - 02 - SipEps Connections(_Total)\*     <br />\LC:SipEps - 03 - SipEps Incoming Messages(_Total)\*     <br />\LC:SipEps - 04 - SipEps Outgoing Messages(_Total)\*     <br />LC:USrv - 04 - Rich presence subscribe SQL calls     <br />LC:USrv - 05 - Rich presence service SQL calls     <br />MEDIA - 02 – Informational</p>  <p>In order to gather adequate data for determining the root cause of intermittent service interruption or any other challenge with OCS FE health, these counters must be added to a perf logging utility, be it SCOM or otherwise.&#160; Only then can the data collected be used in conjunction with SQL Diag and Perf data to isolate systemic failures.</p>  <p>&#160;</p>  <p><strong>Conclusion</strong></p>  <p>OCS is a massive product with connectivity and dependencies to a variety of sources.&#160; To&#160; ensure maximum uptime and your best chance of conclusively troubleshooting an outage, it is recommended to go “above and beyond” standard metrics and – in some cases – the OCS R2 Management Pack for SCOM.&#160; Organizations with the flexibility may wish to have two levels of logging available: one that is consistent in normal performance, and one that is triggered during performance degradation.&#160; </p>  <p>______________________________________________</p>  <p><strong>A Side Note about SQL</strong></p>  <p>When there is a serious concern about OCS, contact a SQL support engineer for assistance in gathering a SQL Diag report and additional performance metrics there.&#160; Typically, this Diag report includes:</p>  <p>Processor - %Processor Time - _Total    <br />Process - %Processor Time – sqlservr     <br />PhysicalDisk - % Idle Time &lt;All instances&gt;     <br />PhysicalDisk – Avg. Disk Queue Length &lt;All instances&gt;</p>  <p>…as well as metrics such as deadlock tracing (also capable of being captured by turning on traceflag 1204).&#160; For more on deadlock tracing, see: <a href="https://blogs.msdn.com/bartd/archive/2006/09/09/Deadlock-Troubleshooting_2C00_-Part-1.aspx">https://blogs.msdn.com/bartd/archive/2006/09/09/Deadlock-Troubleshooting_2C00_-Part-1.aspx</a>.&#160; </p>  <p>Typically, it is best to get a DBA to fine tune the DIAG as the capturing of Profiler data can consume a great deal of storage and may need to be run separately from the rest of the DIAG.</p>]]></content:encoded>
    </item>
    <item>
      <title>Application Sharing – Monitoring in OCS R2</title>
      <link>https://docs.microsoft.com/archive/blogs/perez/application-sharing-monitoring-in-ocs-r2</link>
      <pubDate>Sat, 18 Jul 2009 22:36:22 GMT</pubDate>
      <dc:creator><![CDATA[Marcper]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/perez/2009/07/18/application-sharing-monitoring-in-ocs-r2/</guid>
      <description><![CDATA[One challenge that can arise for organizations moving from LCS 2005 to OCS R2 is that the...]]></description>
      <content:encoded><![CDATA[<p>One challenge that can arise for organizations moving from LCS 2005 to OCS R2 is that the replacement for the desktop and application sharing functionality within R2 leverages a different toolset.&#160; In LCS 2005, desktop sharing was powered by NetMeeting.&#160; This product was on the desktop in XP but no longer ships in Windows by default. In OCS R2, the Application Sharing feature is provided by Live Meeting to deliver a very rich experience and robust feature set. However, certain use of the Application Sharing on Microsoft Office Communicator 2007 R2 requires an Enterprise CAL.&#160; I say certain, because while anyone can join an App Sharing session with a Standard CAL, only an Enterprise CAL is allowed to initiate a session. </p>  <p>The questions, then, are how do you know who's using App Sharing to initiate sharing, who's using it to view only, and who's not using it all? </p>  <p>The answer comes to us in the form of the OCS 2007 R2 CDR and Monitoring Server.&#160; This server role (previously two separate servers in the RTM version of OCS 2007) actually contains usage data on nearly all SIP traffic seen at the Front End servers. </p>  <p>When a client initiates an Application Sharing request, the SDP (Sessions Description Protocol) information within the SIP invite contains two required values: one that describes the type of event and one that defines the role for the person sending the invite.&#160; These values are seen as follows:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_technet/perez/WindowsLiveWriter/ApplicationSharingMonitoringinOCSR2_12A5D/image_2.png" original-url="https://blogs.technet.com/blogfiles/perez/WindowsLiveWriter/ApplicationSharingMonitoringinOCSR2_12A5D/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_technet/perez/WindowsLiveWriter/ApplicationSharingMonitoringinOCSR2_12A5D/image_thumb.png" original-url="https://blogs.technet.com/blogfiles/perez/WindowsLiveWriter/ApplicationSharingMonitoringinOCSR2_12A5D/image_thumb.png" width="460" height="297" /></a> </p>  <p>In this case, it is clear that the type of the event we're looking at is for Application Sharing, and the user whose SIP URI is specified in the SIP invite is the actual organizer (sharer) for this event. </p>  <p>While default CDR reporting does not provide any data on Application Sharing metrics, the data <strong>is</strong> within the SQL database and can be retrieved using custom scripts.&#160; Examples of such scripts are provided here, courtesy of Nick Smith at the OCS Center of Excellence: </p>  <p><strong>To retrieve data on number of Multi-Party Application Sharing sessions by Organizer:</strong> </p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt"><span style="color: blue">select</span>&#160;&#160;&#160;&#160;&#160; U<span style="color: gray">.</span>UserUri<span style="color: gray">,</span> <span style="color: fuchsia">Count</span><span style="color: gray">(</span>UserUri<span style="color: gray">)</span> <span style="color: blue">as</span> NumberOfApplicationSharingConferences </span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt"><span style="color: blue">from</span>&#160; LcsCDR<span style="color: gray">.</span>dbo<span style="color: gray">.</span>Mcus <span style="color: blue">as</span> M<span style="color: gray">,</span> </span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; LcsCDR<span style="color: gray">.</span>dbo<span style="color: gray">.</span>McuJoinsAndLeaves <span style="color: blue">as</span> MJAL<span style="color: gray">, </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; LcsCDR<span style="color: gray">.</span>dbo<span style="color: gray">.</span>Conferences <span style="color: blue">as</span> C<span style="color: gray">, </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; LcsCDR<span style="color: gray">.</span>dbo<span style="color: gray">.</span>Users <span style="color: blue">as</span> U </span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt"><span style="color: blue">where</span> M<span style="color: gray">.</span>McuId<span style="color: gray">=</span>MJAL<span style="color: gray">.</span>McuId <span style="color: gray">and </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MJAL<span style="color: gray">.</span>SessionIdTime <span style="color: gray">=</span> C<span style="color: gray">.</span>SessionIdTime <span style="color: gray">and </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; U<span style="color: gray">.</span>UserId <span style="color: gray">=</span> C<span style="color: gray">.</span>OrganizerId <span style="color: gray">and </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MJAL<span style="color: gray">.</span>UserId <span style="color: gray">=</span> C<span style="color: gray">.</span>OrganizerId <span style="color: gray">and </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; M<span style="color: gray">.</span>McuType <span style="color: gray">=</span> <span style="color: red">'applicationsharing'</span> <span style="color: gray">and </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MJAL<span style="color: gray">.</span>UserJoinTime <span style="color: gray">is</span> <span style="color: gray">not</span> <span style="color: gray">null </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt"><span style="color: blue">group</span> <span style="color: blue">by</span> U<span style="color: gray">.</span>UserUri </span></p>  <p>&#160;</p>  <p><strong>To retrieve data on number of Peer-to-Peer Application Sharing sessions by Organizer:</strong> </p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt"><span style="color: blue">select</span>&#160;&#160;&#160;&#160;&#160; U<span style="color: gray">.</span>UserUri<span style="color: gray">,</span> <span style="color: fuchsia">count</span><span style="color: gray">(</span>UserUri<span style="color: gray">)</span> <span style="color: blue">as</span> NumberOfP2PApplicationShares </span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt"><span style="color: blue">from</span>&#160; <span style="color: gray">(</span><span style="color: blue">select</span> SessionIdTime<span style="color: gray">,</span>MediaId <span style="color: blue">from</span> LcsCDR<span style="color: gray">.</span>dbo<span style="color: gray">.</span>Media <span style="color: blue">group</span> <span style="color: blue">by</span> SessionIdTime<span style="color: gray">,</span> MediaId<span style="color: gray">)</span> <span style="color: blue">as</span> M<span style="color: gray">,</span> </span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; LcsCDR<span style="color: gray">.</span>dbo<span style="color: gray">.</span>MediaList <span style="color: blue">as</span> ML<span style="color: gray">, </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; LcsCDR<span style="color: gray">.</span>dbo<span style="color: gray">.</span>SessionDetails <span style="color: blue">as</span> SD<span style="color: gray">, </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; LcsCDR<span style="color: gray">.</span>dbo<span style="color: gray">.</span>Users <span style="color: blue">as</span> U </span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt"><span style="color: blue">where</span> M<span style="color: gray">.</span>MediaId<span style="color: gray">=</span>ML<span style="color: gray">.</span>MediaId <span style="color: gray">and </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; M<span style="color: gray">.</span>SessionIdTime <span style="color: gray">=</span> SD<span style="color: gray">.</span>SessionIdTime <span style="color: gray">and </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; SD<span style="color: gray">.</span>User1Id <span style="color: gray">=</span> U<span style="color: gray">.</span>UserId <span style="color: gray">and </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ML<span style="color: gray">.</span>Media <span style="color: gray">=</span> <span style="color: red">'Application Sharing' </span></span></p>  <p style="margin-left: 36pt"><span style="font-family: courier new; font-size: 10pt"><span style="color: blue">group</span> <span style="color: blue">by</span> U<span style="color: gray">.</span>UserUri</span><span style="color: #1f497d"> </span></p>  <p>&#160;</p>  <p>When leveraged, the results from the above queries would be reported as follows: </p>  <p></p>  <p>&#160;<a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_technet/perez/WindowsLiveWriter/ApplicationSharingMonitoringinOCSR2_12A5D/App%20Share%20Conf_2.png" original-url="https://blogs.technet.com/blogfiles/perez/WindowsLiveWriter/ApplicationSharingMonitoringinOCSR2_12A5D/App%20Share%20Conf_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="App Share Conf" border="0" alt="App Share Conf" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_technet/perez/WindowsLiveWriter/ApplicationSharingMonitoringinOCSR2_12A5D/App%20Share%20Conf_thumb.png" original-url="https://blogs.technet.com/blogfiles/perez/WindowsLiveWriter/ApplicationSharingMonitoringinOCSR2_12A5D/App%20Share%20Conf_thumb.png" width="450" height="134" /></a> </p>  <p></p>  <p>&#160;<a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_technet/perez/WindowsLiveWriter/ApplicationSharingMonitoringinOCSR2_12A5D/App%20Share%20P2P_2.png" original-url="https://blogs.technet.com/blogfiles/perez/WindowsLiveWriter/ApplicationSharingMonitoringinOCSR2_12A5D/App%20Share%20P2P_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="App Share P2P" border="0" alt="App Share P2P" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_technet/perez/WindowsLiveWriter/ApplicationSharingMonitoringinOCSR2_12A5D/App%20Share%20P2P_thumb.png" original-url="https://blogs.technet.com/blogfiles/perez/WindowsLiveWriter/ApplicationSharingMonitoringinOCSR2_12A5D/App%20Share%20P2P_thumb.png" width="447" height="124" /></a> </p>  <p>Marc </p>]]></content:encoded>
    </item>
  </channel>
</rss>