Tuesday, November 7, 2017

Updated build of Instant Chime for Microsoft Skype is available

Last week we released an updated build of Instant Chime (2.6 SR9).  The updated release includes a set of UI updates to cover all of the changes that we wanted to make regarding accessibility - especially in the admin and manager areas.

The release notes are here: http://www.addchime.com/release-notes.html

Here is a quick list of the updates:

Address accessibility issues (tabbing and contrast) for manager and admin modules
Add a new report detail Accepted vs Declined/Ignored per agent 
Message to acknowledge when an agent declines a chat session
Address issue where session history search wasn't respecting end dates - #3208
Add PDF/TXT export for session details (chat transcript + session info) - #2876 
Fixed an inconsistency with the Average Duration statistic on the Queue Dashboard - #3264
Fixed Tabbing navigation issues on the Guest Dashboard, Manager Sections, and in the Admin area - #3209
Added in better focus/visual indicators for all nav elements in Accessibility mode - #3210
Slight changes to the Agent Dashboard UI 
Added in Enhanced UI for the Agent Assist Tool (2) 
Chime now has integration with Microsoft Teams (3)

We have also included a few new features requested as part of several large deployments. 

Friday, March 31, 2017

Chime for Lync 2.6 - User Interface Localization

Along with the guest landing page and other enhancements that I mentioned in previous posts, we are also adding text localization capabilities to our next release.

In the most recent version of Chime, the UI is only available in English. However, we realize that this is not convenient for all of our customers, especially those who do not have English as their primary language. We would like to provide the option of viewing the Chime application in our customers' native languages.

With Chime 2.6, you will have the option of viewing Chime in the following languages:

  • German
  • Spanish
  • French
  • Finnish
This means that if you would like to view Chime in German, you will simply choose German in the UI, and all of the translations are done for you immediately. These features will be available out of the box, with no extra configuration on the customer's side.

Is there a language that you would like us to add translations for? If so, we would love to hear from you! Please let us know in the comments or e-mail us at sales@instant-tech.com.

Thank you for reading. Please visit http://addchime.com for more information on the Chime service desk application.

P.S - I will be adding screenshots soon!

Friday, March 10, 2017

Improved Chat Routing with Skill Tags - What's Next with Chime

Chime is already a great way to improve customer service, as well as agent efficiency in a service desk environment, but we are always looking for ways to improve Chime and add features that make it easier on both customers and service desk agents.

Chime is built on a robust routing engine that has the ability to use specific chat routing methods when looking for an available agent to help. When someone is looking for help and starts a chat using Chime, there are multiple different ways that Chime can go about finding the right agent.

We offer 3 different chat routing methods that are available out of the box. All of the Chime routing options exclude agents who are not set as 'available' in Lync/Skype for Business, so if an agent is set as 'busy' or 'away', they will not get chosen for incoming chat requests.

The most basic routing method, which is called the hunt, goes from one available agent to the next until one of them picks up the chat. There is no specific order in which agents are chosen with this routing method.

The second routing method is Longest Idle, which chooses the agent who has not accepted any chats for the longest period of time (compared to other agents). For example, if Jane has accepted 3 chats in the past hour, but John has not serviced any chats in the past 1/2 hour, the next chat request that comes in will be assigned to John.

The third chat routing method is built around the concept of 'Skill Tags'. Skill tags can be associated with specific agents, so if Jane is great at handling password resets and account information, she might have the 'Password' skill tag. Since John is an expert at hardware, he might have the 'Hardware' skill tag. When a customer starts a chat in the web client, they will see a list of the available categories (which are the skill tags) to choose from, in order to connect with the right agent.

In the next release of Chime, we have made updates to the skill tag routing functionality, and added some additional features so that skill tags can be fully utilized. Here are some updates we have made:

1. Skill tags will be defined at the queue level, and can be associated with agents from there.
2. Routing using skill tags is now available with Lync/Skype for Business chats, since previously it only worked with Chime web client chats.

