Server Side Conversation History with SfB on premise and Exchange Online

Yes it works also in a hybrid scenario.

Advertisements

These two days I struggled to implement the new (well it dates from 2015) Server Side Conversation History for a customer who has a Skype for Business 2015 on-site (from Enterprise Voice and Telephony) and Exchange Online through Office 365.

So, I used some useful blog posts from Cloud Exchangers for the whole process understanding of Server Side Conversation History. I understood that for the Server Side Conversation History to work the cmdlet

Test-CsExStorageConnectivity –SipUri user@contoso.com -Verbose

has to pass successfully.

This command means that Oauth (Server to Server authentication) between SfB on prem and Exchange online should be OK.

So again, another blog post from Cloud Exchangers about OAuth is very useful to implement this.

However, at the end of the configuration, when the Test-CsExStorageConnectivity cmdlet it throws an error :

VERBOSE: Successfully opened a connection to storage service at localhost using binding: NetNamedPipe.
VERBOSE: Create message.
VERBOSE: Execute Exchange Storage Command.
VERBOSE: Processing web storage response for ExCreateItem Failure., result=ErrorUserSmtpMissing, activityId=2a173b88-ecb5-43ca-a0be-09f3fdb7bb2e, reason=StoreException: code=ErrorUserSmtpMissing, reason=Found user sipUri=[sip:user@contoso.com], but SmtpAddress is null/empty, ensure mailbox is enabled.
at
Microsoft.Rtc.Internal.Storage.Store.StoreConnectionManager.LookupUserDetails(StoreContext ctx, String sipUri, Guid& tenantId, String& smtpAddress, String&userSid,String& userUpn)
at
Microsoft.Rtc.Internal.Storage.Store.StoreConnectionManager.GetExchangeContext(StoreContext ctx, String sipUri)
at
Microsoft.Rtc.Internal.Storage.Store.StoreConnectionManager.GetExchangeClientProxy(StoreContext ctx, String sipUri, CacheMode cacheMode)
at
Microsoft.Rtc.Internal.Storage.Adaptor.ExStoreAdaptor.InternalCreateItem(StoreContext ctx, String sipAddress, CreateItemType createItem, Boolean autoCreateParentFolder, StoreAsyncResult`1 asyncResult, Boolean reAuthorize)
at
Microsoft.Rtc.Internal.Storage.Adaptor.ExStoreAdaptor.ExchangeCreateItem(StoreContext ctx, ExStoreRequest exStoreRequest, StoreAsyncResult`1 asyncResult)
at
Microsoft.Rtc.Internal.Storage.Adaptor.ExStoreAdaptor.BeginDispatchCommand(StoreContext ctx, StoreRequest request, AsyncCallback asyncCallback, Object state)
at
Microsoft.Rtc.Internal.Storage.Api.StorageService.BeginExecuteCommandInternal(Guid adapterId, StoreRequest request, AsyncCallback asyncCallback, Object state,
Boolean isAuthenticated)
.
VERBOSE: Activity tracing:
2016/10/19 11:57:48.179 Lookup user details, sipUri=sip:user@contoso.com, smtpAddress=, sid=, upn=user@contoso.com,
tenantId=00000000-0000-0000-0000-000000000000
VERBOSE: Unhandled response Microsoft.Rtc.Internal.Storage.StoreResponse. VERBOSE: Is command successful: False.
Test failed.

 

I double checked that the password for the User is the same between local Active Directory and Office 365. But I had no idea why am I receiving “SmtpAddress is null/empty, ensure mailbox is enabled” where the user has his mailbox fully activated and working on Exchange Online. (Remark : I have not used Dirsync, I just made sure that the password and SIP URI/EMAIL just match, I thought for a time not running Dirsync may be the problem but no… i worked without it, just read to the end)

I was desperate, especially when I read this topic on Microsoft Answers Community when somebody said it ain’t work with a such hybrid scenario.

Today, I checked another SfB deployment I have done for another customer but with Exchange on premise. I remarked that on Active Directory (open ADSI Edit), the ProxyAddresses field contains two entries which are “sip:user@contoso.com” and “smtp:user@contoso.com”.

I checked back to our problematic hybrid deployment, I found that the field ProxyAddresses contains ONLY “sip:user@contoso.com” but none smtp entry. It’s quite logic since we don’t have an Exchange On-Premise, we only have Exchange Online. And as I understood it’s while activating the user’s mailbox on Exchange that the SMTP entry is added to the ProxyAddresses field of the AD User.

So, you have understood everything !! What I have done is to manually add the SMTP field to the ProxyAddresses. Just open Powershell on Active Directory server and type this :

Set-ADUser -Identity your_user -Add @{ProxyAddresses=”SMTP:user@contoso.com”

And Guess what ? Got back to Skype for Business Management Shell to relaunch the Test-CsExStorageConnectivity cmdlet again and it showed “Test passed” ! It was because of the missing SMTP address in the ProxyAddresses field of the user located on Active Directory.

And Guess what again ? I just closed, removed all the cache, then opened Skype for Business on my Android and all the Conversation History is loaded ! IT WORKED!!

I have done the same procedure for another user having SfB on iPhone and it worked!

So the point is that integrating SfB on prem and Exchange online may have working from the beginning if we have, for example, an Hybrid Exchange shared between on premise and online. Because the Exchange on-prem should have already populated that SMTP entry in the ProxyAddresses field. But here we were on PURE Skype for Business on prem and PURE Exchange on Cloud.

And finally, the hybrid scenario of SfB on-prem with Exchange Online DO support Server Side Conversation History, not as it’s said in some forums.
I have a proof! I have a customer running Server Side Conversation History flawlessly with a such deployment scenario. Don’t be mistaken.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s