In Chime 2.6 it will be a straightforward process to add skill tags, and then associate those skill tags with agents, since all of it can be done within the settings for each queue.

In both Skype for Business chats and Chime web client chats, incoming users will see a list of all problem areas, or skill tags, and then choose which one is most relevant. The skill tags are completely customizable, and each queue can have a different set of skill tags.

Here are some screenshot examples of the user experience in Lync/S4B:

Thank you for reading, and I hope to hear from you at support@instant-tech.com with any questions!

Friday, February 24, 2017

Next Generation of Chime Service Desk - Coming Soon

Hi there,

I want to give you a glimpse into what the next upcoming release of Chime will look like. In Chime 2.6, we want to focus on improving the customer experience, so the UI has been completely reconstructed to make it easy for people who are looking for help.

There are two areas we have added to Chime: a Chime landing page, and a Guest Dashboard. The Chime landing page is what users will first see when they log into Chime. From a user's perspective, in order to eliminate confusion for all users, the Chime landing page allows people to choose the category they need help with by using skill tags such as password reset, hardware issues, and other common issues. Next, the user chooses the mode of communication they wish to use: a Skype for Business chat, or the Chime web chat. Then Chime will open up that chat for them.

The Chime Guest Dashboard is an additional page for users to access where they can view all of their previous interaction with the help desk. Some of the things they will see on the Guest Dashboard are chat history, chat ratings, alert notifications, and options for starting a chat.

The Chime landing page and Guest Dashboard is a helpful way to give users a quick and easy way to contact the help desk, as well as transparency into their previous chat conversations.

Here is what the Chime landing page looks like:

Here is the Guest Dashboard:

These are just some of the improvements that we have worked on in order to enhance the user experience, and eliminate as much confusion as possible.

Thank you for reading!

Tuesday, January 31, 2017

Delete all Exchange mailbox content using PowerShell

This can be a useful script for anyone who has the need to delete the entire contents of an Exchange mailbox. We have some test accounts that can get overridden with emails if they're not cleaned out. This script prints out a summary of how many items are in the mailbox and then deletes them all. It was tested against Exchange server 2013.

$id = "user@acme.com"

#See how many items are in mailbox
Get-MailboxFolderStatistics $id | Select Identity, ItemsInFolder

#Delete items in mailbox
Search-Mailbox -Identity $id -DeleteContent -force

Solving Exchange server 2013 out of disk space

I ran into a problem a little while ago where our on-premise Exchange 2013 environment was acting weird. An EWS (Exchange Web Services) application we have was behaving oddly such as throwing ServiceResponseExceptions with messages like "the folder in which items were to be saved could not be found". After some digging, I discovered that there was virtually no available disk space on the Exchange server. This environment had been a vanilla set-up to perform some tests with EWS and there had been load going on and off for months.

After some digging the following discussion on SpiceWorks helped solve the problem (discussion here). The issue was that by default Exchange does not purge any logs, and since we did not have any routine back-up or clean-up occurring, they were growing un-checked. 
"Exchange Server database transaction logs record all changes to an Exchange Server database. Over time, these log files accumulate and use all the available disk space if they are not periodically removed from the hard disk." (ref)
By using Scanner, I confirmed that the fat cat on the server was the Exchange logging. For our environment, we didn't care about backing up changes to the database. For this case, enabling circular logging was the solution because it enabled the Exchange server to automatically get rid of unnecessary log files and by so freeing up disk space. I used the directions here to enable circular logging, which involved dismounting and remounting the database.

Once that was done, I used this suggestion:
"To speed up new log file creation and the automatic deletion process, you can send yourself an e-mail message with a 5-megabyte (MB) attachment" (ref)
Oddly enough, it worked and shortly thereafter the Exchange server's available disk space increased and the EWS application behaved normally again.





Create Lync-enabled Active Directory users in bulk with PowerShell!

This blog post explores how to create Lync-enabled users in Active Directory in bulk using PowerShell. This is a general outline for creating a bunch of generic accounts in Active Directory and then configuring them to be able to sign on to Skype for Business. This is tested against Skype for Business server 2015. The use case here is how to create a bunch of accounts for load testing.

The accounts will look as follows:

Windows logon (username): TestUser01
First name: Test
Last name: User 01
Display name: Test User 01
Email: TestUser01@acme.com
Password: default_password01!

This pattern will be used to create 1000 test user accounts.

Step 1: Create users in Active Directory

This script uses the ActiveDirectory PowerShell module. The variables startIndex and endIndex can be modified to create different ranges of users, for example if you need 25 more users at some point, you could change the startIndex to 1001 and the endIndex to 1025.

Import-Module ActiveDirectory
$startIndex = 1;
$endIndex = 1000;
$totalusers = $endIndex - $startIndex + 1

Write-Host "Starting"

for ($i=$startIndex; $i -le $endIndex ; $i++) 
 $userID = "{0:00}" -f ($i)
 $userName = "TestUser$userID"
 $givenName = "Test" 
 $surname = "User $userID" 
 $displayName = "$givenName $surname"

Write-Host "Creating AD user" ($i) "of" $totalusers ":" $userName

New-ADUser `
 -Name $userName  `
 -Path  "OU=MyFooBar,DC=Acme,DC=com" `
 -EmailAddress ("$userName@acme.com")`
 -SamAccountName $userName `
  -GivenName $givenName `
  -Surname $surname `
  -DisplayName $displayName `
 -AccountPassword (ConvertTo-SecureString "default_password01!" -AsPlainText -Force) `
 -Enabled $true

Write-Host "Done"

Step 2: Enable users in Skype for Business 2015

This script uses the pattern we know that our test users are created from to identify users by their display name and enable them in Lync.

$lyncServer = "myLync1.acme.com"
$domain = "acme.com";
$startIndex = 1;
$endIndex = 1000;
$totalusers = $endIndex - $startIndex + 1

Write-Host "Starting"

for ($i=$startIndex; $i -le $endIndex ; $i++) 
 $userID = "{0:00}" -f ($i)
 $userName = "TestUser$userID"
 $givenName = "Test" 
 $surname = "User $userID" 
 $displayName = "$givenName $surname"

Write-Host "Enabling AD user for Lync " ($i) "of" $totalusers ":" $userName

Enable-CsUser -Identity $displayName -RegistrarPool $lyncServer -SipAddressType SamAccountName -SipDomain $domain

Write-Host "Done"

Thursday, September 1, 2016

EWS: Basic references

EWS Managed API

I've been working with EWS over the last few months and I've amassed a list of my favorite resources on this topic. I wanted to share this list with the hope that it would save someone time getting accustomed to the technology. One beginner tip- there is EWS and EWS Managed API. Sample code for the two are often listed next to each other and can be confusing for a new programmer. When you see EWS, think SOAP protocol (XML requests and responses), and when you see EWS Managed API, think C# code. The EWS Managed API is available as a NuGet package (Microsoft.Exchange.WebServices) for Visual Studio or by download link, here. Without further ado, I give you my favorite basic resources.

EWS Managed API, EWS, and web services in Exchange
This is a pretty excellent high-level overview of what EWS is, how you can use it, and pointing you to more information on your area of interest.

EWS Best Practices
This is a list of links as well, but it will be updated by the author, whereas this list is not guaranteed to be. It's a great place to start as a beginning and return to when you have a better grip of what EWS is.

Get started with "Hello World!"
So you want to get a summary paragraph and jump right into creating a project? This is the place to start. Although, as soon as you're done, I recommend circling back to the EWS Best Practices 

EWS Managed API reference
This is for the when you're feeling adventurous and are ready to dive a little deeper into exploring the Microsoft.Exchange.WebServices namespace.

Links of Common EWS Questions
This is also, a list of links, but the common questions are here. Watch out, this is an old reference and some articles might be out of date. Once you have an idea of what your question is, or the answer is, check for an updated reference on the web.

EWS Throttling in Exchange
Eventually you might be dealing with load, and this is a must read for learning about throttling for EWS in Exchange.

EWS: Sending a collection of e-mails using CreateItems

Exchange Web Services (EWS) is an API for getting and sending content to an Exchange server. This post will explain how to send a collection of e-mails with one call to EWS, and identify one if it's shortcomings.

First you will need a list of Item objects. In EWS, the Item class is a generic item. Classes such as Appointment, Contact, ContactGroup, EmailMessage, PostItem, and Task all inherit from the Item class. As such, the CreateItems() method can create any object that inherits from the Item class. This example, will demonstrate using EmailMessage objects to create real e-mails.

List<Item> items = new List<Item>();
EmailMessage email_1 = new EmailMessage(_service)
    ToRecipients = { new EmailAddress("foo@bar.com") },
    Subject = "Hello",
    Body = "Hello World!"
EmailMessage email_2 = new EmailMessage(_service)
    ToRecipients = { new EmailAddress("foo2@bar.com") },
    Subject = "Hello 2",
    Body = "Hello World!"


Then, pass the list of Items to the CreateItems() method.

ServiceResponseCollection<ServiceResponse> responseCollection = _service.CreateItems(items, inboxFolder.Id, MessageDisposition.SendOnly, null);

That's it. 

There are limitations on the number of items you will be allowed to send at once due to Exchange server policies on throttling, etc. Next, consider adding an attachment to these e-mails..


Then, if we try to create these e-mails with attachments using the CreateItems call again, this time it will not work. This is because, "under the hood, the workflow for sending emails with attachments is: CreateItem, CreateAttachment, and then SendItem. CreateItems is a batch of CreateItem calls, it doesn't contain the workflow to break out items with attachments" (referencing StackOverflow post)

So, the way to send e-mails with attachments using EWS is one at a time, and the way to send a group of emails without attachments is using CreateItems.



EWS: Throttling policies on bulk operations

Exchange Web Services (EWS) Managed API is a fantastic API that lets you do a whole lot of interesting things from C# code that allows the program to interact with Exchange. EWS has bulk operations, such as CreateItems, that let's a program send up a bundle of items from C# code to be created by the Exchange server.

The downside to this is that the Exchange server has quite a few throttling policies that it imposes on groups or individual accounts. This has the effect of squandering efforts to perform large bulk operations when it exceeds a particular throttling policy. This is because the Exchange throttling policies are like a cop pulling over speeding drivers, they don't let one driver run everyone off the road, rather a connection has to stay within the limits defined by the throttling policies. A grand overview of EWS throttling policies in Exchange 2013 server are outlined here.

This blog post attempts to outline what Exchange 2013 throttling policies might be run into using EWS to perform bulk Mail operation for creating mail items (i.e., just the CreateItems call  to create emails and not dealing with Calendar, Contact, or Meeting items) and how to appropriately change them. Reading up on EWS best practices is highly encouraged so that ramping down throttling policies is not used as an improvement for faulty code. Then, when its decided that its still necessary to fiddle with the throttling polices, definitely read up on the best practices for EWS throttling. The most important point to remember might be that Exchange throttling policies effect not only EWS, but also client connection to the server for other programs like Outlook and ActiveSync. If you're not sure whether Exchange is throttling your program you can check the EWS logs on the Client Access server (CAS) to investigate whether operations are being throttled.

This MSDN article is the most helpful to get started, as it outlines the specific throttling policies that effect EWS in Exchange 2013. The policies below are pulled from that list, with the italicized description from MSDN, followed by an explanation as to why they might come into play using the batch request CreateItems:

  • EwsCutoffBalance
    • MSDN - "Defines the resource consumption limits for EWS user before that user is completely blocked from performing operations on a specific component."
    • The CreateItems call consumes resources on the Client Access server (CAS). When this limit is exceed the server may return errors like "the operation has timed out". From researching EwsCutoffBalance policy further, it seems to be defined by the total number of milliseconds an EWS connection is consuming a specific resource. In other words, if an EWS operation takes longer than the EwsCutoffBalance (in ms), then the operation will time out. 
  • EwsMaxBurst
    • MSDN - "Defines the amount of time that an EWS user can consume an elevated amount of resources before being throttled. This is measured in milliseconds. This value is set separately for each component."
    • This throttling policy is a little bit easier to understand from its name and description. EwsMaxBurst is expressed in milliseconds. This should be less than EwsRechargeRate.
  • EwsRechargeRate
    • MSDN - "Defines the rate at which an EWS user's budget is recharged (budget grows by) during the budget time."
    • This throttling policy is also expressed in milliseconds. When a resource is being throttled by say the EwsMaxBurst or EwsCutoffBalance policy, it will start to recharge at the rate defined by this policy. Presumably, the throttling policy will be "recharged" in the time defined by EwsRechargeRate, but more research and testing needs to be done to be sure.
  • EwsMaxConcurrency
    • MSDN - "
    • Defines the number of concurrent open connections that a specific user can have against an Exchange server that is using EWS at one time. The default value for Exchange 2013 and Exchange Online is 27. 
    • This policy applies to all operations except for streaming notifications.
    • "
    • This policy is worth noting because there may be concurrent connections going on while one is making a call to the CreateItems bulk operation.

The first three policies above are all measured in milliseconds, and should be ordered in this way:
EwsMaxBurst < EwsRechargeRate < EwsCutoffBalance

This has been an intermediate look at what EWS throttling policies should be considered for changing when using the bulk operation CreateItems.


Thursday, July 28, 2016

How to handle SQL command timeouts in .NET code

If you're a .NET programmer you might be familiar with using SqlConnection and SqlCommand objects to perform database queries.

They might look something like this:

You might think the liberal use of 'using' statements disposes of all the resources that might still be lingering around after execution of this method completes. You might think that there are no 'leakages' happening here. This might be true in most cases however this blog post is going to pose a counter-example.

Consider the scenario where just before the process releases the "Exclusive (X) lock" it has on the resource it is INSERTing, the command timeout expires.

Now what happens?

The command timeout expiration event causes SQL execution to stop immediately for this process. The COMMIT command that follows implicitly from the INSERT statement above is never executed. A Senior Escalation Engineer at Microsoft, Bob Dorr, has the following to say about command timeouts:
At the time of the [command timeout] the transaction is not rolled back unless transaction abort (XACT_ABORT) has been enabled.  The client needs to submit a rollback.  If the client does not submit the rollback and continues other processing the transaction remains open and the behavior scope of the application becomes undefined.
What Bob Dorr is saying is that in the above code, MyInsertMethod1, fails to defensively handle the command timeout exception because it does not end the transaction if such an exception occurs. The transaction can be ended by a COMMIT or ROLLBACK. Furthermore, the side effects of this are not good. The transaction still holds onto any locks that it has, or in other words the transaction is still open and it will "leak".

To fix this, we should catch the command timeout exception and explicitly commit or rollback the transaction to close it properly.

"Stale" SQL transactions that are not closed properly can cause poor database performance. They can cause other transactions to block on any locks that they have, thus causing more command timeouts and the problem can snowball.


SET IMPLICIT_TRANSACTIONS - https://msdn.microsoft.com/en-us/library/ms187807.aspx

How it Works: Attention, Attention or Should I say Cancel the Query and Be Sure to Process Your Results - http://blogs.msdn.com/b/psssql/archive/2008/07/23/how-it-works-attention-attention-or-should-i-say-cancel-the-query-and-be-sure-to-process-your-results.aspx 

CommandTimeout - How to handle it properly? - http://blog.sqlxdetails.com/commandtimeout-how-to-handle-it-properly/

CommandTimeout - How to handle it properly? - code example - http://blog.sqlxdetails.com/commandtimeout-how-to-handle-it-properly-code-example/

How to Minimize SQL Server Blocking - http://www.sql-server-performance.com/2006/blocking/

Wednesday, June 22, 2016

EWS: How to "spoof" an e-mail in your Inbox without sending it

A few weeks ago I was looking for a way to "spoof" an e-mail in my Inbox using EWS. The e-mail would be to and from users other than myself. Without going into too much detail, the reason for this was I wanted to use my Exchange Inbox as a place to store messages for a group of people, even if I wasn't a sender or recipient of the message, and I didn't want the users to receive these e-mails that I was storing.

I was unlucky then, but yesterday when researching another topic I found the answer in this Microsoft article, How to: Import items by using EWS in Exchange! I hope the wording in the blog post grabs people that are looking for the same thing that I was. I never would have found the above mentioned article from how I was searching in the first place.

The trick is setting a specific property on the EmailMessage that makes it not appear as a Draft before Saving it in my Inbox.

EmailMessage email = new EmailMessage(_ewsService);
// Indicate that this email is not a draft. Otherwise, the email
// will appear as a draft to clients.
ExtendedPropertyDefinition PR_MESSAGE_FLAGS_msgflag_read = new
     ExtendedPropertyDefinition(3591, MapiPropertyType.Integer);
email.SetExtendedProperty(PR_MESSAGE_FLAGS_msgflag_read, 1);
// Set To/From properties to whatever I like
email.From = new EmailAddress("santaclause@northpole.edu");
email.Body = new MessageBody(BodyType.Text, "Hey, need a hand hiding
     candy this year? -S.C.");

What appears is an e-mail in my inbox from Santa Clause to the Easter Bunny. It looks like a normal e-mail not a Draft that I'm working on. The only odd thing (other than it's an e-mail in my Inbox and I'm not a recipient) is that it doesn't appear as an unread e-mail. It looks like an e-mail that I've already read by default.


Thursday, June 16, 2016

Developing OAuth with Skype Web SDK: admin pre-requisites

This blog post will cover the system-level steps an Office 365 administrator needs to do in order to "turn on" the Skype Web SDK functionality for code being written with OAuth authentication. Some of these steps may sound familiar if you've read the previous post "UCWA 2.0 and Skype for Business online: Create an Azure AD application". What you will need to accomplish this task is the Sign-on URL and Reply URL for the web application that will be using OAuth and Skype Web SDK. If you're unsure of either of these talk with the developer that will be configuring the web application.

Link Azure and Office 365 accounts together

This step is outside the scope of this article, but it is worth noting. This Microsoft reference "Set up your Office 365 and Azure AD tenant" provides more information.

Create an Azure AD application

To start, this step will be a modified version of the directions from Microsoft's page "Registering your application in Azure AD".  Follow the directions from both sections, register your application with Azure AD and configure your app for OAuth implicit grant flow.

After provisioning the application in step 6, be sure to configure the application's Reply URL. This step isn't mentioned in the Microsoft directions. Another modification is at step 9 under registering your application, select as many of the delegated permissions as desired. For example, the permission "Read and manage Skype for Business user contacts and groups" is required to add or edit contacts and groups in the buddy list. At step 10, do not configure your application to be multi-tenant if it doesn't need to be.

After the above steps are completed, some values from the configuration page should be stored for yourself and others. Any developer or application that will be using the Skype Web SDK will need to know the Client ID and have a Key. To generate a Key, select a duration and save the changes. The Key will appear once it is saved.

Tenant admin consent

Microsoft explains this section best, from their reference "Developing Web SDK applications for Skype for Business Online",
The Skype for Business Online permissions are tenant administrator consent only. For an app to be used by all users of an O365 tenant, a tenant administrator must provide consent. To provide consent for all users in the tenant, construct the following URL for your app as shown in the example below.
Note: update the Client ID and Reply URL (redirect URI) for your app.

    &client_id= ...

After the admin grants consent for the tenant, Microsoft will attempt to redirect you to the Reply URL. If you enter the wrong Reply URL, after the admin gives consent a Microsoft error page will appear and in the tiny error message at the bottom it will say, the reply address 'your Reply URL' does not match the reply addresses configured for the application: your Client ID. If the web app is not running at that time, you will see a browser "ERR_CONNECTION_REFUSED" error.