Quantcast
Channel: mlamontagne – Real-Time UC
Viewing all 47 articles
Browse latest View live

Test-IPV (Internet Point of View) PowerShell GUI

$
0
0

Test-IPV is a PowerShell script leveraging the LyncValidator back-end Web Services APIs ( http://masteringlync.com/2014/07/15/using-tcpudp-port-checker-web-service/ ) to provide an Internet Point of View collection of tests. Commands run from console or GUI wrapper. Although leveraging the LyncValidator APIs, this tool is not exclusive to testing Lync.

Video Demos:

Tests:

  • Port Checker: Testing of TCP and UDP services.
    porttest

    conporttest

  • DNS Checker: Testing of A and SRV records.
    dnstesta

    dnstestsrv

    condnstest

  • Certificate Validation: Checks based on custom API from DigiCert.com designed for the http://lyncvalidator.com project.
    certtest

    concerttest

  • Office Web Apps Server Validation: Tests if the Web Application Open Platform Interface (WOPI) could be found.
    owastest

    conowastest

  • Lync External Scan: Scans standard SRV & A Records to enumerate additional DNS, Ports, OWAS and certificates.
    lynctest

    conlynctest

Notes:

  • Test-IPV without parameters will launch GUI
  • Requires PowerShell v3 or greater
  • Requires Internet Connectivity
  • Not limited to Lync
  • Script is Code Signed using DigiCert
  • LyncValidator Web Services API Demo Key is not currently set to expire but is subject to change. Location:[HKEY_CURRENT_USER\Software\RealTimeUC\LyncValidator] APIKey (String)

Download: Test-IPV: http://gallery.technet.microsoft.com/Test-IPV-Internet-Point-of-26b552a7


Skype for Business/Lync client: Can’t move user to the Other Contacts group

$
0
0

While working with a client on end user training material, it was reported that the option to move or copy a contact to the “Other Contacts” group in the Skype for Business/Lync 2013 client was unavailable.

muoc-01

Digging deeper… I found that although the option to “Copy Contact To” was available for a contact within the “Other Contacts” group, it would just perform the “Move Contact To” function.

muoc-02

Testing with my own account, I found that move and copy a contact to “Other Contacts” was available and worked. Also copying a contact already in “Other Contacts” to another group did a copy vs. move like seen before.

muoc-03

Then it dawned on me that the working account was using the Unified Contact Store (UCS) and the issue account was not. Same results were seen using different builds of the Skype for Business/Lync 2013 & 2010 clients. Figuring this would be a perfect issue to play with the Lync Client SDK: http://www.microsoft.com/en-ca/download/details.aspx?id=36824

The following code was used to quickly load the SDK dll into PowerShell, prompt for the SIP address of the contact you would like to add into the “Other Contacts” group.

$sdkPath = "C:\temp\Microsoft.Lync.Model.DLL"
Import-Module $sdkPath

# Obtain the entry point to the Lync.Model API
$client = [Microsoft.Lync.Model.LyncClient]::GetClient()
$self = $client.Self		
$Contact = Read-Host -Prompt 'SIP address of contact to copy to Other Contacts group'

$contactobj = $self.Contact.ContactManager.GetContactByUri($Contact)
# $contactobj
$Groups = $self.Contact.ContactManager.Groups

	foreach ($Group in $Groups) {
		if($Group.Type -eq "CustomGroup"){
			if ($Group.Name -eq "Other Contacts"){
				if($group.Contains($contactobj) -eq $false){
					$Group.BeginAddContact($contactobj,$null,$null)
				}
			}
		}
	}

This worked great for the UCS account but gave an “Access is denied” error on the non-UCS account.

muoc-04

Listing the contact groups ($Groups |Fl) for the non-UCS account, I found the contacts not in the “Other Contacts” group still showed “Other Contacts” in the list of CustomGroups.

muoc-05

I then tried using the “Move to Group” function on the non-UCS account and it worked…

#$Group[0] is Other Contacts group
#$Group[1] is Test group
#$Group[2] is AOG group
$contactobj.BeginMoveToGroup($Groups[0], $Groups[2], $null, $null)

muoc-06

Which was great until the contact was in more than one contact group.

muoc-07

In the end I just ended up removing the contact object from all groups and just re-added to the “Other Contacts”.

$self.Contact.ContactManager.BeginRemoveContactfromallgroups($contactobj, $null, $null)
$Groups[0].beginAddContact($contactobj,$null,$null)

muoc-08

The question: Is not being able to move or copy contacts into the “Other Contacts” a bug when not using UCS? Or the ability to use Other Contacts like any other custom group a bug in UCS?

Phantom Conference Bridge

$
0
0

While verifying a new conference bridge for a client, I came across a phantom conference bridge entry listed on the Lync Server Dial-in page but not on the Outlook meeting invites.

pcb1

Using Get-CsDialInConferencingAccessnumber cmdlet which lists information about all dial-in conferencing numbers configured in an organization and the region parameter to search for the specific entry. A warning was returned saying the contact object for the entry could not be found. Looks like the bridge was leftover from the OCS days. Record the “Line URI” listed in the warning message.

get-csdialinconferencingaccessnumber -region "<RegionName>" -Verbose |FL

pcb2

First step was to recreate the region that was associated to the phantom bridge. This was done by creating a new User Dial Plan with the “Dial-in conferencing region” exactly matching what was listed on the Dial-in page for the phantom bridge.

pcb3

Next create a new Dial-in Access Number where the “Line URI” matched what was returned in the warning from the get-csdialinconferencingaccessnumber, and add the “Associated Region” that was created in the last step.

pcb4

Running the same get-csdialinconferencingaccessnumber as before will now display the contact object.

pcb5

Now delete the new Dial-In Access Number and the User Dial Plan that was created for the phantom bridge and invoke CMS replication (invoke-csmanagementstorereplication). Running the get-csdialinconferencingaccessnumber command will now show no object and the phantom bridge will be removed from the Dial-in page.

pcb6

pcb7

As a side note you may have noticed in the screenshots I’m using csdialinconferencingaccessnumber vs. get-csdialinconferencingaccessnumber, not sure if the cmdlet was just too long to type or it was late. After taking to Twitter about this “Feature”, Ravikanth Chaganti recommended I trace what’s actually happening.

trace-command -ex { csdialinconferencingaccessnumber } CommandDiscovery -PSHost -Verbose

One of the last steps when PowerShell is unable to find a command is to prepend the command with “get-“.

pcbn

Update: Looks like Andrew Morpeth blogged about a similar stuck conferencing number, see his post: https://ucgeek.co/2015/03/remove-stuck-conferencing-number-lync/

Lync conference bridge is in another call

$
0
0

While testing a new conference bridge that was added to an existing Lync Server 2013 deployment, the Lync client would report the bridge number “is in another call”.

ciac01

Sifting through server side logs the call was bouncing around like a hot potato between the Front End and Edge servers. The Front End would try to look up the object and return a “SIP 404 Not Found” (ms-diagnostics: 1003;reason=”User does not exist”;destination=”RtcApplication-86d18fa5-3a18-43f6-aef8-c7b3c76c086b@domain.com) and pass the request on to the Edge. The Edge would pass back the same SIP 404 error.

ciac03

ciac02

On to some trouble shooting steps… Removing and recreating the bridge, restarting the Conferencing Attendant and Conferencing Announcing Services and finally a Front End pool restart. No luck, back to the server logs. This time instead of searching a specific call, I broadened the filter to “RtcApplication”. Finding that all Application Contacts (RGS Presence Watcher, Call Park Service, CAAPrivateContactObject, Conferencing Announcement Service …) in the environment were giving 404 Not Found/User does not exist errors.

ciac04

Digging into Active Directory(AD) (I like to use Active Directory Explorer from Sysinternals: https://technet.microsoft.com/en-us/sysinternals/bb963907), I could see that all the corresponding Application Contacts exist from the server log. The msRTCSIP-ApplicationContacts container class was originally added in Office Communications Server 2007 R2 and a good TechNet article about the contact objects can be found at https://technet.microsoft.com/en-us/library/dd572377(v=office.13).aspx. Haven’t found an updated version for Lync or Skype for Business.

ciac05

Now is probably a good time to inform you that in this environment the Lync Servers were installed into a Child domain with the User objects and the Root domain was empty. I wouldn’t say it was a Null root as the Application Contacts were in the root domain. So after spinning cycles verifying Schema, Forest and domain(s) prep, permissions and passing AD queries between the domains every thing seemed correct with no errors.

Next to check out the User Replicator, as this periodically retrieves current user account info from Active Directory and synchronizes the information with the Lync Server’s user data database.

Get-CsUserReplicatorConfiguration

ciac06

At some point the client scoped Lync to be restricted to the Child domain, not realizing that the Application Contacts were outside this scope. This wasn’t a problem in an Instant Message and Presence world, but sure was after adding conferencing and enterprise voice! Luckily three commands and the conference bridge was functional.

Set-CsUserReplicatorConfiguration -Identity global -ADDomainNamingContextList $Null
Update-csuserdatabase
Update-csaddressbook

ciac07

Bulk provisioning Office 365 licenses and services script

$
0
0

Working with a client to ease the transition of Office 2010 (MSI) using KMS licensing to Office 2013/2016 (Click-to-Run) with subscription licensing to use the new Skype for Business client. It quickly became apparent that enabling thousands of globally dispersed users for a certain feature set via Office 365 Admin Portal wasn’t going to work. PowerShell always to the rescue!

Script Download: BulkO365LicenseServices.ps1 https://gallery.technet.microsoft.com/Bulk-provisioning-Office-f64747d5

First, we have some prerequisites to connect to Microsoft Online and Active Directory(AD) via PowerShell:

The following is a breakdown of the core logic in my script, minus the reporting, error handling and loops…

Load required modules and test connectivity.

Import-Module ActiveDirectory
Import-Module MSOnline
Connect-MsolService #Sign in using account with appropriate licensing permissions
Get-MsolDomain

bls1

Figure out the Account SKUs associated to the Office 365 Tenant, available licenses and the specific services to choose from. The most complete list I’ve found for the breakdown of services for each SKU can be found at: http://blogs.technet.com/b/treycarlee/archive/2013/11/01/list-of-powershell-licensing-sku-s-for-office-365.asp (don’t forget to check the comments).

Get-MsolAccountSku | %{$_.accountskuID;Write "Remaining Licenses:";($x =$_.ActiveUnits - $_.ConsumedUnits);$_.ServiceStatus|ft -hide}

bls2

It’s counterintuitive, but when applying specific Office 365 services from PowerShell you apply a list of services you want disabled vs. the services you want.

The easiest way to figure out which services to disable or enable is to configure a single account using the Office 365 Admin Portal and review via PowerShell.

Get-MsolUser -UserPrincipalName test2@lamontagnesolutions.com |%{ $_.licenses.servicestatus}

bls4
bls3

Make sure your licensing script takes into account when Microsoft changes or adds a new service. You’ll need a way of comparing enable services to available services, giving a disabled list.

#AccountSKU to use
$AccountSKUID = "LaMSol:ENTERPRISEPACK"
#list of Enabled services
$SubLicense = ("RMS_S_ENTERPRISE","OFFICESUBSCRIPTION","MCOSTANDARD","SHAREPOINTWAC","SHAREPOINTENTERPRISE")
get-msolaccountsku | Where {$_.accountSkuID -eq $AccountSKUID } | Select -expand "ServiceStatus" | select -expand "ServicePlan" | select ServiceName | Where {$SubLicense -notcontains $_.ServiceName}

bls5

Grab users and additional attributes based on AD OU.

#User OU's distinguishedName attribute
$OUsearch = "DC=lamontagnesolutions,DC=com" 
get-aduser -Filter * -Searchbase $OUsearch -properties mail,Country| ?{ $_.Enabled -eq 'True'} |Ft name,userprincipalname,mail,country

bls6

Search for Microsoft Online user using either the mail or userprincipalname attribute as the cloud User Principal Name (UPN).

#Using user's Active Directory Mail attribute to find MSOl User. 
$upn = (get-aduser Test2 -Properties mail).mail
#To use UserPrincipalName instead to find MSOl User:
#$upn = (get-aduser Test2).UserPrincipalName
Get-MsolUser -UserPrincipalName $upn

bls7

Is the user licensed for the specific Account SKU?

Get-MsolUser -UserPrincipalName test2@lamontagnesolutions.com | ?{ $_.isLicensed -eq "TRUE" } | ?{ ($_.Licenses | ?{ $_.AccountSkuId -eq $AccountSKUID}).Length -gt 0}

<bls8

If the user is already licensed for the specific Account SKU, confirm/enable required services. Don’t disable additional enabled services as these might be pilot users.

$disabledServices = (Get-MsolUser -UserPrincipalName test2@lamontagnesolutions.com).Licenses.servicestatus | where {$_.ProvisioningStatus -eq "Disabled"} | select -expand serviceplan | Select ServiceName
$disabledServices = $disabledServices | where {$SubLicense -notcontains $_.ServiceName}
$disabled = @()
foreach  ($item in $disabledServices.servicename) {$disabled += $item}
$LicenseOptions = New-MsolLicenseOptions -AccountSkuId $AccountSKUID -DisabledPlans $disabled
set-msoluserlicense  -userprincipalname test2@lamontagnesolutions.com -licenseoptions $LicenseOptions

bls9
bls10
bls11

If the user isn’t licensed, set location based on AD country attribute or manual country code then add Account SKU with required services.

$Location = (get-aduser Test1 -Properties country).country
#$Location = "CA"
$disabledServices = get-msolaccountsku | Where {$_.accountSkuID -eq $AccountSKUID } | Select -expand "ServiceStatus" | select -expand "ServicePlan" | select ServiceName | Where {$SubLicense -notcontains $_.ServiceName}
$disabled = @()
foreach  ($item in $disabledServices.servicename) {$disabled += $item}
$LicenseOptions = New-MsolLicenseOptions -AccountSkuId $AccountSKUID -DisabledPlans $Disabled
Set-MsolUser -UserPrincipalName test1@lamontagnesolutions.com –UsageLocation $Location
Set-MsolUserLicense -User test1@lamontagnesolutions.com -AddLicenses $AccountSKUID -LicenseOptions $LicenseOptions

bls12
bls13
bls14

Download: BulkO365LicenseServices.ps1 https://gallery.technet.microsoft.com/Bulk-provisioning-Office-f64747d5

BOC Call Recorder Review

$
0
0

Today a tweet from Doug Routledge @droutledge from Bridge Communications caught my eye:

CR1JPG

BOC Call Recorder is a free client side call recording application enabling on-demand or automatic call recording for Windows (Vista, 7, 8, 8.1 and 10) Skype for business and Lync 2013 clients, no matter where the server infrastructure is located (on-premises, hosted or cloud). The call recorder is optimized for post call conversion of the 2 channel recordings to a single MP3 file, seeing a 40 minute 600 MB conversation converted to a 7 MB MP3. On-demand recording can also work with other voice communication software.

The BOC Call Recorder can be found at: http://www.bridgeoc.com/lync/products/recorder.htm
The free download does require a small form to be completed and the download link is received via email.
CR2JPG

After downloading the ~8 MB file, run the BOCCallREcorder.exe setup (requires administrative rights).
CR3

Set the installation directory and agree to the license terms.
CR4
CR5
CR6

Launch BOC Call Recorder from the desktop icon.
CR7

Watch out for the giant splash screen.
CR8

First launch will bring up the tool bar as well as the settings dialog. Within settings you can configure the microphone and speaker devices, recording folder and size limit, auto recording and check for updates.
CR9

Thoughts:

  • BOC Call Recorder functions as advertised and simple to install
  • I was able to auto record a Skype for Business call without interaction as well as on-demand recording
  • Rather see the BOC Call Recorder in the system tray instead of the taskbar
  • Would like the ability to start automatically with Windows
  • Would like to see an option to play a message on record due to any legal and consent requirements. Example “This call is being recorded”.

Update: Since my original blog post Bridge Communications has dropped many updates to the free Call Recorder.
Update Summary:

  • System Tray option
  • Windows Notifications on events
  • Post Processing can complete on next launch
  • Always on Top Settings
  • Recording Alerts Settings
  • Context Menu on System Tray icon
  • Option to disable minimized notification
  • Group Policy Support
  • Speech to Text powered by Azure
  • Recording stops on program close or Skype for Business/Lync client crash

CR20

CR21

Call Recording Pro Review

$
0
0

Call Recording Pro for Skype for Business was released from Landis Technologies this week.

CRP1

Call Recording Pro is an easy to implement client side call recording application that has the same look and feel as the Skype for Business client. Call Recording Pro enables on-demand or automatic call recording with upload capabilities to OneDrive and application settings can be controlled via Group Policies.

Call Recorder Pro can be found at: http://www.landiscomputer.com/callrecordingpro/
Price: $1800USD for a 10 user license pack + first year support.
The trial download will require registration for a 30 day key.

Call Monitor Pro is Landis Technologies’ Skype for Business features platform and Call Recording Pro is an enabled feature within this framework. When downloading the trial you’ll actually be installing the Call Monitor Pro application.

After downloading the ~5 MB file, run the callmonitorpro1.0.0.0.msi setup (requires administrative rights).
CRP2

CRP3

CRP4

CRP5

CRP6

Launch Call Recording Pro from the desktop icon.
CRP7

First launch will indicate “Registration to Avoid 30 Second Call Limit”. In my testing without registration, calls did not terminate at 30 seconds but the Recording feature was unavailable.
CRP8

CRP9

Clicking the registration button will prompt for contact info.
CRP10

CRP11

Settings Menus:
CRP12

CRP13

CRP14

CRP15

Recording from call monitor window:
CRP16

CRP17

System Tray context menu:
CRP18

Thoughts:

  • Call Recording Pro functions as advertised and 1 minute install
  • I was able to auto record a Skype for Business call without interaction as well as on-demand recording
  • Recording file name control is slick
  • Automatic uploading to cloud storage for review is simple to configure
  • Access to advanced call controls in monitor window (Caller, Picture, Record, Duration, Hold, Park, Transfer, Mute, Disconnect)
  • Shortcut keys (Answer, Hold, Retrieve, Disconnect, Park, Blind Transfer, Focus, Dial, Recording)
  • Concerned about CPU usage, my testing returned 15-18% CPU usage during a recorded call
  • Calls are recorded in WAV format, would like to see MP3
  • Would like to see an option to change recording cache folder location
  • On-demand recording only works with the Skype for Business client and not other voice communications software
  • Would like to see an option to play a message on record due to any legal and consent requirements. Example “This call is being recorded”.

Get-CSInstalledClient

$
0
0

While working on some slides for my upcoming session: Path to Skype for Business client deployment on The Skype Show: http://www.theskypeshow.com/episode-3-backing-up-desktop-client-and-security/ I wanted to come up with a few lines of code to list how the Skype for Business/Lync client was deployed to a computer. There’s quite a few options these days standalone, basic, part of Office, not to mention the versions and builds on top of that.

The most consistent way for detection is checking the registry for uninstall keys. These keys are located under:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall

The client edition formats are as follows:

  • Office 365 ProPlus (2013/2016): O365ProPlusRetail -en-us
  • Office 2016 Professional Plus: Office16.PROPLUS
  • Skype for Business 2016 Standalone: Office16.LYNC
  • Skype for Business 2016 Basic: Office16.LYNCENTRY
  • Office 2013 Professional Plus: Office15.PROPLUS
  • Lync 2013 Standalone: Office15.LYNC
  • Lync 2013 Basic: Office15.LYNCENTRY
  • Lync 2010: {81BE0B17-563B-45D4-B198-5721E6C665CD}
  • Office Communicator 2007 R2: {0D1CBBB9-F4A8-45B6-95E7-202BA61D7AF4}
  • Office Communicator 2005: {BE5AD430-9E0C-4243-AB3F-593835869855}
  • *Note Office 365 includes the language in the key name.

The following few lines of code creates an array of the key formats, excludes Office 2010 Pro Plus and checks both HKey local registry locations if present.

$clientcheck =  @(
"*Uninstall\Office*.lync*",
"*Uninstall\O*ProPlus*",
"*Uninstall\{81BE0B17-563B-45D4-B198-5721E6C665CD}",
"*Uninstall\{0D1CBBB9-F4A8-45B6-95E7-202BA61D7AF4}",
"*Uninstall\{BE5AD430-9E0C-4243-AB3F-593835869855}"
)

$clientignore = "*Office14*" #Lync not part of Office 2010 Pro Plus

Foreach($pattern in $clientcheck){
	Get-ChildItem -Path HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | Get-Item | ?{$_.name -like $pattern -and $_.name -notlike $clientignore} | Get-itemproperty | Sort-Object -Property DisplayName | Select-Object -Property DisplayName, DisplayVersion
	if (Test-path HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall) {
		Get-ChildItem -Path HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | Get-Item | ?{$_.name -like $pattern -and $_.name -notlike $clientignore} | Get-itemproperty | Sort-Object -Property DisplayName | Select-Object -Property DisplayName, DisplayVersion
	}
}

gsi1

The above works well when querying the local computer, slightly modified to report from a login script or even an uninstall old client routine. But that’s boring, so I wanted the ability to query on demand remotely.

The following script is a function that you can pass a list of computers and remotely check the installed client, generates a log of results and leaves an object to query on. I also added some code to attempt starting the Remote Registry services if unable to connect.

The script can be found on TechNet Gallery:
Script Download: Get-CSInstalledClient.ps1 https://gallery.technet.microsoft.com/Get-CSInstalledClient-687d0afe

Outside the script I generate a list of computer FQDNs, this can be created manually or use your favorite Active Directory computer query. Example:

$ComputerFile="C:\temp\computers.txt"
Import-Module ActiveDirectory
Get-ADComputer -SearchBase 'OU=Corporate,DC=domain,DC=com' -Filter 'ObjectClass -eq "Computer"' | Select -Expand DNSHostName | out-file $ComputerFile -append

I recommend reviewing the computer list and cleaning out items that are not expected to return results (decommissioned, non-windows, servers…). This will greatly decrease the script’s run time as it won’t be waiting for timeouts and attempting remote registry starts.

Get-CSInstalledClient log file:
gsi3

Get-CSInstalledClient console output:
gsi2

Script Download: Get-CSInstalledClient.ps1 https://gallery.technet.microsoft.com/Get-CSInstalledClient-687d0afe


Avoid SkypeforBusinessRetail Product ID with the Office Deployment Tool for Click-to-Run

$
0
0

The following issue is with the SkypeforBusinessRetail Click-to-Run (C2R) product ID, which causes roadblocks for organizations looking to roll out a standalone full Skype for Business client.

When using the Office Deployment Tool (ODT) for Click-to-Run 2016: https://www.microsoft.com/en-us/download/details.aspx?id=49117 you have the ability to pass specific product IDs for deployment. The supported product ID list can be found at: https://support.microsoft.com/en-us/kb/2842297

sfbodt1

Armed with the above supported information, use the Office Deployment Tool to install the full Skype for Business 2016 client as a standalone C2R package.
Sample configuration file:

<Configuration>
 <Add OfficeClientEdition="32" Branch="Current">
  <Product ID="SkypeforBusinessRetail">
   <Language ID="en-us" />
  </Product>
 </Add>
</Configuration>

So far so good, you see Skype for Business 2016 listed under Add and Remove Programs and Start Menu.
sfbodt2

sfbodt3

Now you go to launch Skype for Business and as expected you’re greeted with an activation prompt.
sfbodt4

After activation is completed, there are updates available… Wait, I installed the latest build in my Channel?
sfbodt5

Once updates apply, you notice the standalone Skype for Business client is no more and you have the full Office 2016 product suite…
sfbodt6

sfbodt7

How do we get the full Skype for Business 2016 C2R client? Use the ODT with O365ProPlusRetail as a product ID and exclude all the other Office applications using the ExcludeApp element: https://technet.microsoft.com/library/jj219426.aspx#BKMK_ExcludeAppElement
Sample configuration file:

<Configuration>
    <Add OfficeClientEdition="32" Branch="Current">
        <Product ID="O365ProPlusRetail">
            <Language ID="en-us"/>
            <ExcludeApp ID="Access"/>
            <ExcludeApp ID="Excel"/>
            <ExcludeApp ID="Groove"/>
            <ExcludeApp ID="OneNote"/>
            <ExcludeApp ID="Outlook"/>
            <ExcludeApp ID="PowerPoint"/>
            <ExcludeApp ID="Project"/>
            <ExcludeApp ID="Publisher"/>
            <ExcludeApp ID="Visio"/>
            <ExcludeApp ID="Word"/>
        </Product>
    </Add>
</Configuration>

Now we can activate and use Skype for Business without other Office 2016 applications being installed.
sfbodt8

sfbodt9

At the time of this posting (March 12, 2016), the Deferred Channel can’t activate when using product ID=”SkypeforBusinessRetail”, which is the same experience the other update Channels had prior to January 2016.
sfbodt10

DCOM error when attempting to move Skype for Business users in Control Panel

$
0
0

While working on a global Skype for Business deployment, I was moving a test user account between 6 pools and ran into DCOM errors when trying to move the account to two of the pools.
The specific error shown in the Skype for Business 2015 Control Panel:

Unable to connect to some of the servers in pool “poolname” due to a Distributed Component Object Model (DCOM) error. Verify that Front End service is running on servers in this pool. If the pool is set up for load balancing, verify that load balancer is configured correctly.

dcomsfb1

dcomsfb2

Wait a minute, haven’t I already blogged about this: http://realtimeuc.com/2013/10/dcom-move-lync-user/ well that Lync 2010 Server fix didn’t work. I noticed although the error was the same in the Control Panel, I had no issues using the Management Shell to move to and from the problem pools.

dcomsfb3

dcomsfb4

Time to look at the even logs… On the requesting Front End I would see a System Event Log ID: 10006 for each Front End in the destination pool.
dcomsfb5

On each Front End in the destination pool I would see a System Event Log ID: 10016.
dcomsfb6

Now to fire up dcomcnfg and expand: Component Services, Computers, My Computer, DCOM Config.
The Application ID in the event log {DAA77B0D-C664-437C-8B37-22CDC053B961} is the RTC Store Access Interface Class.

dcomsfb7

Right click RTC Store Access Interface Class and select Properties, Security Tab and Edit the Launch and Activation Permissions.
dcomsfb8

Problem Front End:
dcomsfb10

Successful Front End:
dcomsfb9

So I added the local server’s RTC Local Administrators, RTC Local User Administrators and RTC Server Local Group with Allow Local and Remote Activation on each Front End in the problem pools.

Didn’t need a reboot or service restart as moving the user from the Control Panel was instantly successful.
dcomsfb11

I tried to determine the root cause of the permission discrepancies for the one DCOM object. All 15 Skype for Business Front Ends were deployed identically and in the same Active Directory Domain and Organizational Unit, still unsure why 6 had the issue.

Skype for Business Federation fails only with Office 365 domains

$
0
0

While working with a Third-Party hosted Skype for Business environment leveraging Exchange Online for Email/Voicemail, I came across an issue where federation worked except with sip domains hosted in Office 365.

Looking at the client logs from both sides of the communication in snooper, you can see constant 504 Server time-out entries:

Hosted client to Skype for Business Online trace:
SFBFF-01

Skype for Business Online to Hosted client trace:
SFBFF-02

Hosted client to Skype for Business Online 504 error detail:

  • 03/18/2016|10:11:04.993 1F2C8:20684 INFO :: Data Received -209.197.182.66:443 (To Local Address: 172.17.1.57:52011) 832 bytes:
    03/18/2016|10:11:04.993 1F2C8:20684 INFO ::
    SIP/2.0 504 Server time-out
    ms-user-logon-data: RemoteUser
    Authentication-Info: TLS-DSK qop=”auth”, opaque=”8AE5D494″, srand=”194B5A1A”, snum=”41″, rspauth=”e035cf3791629bb547cb087dde5f41d0f6ccd1d7″, targetname=”hostedfe.hdomain.com”, realm=”SIP Communications Service”, version=4
    Via: SIP/2.0/TLS 172.17.1.57:52011;received=72.29.243.33;ms-received-port=24342;ms-received-cid=1200300
    Content-Length: 0
    From: “Michael LaMontagne”michael@hdomain.com>;tag=d141844893;epid=b5f478829d
    To: michael@lamontagnesolutions.com>;tag=9B47C2FDF604DCF0E6773B737ABC04C6
    Call-ID: 07090444edc64a189aa6ce0a2c4700c4
    CSeq: 1 INVITE
    ms-diagnostics: 1063;reason=”Cannot route to blocked IM Service Provider”;domain=”lamontagnesolutions.com”;fqdn1=”sipfed.online.lync.com:5061″;source=”sip.hdomain.com”
    Server: RTC/6.0
    03/18/2016|10:11:04.993 1F2C8:20684 INFO :: End of Data Received -209.197.182.66:443 (To Local Address: 172.17.1.57:52011) 832 bytes

Skype for Business Online to Hosted client 504 error detail:

  • 03/18/2016|10:05:22.667 2148:32C4 INFO :: Data Received -132.245.1.32:443 (To Local Address: 10.100.30.182:57915) 1114 bytes:
    03/18/2016|10:05:22.667 2148:32C4 INFO ::
    SIP/2.0 504 Server time-out
    ms-user-logon-data: RemoteUser
    Authentication-Info: TLS-DSK qop=”auth”, opaque=”A8BC1734″, srand=”6BA9FCBC”, snum=”45″, rspauth=”3e7612007482289c34a09d47a3090a75be97e792″, targetname=”BL20A09FES13.infra.lync.com”, realm=”SIP Communications Service”, version=4
    Via: SIP/2.0/TLS 10.100.30.182:57915;received=10.8.148.8;ms-received-port=57915;ms-received-cid=4EBE400
    Content-Length: 0
    From: “Michael LaMontagne”michael@lamontagnesolutions.com>;tag=d97c3dc345;epid=177375e93d
    To: michael@hdomain.com>;tag=B3656182BBE3D680E2A42799A4ACBD34
    Call-ID: 8cd5cb094b5f4c3e937c2553e35ba11f
    CSeq: 1 INVITE
    ms-diagnostics: 1047;reason=”Failed to complete TLS negotiation with a federated peer server”;fqdn=”sip.hdomain.com:5061″;ip-address=”XXX.XXX.XXX.XXX”;peer-type=”FederatedPartner”;winsock-code=”10054″;winsock-info=”The peer forced closure of the connection”;source=”sipfed1A.online.lync.com”
    Server: RTC/6.0
    ms-edge-proxy-message-trust: ms-source-type=AutoFederation;ms-ep-fqdn=sipedgeBL20A.infra.lync.com;ms-source-network=federation;ms-source-verified-user=verified
    03/18/2016|10:05:22.667 2148:32C4 INFO :: End of Data Received -132.245.1.32:443 (To Local Address: 10.100.30.182:57915) 1114 bytes

Much time was spent digging into Federation settings, DNS, certificates and firewalls for both parties. It dawned on me that Skype for Business Online is ignoring Federation SRV records when communicating with verified Custom domains in Office 365. Which is fine if you have Hybrid configured for either your On-Premises or hosted Skype for Business environments, which was not this case.

This fix was to remove the Skype for Business domain purpose for the Third-Party hosted domain:

Open Office 365 Admin center, under Domains click Domain settings:
SFBFF-03

Click on Change domain purpose:
SFBFF-04

Uncheck Skype for Business for instant messaging and online meetings, complete the steps in the wizard:
SFBFF-05

Office 365 domain purpose changing without modifying domain settings

$
0
0

I’ve come across an interesting bug in the Admin Center Preview portal in-regards to the domain purpose changing without reason. This is further to my recent blog posting: http://realtimeuc.com/2016/06/federation-fails-with-o365/, which required disabling the Skype for Business domain purpose for domains using On-Premises or Third-Party hosted environments without hybrid configured to resolve federation issues.

First you’ll find there isn’t a way in the Admin Center Preview portal to view or modify the domain purpose for Custom domains.
O365DP-01

O365DP-02

O365DP-03

O365DP-04

O365DP-05

You can use the Azure AD PowerShell to check domain purpose (https://msdn.microsoft.com/en-us/library/jj151815.aspx):
O365DP-06

O365DP-07
As we can see my custom domain is only enabled for Exchange Online and Intune. Note: At this time you can’t change the domain purpose/capabilities using PowerShell.

Now to the bug…. While using the Admin Center Preview portal, go under Settings, Domains, select your Custom domain, click DNS Management and use any option (Next/Back/Exit), you now have enabled all the domain purpose items without notification or warning.
O365DP-10

O365DP-11
O365DP-08
O365DP-09

At this point the only way to modify the domain purpose is to revert back to the old Admin portal and follow the steps outlined in http://realtimeuc.com/2016/06/federation-fails-with-o365/:
O365DP-12

O365DP-13

Status:

Reported to Office 365 support.

Cloud PBX Voicemail Language

$
0
0

Hopefully this blog post will help any others out there having an issue understanding what language is being used in the voice prompts and email transcriptions for Microsoft’s Office 365 Cloud PBX Voicemail (Azure Voicemail).

Until last week the language used in Voicemail services for Office 365 Cloud PBX had to be configured at the organization level within the company profile. This language setting was for all users in the Office 365 tenant and couldn’t be adjusted per user: https://support.office.com/en-us/article/Change-the-default-language-for-voicemail-greetings-and-emails-in-your-organization-820c3892-1b7e-47d3-ae8d-6e27e7cbcf38

So what happened last week? Well my clients piloting Cloud PBX started reporting users were hearing Portuguese/Spanish/Catalan when calling into their Voicemail or external callers trying to leave a message. After opening a support ticket with Microsoft and looking at every possible language setting on the user/mailbox/tenant which was all English, we found that a new undocumented feature was released… The feature was the ability to change the default language on the individual user level. I’m sure at the time of posting this blog the feature will appear on the Office 365 Road Map: https://fasttrack.microsoft.com/roadmap

This new feature is triggered based on the “PreferredLanguage” user attribute, which must be updated in Active Directory if doing directory synchronization. If “PreferredLanguage” is empty the “UsageLocation” user attribute is used instead.

I’m sure you’re thinking what does this have to do with Catalan? Well us Canadians, we are a proud bunch and always select “Canada” when able. An example of this is when licensing a user in Office 365.
vm1

If you’ve played with licensing in PowerShell for Office 365 you would have used:

 set-MsolUser -UserPrincipalName <UserUPN> -UsageLocation CA

But wait “CA” is a the country identifier for Canada, but a Language identifier for Catalan (Spain)!

So we looked at the following ways we could quickly update all our client’s users.

From Office 365 PowerShell:

get-MsolUser | set-MsolUser -UsageLocation US

or

Active Directory PowerShell

Get-AdUser -Filter * -ResultSetSize 9999 | Set-ADUser -Replace @{‘preferredLanguage’=”EN-CA”}

vm2

Of course the client opted for the second option, keeping everything labeled Canada. Great news is after a directory synchronization, the correct language was used within minutes.

**Update** Microsoft has implemented a fix for this issue and now the voicemail language detection will not leverage the “Usagelocation” if “PreferredLanguage” is empty. If “PreferredLanguage” is empty the Tenant’s “Preferred Language” under the company profile will be used and if that’s not set “English” will be the default.

Skype for Business Online – Session Details (Preview)

$
0
0

During Microsoft Ignite it was mentioned that the Session Detail reports would start rolling out to Skype for Business Online tenants this week. As promised, Session Details (Preview) started lighting up under the Report section of the Skype for Business Online admin center.
sfbo-sd1

To generate a report, the User and From data/time fields are required before clicking submit.
sfbo-sd2

The User field dropdown will filter on the fly as you type more characters for the sip address. The From and End fields have separate date and time buttons.

sfbo-sd5
sfbo-sd6
sfbo-sd7

After filling in your search criteria, click submit.
sfbo-sd3

sfbo-sd4

Available details:

  • Media Types Description
  • Start Time
  • End Time
  • From Uri
  • To Uri
  • From Client Version
  • To Client Version
  • Conference Url
  • Session
    • StartTime
    • ConferenceURI
    • IsFromReceived
    • FromOS
    • FromCPUName
    • FromCPUNumberOfCores
    • FromCPUProcessorSpeed
    • FromVirtualizationFlag
    • PossibleDataMissing
    • EndTime
    • MediationServerBypassFlag
    • IsToReceived
    • ToOS
    • ToCPUName
    • ToCPUNumberOfCores
    • ToCPUProcessorSpeed
    • ToVirtualizationFlag
  • MediaLines
    • MediaLineLabelText
    • MidCallReport
    • Transport
    • Security
    • FromConnectivityIce
    • ToConnectivityIce
    • FromPort
    • ToPort
    • FromRelayIPAddr
    • ToRelayIPAddr
    • FromRelayPort
    • ToRelayPort
    • FromCaptureDev
    • ToCaptureDev
    • FromCaptureDevDriver
    • ToCaptureDevDriver
    • FromRenderDev
    • ToRenderDev
    • FromRenderDevDriver
    • ToRenderDevDriver
    • FromVPN
    • ToVPN
    • FromLinkSpeed
    • ToLinkSpeed
    • FromNetworkConnectionDetail
    • ToNetworkConnectionDetail
    • FromIPAddr
    • ToIPAddr
    • FromBssid
    • ToBssid
    • FromReflexiveLocalIPAddr
    • ToReflexiveLocalIPAddr
    • FromWifiDriverDeviceDesc
    • ToWifiDriverDeviceDesc
    • FromWifiDriverVersion
    • ToWifiDriverVersion
    • FromWifiRSSI
    • ToWifiRSSI
    • FromSSID
    • ToSSID
    • FromWifiChannel
    • ToWifiChannel
    • FromActivePowerProfile
    • ToActivePowerProfile
    • FromWifiHandovers
    • ToWifiHandovers
    • FromWifiChannelSwitches
    • ToWifiChannelSwitches
    • FromWifiChannelReassociations
    • ToWifiChannelReassociations
    • FromWifiRadioFrequency
    • ToWifiRadioFrequency
    • FromWifiSignalStrength
    • ToWifiSignalStrength
    • PossibleDataMissing
  • AudioStreams
    • AudioFECUsed
    • AudioSampleRate
    • BandwidthEst
    • BurstDensity
    • BurstDuration
    • BurstGapDensity
    • BurstGapDuration
    • ConcealedRatioMax
    • DegradationAvg
    • DegradationMax
    • JitterBufferSizeAvg
    • JitterBufferSizeMax
    • JitterInterArrival
    • JitterInterArrivalMax
    • PacketLossRate
    • PacketLossRateMax
    • OverallAvgNetworkMOS
    • PacketUtilization
    • PayloadDescription
    • PossibleDataMissing
    • RatioConcealedSamplesAvg
    • SendListenMOS
    • RoundTrip
    • RoundTripMax
  • AudioClientEvents
    • CPUInsufficientEventRatio
    • DeviceCaptureNotFunctioningEventRatio
    • DeviceClippingEventRatio
    • DeviceEchoEventRatio
    • DeviceGlitchesEventRatio
    • DeviceHalfDuplexAECEventRatio
    • DeviceHowlingEventCount
    • DeviceLowSNREventRatio
    • DeviceLowSpeechLevelEventRatio
    • DeviceMultipleEndpointsEventCount
    • DeviceNearEndToEchoRatioEventRatio
    • DeviceRenderMuteEventRatio
    • DeviceRenderNotFunctioningEventRatio
    • DeviceRenderZeroVolumeEventRatio
    • NetworkBandwidthLowEventRatio
    • NetworkDelayEventRatio
    • NetworkReceiveQualityEventRatio
    • NetworkSendQualityEventRatio
    • PossibleDataMissing
    • SubmittedByFromUser
  • AudioSignals
    • AudioMicGlitchRate
    • AudioSpeakerGlitchRate
    • EchoEventCauses
    • PossibleDataMissing
    • RecvNoiseLevel
    • RecvNoiseLevelCh1
    • RecvNoiseLevelCh2
    • RecvSignalLevel
    • RecvSignalLevelCh1
    • RecvSignalLevelCh2
    • RenderLoopbackSignalLevel
    • RenderNoiseLevel
    • RenderSignalLevel
    • SendNoiseLevel
    • SendNoiseLevelCh1
    • SendNoiseLevelCh2
    • SendSignalLevel
    • SendSignalLevelCh1
    • SendSignalLevelCh2
    • SubmittedByFromUser
    • VsEntryCauses
  • AppSharingStreams
    • AverageRectangleHeight
    • AverageRectangleWidth
    • CaptureTileRateTotal
    • Inbound
    • IncomingFrameRateTotal
    • IncomingTileRateTotal
    • JitterInterArrival
    • JitterInterArrivalMax
    • Outbound
    • OutgoingFrameRateTotal
    • OutgoingTileRateTotal
    • PacketLossRate
    • PacketLossRateMax
    • PacketUtilization
    • PayloadDescription
    • PossibleDataMissing
    • RDPTileProcessingLatencyTotal
    • RoundTrip
    • RoundTripMax
    • ScrapingFrameRateTotal
    • SpoiledTilePercentTotal
  • VideoClientEvents
    • NetworkBandwidthLowEventRatio
    • NetworkReceiveQualityEventRatio
    • PossibleDataMissing
    • SubmittedByFromUser
    • VideoMediaLineLabel
  • VideoStreams
    • BandwidthEst
    • CIFQualityRatio
    • DurationSeconds
    • DynamicCapabilityPercent
    • HD720QualityRatio
    • IsAggregatedData
    • JitterInterArrival
    • JitterInterArrivalMax
    • LowBitRateCallPercent
    • LowFrameRateCallPercent
    • LowResolutionCallPercent
    • NoneDropRatio
    • PacketLossRate
    • PacketLossRateMax
    • PacketUtilization
    • PayloadDescription
    • PossibleDataMissing
    • UseForCallClassification
    • RecvBitRateAverage
    • SendBitRateAverage
    • RecvBitRateMaximum
    • SendBitRateMaximum
    • RecvCodecTypes
    • SendCodecTypes
    • RecvFrameRateAverage
    • SendFrameRateAverage
    • RecvResolutionHeight
    • SendResolutionHeight
    • RecvResolutionWidth
    • SendResolutionWidth
    • RoundTrip
    • RoundTripMax
    • SendVideoStreamsMax
    • VGAQualityRatio
    • VideoBitRateAvg
    • VideoBitRateMax
    • VideoFrameLossRate
    • VideoFrameRateAvg
    • VideoMediaLineLabelText
    • VideoPacketLossRate
    • VideoPostFECPLR
    • VideoResolution
  • TraceRoutes
    • Hop
    • IPAddress
    • PossibleDataMissing
    • RTT
    • SubmittedByFromUser
    • TraceRouteMediaLineLabelText
  • UserFeedbackReports

The data can also be exported to Excel or the table grouped by dragging and dropping a column. The arrow direction in the first column is backwards with the arrow pointing up to indicate the ability to expand and pointing down to condense, the sub items have the correct arrow direction.
sfbo-sd8

Hey Juniper stop messing with my Skype for Business Desktop Share

$
0
0

For me 2016 will be the year Juniper (specifically SRX) attacked Skype for Business desktop sharing. I figured it was time to document at least one of my battles.
product-series-srx

Let me first start this post with the fact that I am not a networking expert, but have become an expert at finding network problems and convincing a network resource what they need to do to fix it.

Scenario:
Client reports that Desktop Sharing within a conference works internally but not externally, A/V no issues.

First thoughts:
Since A/V is most likely using UDP and Desktop Sharing is TCP (yes Video Based Screen Sharing (VBSS) prefers UDP, but RDP only uses TCP and RDP signalling is always maintained for failback).

Also we need to focus our efforts around the Edge, as no issues internally.

Next Steps:
History tells me that either the issue is the NAT is not bidirectional, DNS resolution issues on the Edge or Network. Of course the first two are easy to rule out with access to the Edge.

Time to fire my canned email to the client’s network team:
“Skype for Business A/V is not having an issue which is leveraging UDP, we need to look at what could be messing with the TCP stream that Desktop Sharing uses. This almost is 100% a router or firewall configuration and usually due to deep inspection features especially on SSL.”

Well no luck with that email, time to trace and prove.

Client log (Lync-UccApi-0.UccApilog) in Snopper:
jun-1

CLS logging in Snooper:
jun-2

Important info:
BYE message indicating that “Call failed to establish due to media connectivity failure when one endpoint is internal and the other is remote”, MediaType of “Application-sharing”. Let’s note the LocalAddress port of 25221 to easily search in the WireShark captures, also the ICEWarn of 0x8000100.

Time to fire up the ICE Warning Flag Decoder (https://gallery.technet.microsoft.com/office/ICE-Warning-Flag-Decoder-97058ef3)
jun-3

So we have: “there is no direct TCP connection possible”.

On to Wireshark, filtering with “tcp.port==25221”

Client:
jun-4

Edge:
jun-5

Juniper SRX:
jun-6

Important info:
Well I know that the black lines are “BAD TCP” and the red are “TCP Resets”, which always makes me worry. WireShark Packet colorization: https://www.wireshark.org/docs/wsug_html_chunked/ChCustColorizationSection.html

What’s interesting is the Juniper SRX is reporting “TCP Out-Of-Order”, so we know this device is watching the TCP session and resetting what it doesn’t like.

After a bit of googling I came up with a list of settings for the network resource to disable on the SRX:

  • tcp-syn-check (TCP Syncro Check:)
  • tcp-seq-check (TCP Sequence Check)

Note: How to selectively disable TCP SYN or Sequence checking: https://kb.juniper.net/InfoCenter/index?page=content&id=KB25094&actp=search

Magic! We’re in business and no Desktop Sharing issues externally anymore.

Another one of my battles the client had the TCP syn/seq already disabled, but also had to add:

Some settings that others have reported they needed to disable:

  • tcp-syn-bit-check
  • alg sip enable

Looking at the Juniper forums there’s an open topic on this issue: https://forums.juniper.net/t5/SRX-Services-Gateway/Skype-Business-desktop-sharing/td-p/291272, I don’t have an account with Juniper, so unable to share my findings.


Microsoft Ignite: Why I Attend

$
0
0

As someone that lives and breathes Microsoft Unified Communications day in and day out, I get asked why would I attend Microsoft Ignite? Being an Office Servers and Service MVP (AKA Skype for Business MVP), I have an NDA with Microsoft and usually have a chance to preview items on or before being published to the public Roadmap (https://fasttrack.microsoft.com/roadmap). Also I get the privilege to spend a week with the Microsoft Product group in November during the MVP Summit.

So why would I attend Ignite? You have to realize that I spend the majority of the year testing and playing with preview bits/features and maintain that NDA I talked about prior. So for me honoring that agreement is priority and figuring out what is released, public preview or TAP can be a bit tedious to track. So to be safe, I only talk about what I see working with clients. But when Ignite rolls around, it’s a flood gate of items that I’m able to now talk about.

You have to come into Ignite with the understanding that chances are you will not see many of your desired sessions live. This is due to scheduling conflicts, distance to travel between rooms that are booked back-to-back, session popularity, lunch, networking with others focused in your areas of interest and Expo floor time. I tend to pick sessions based on the speaker(s) and those in the product team that might be sitting in the first few rows of the room vs. topic. Some of the best info can be a single line on a slide or a quick statement from the Presenter during the session or Q/A time. The hunt for these Easter Eggs (https://en.wikipedia.org/wiki/Easter_egg_(media)#Software) is why I attend Ignite.

Just a handful from Ignite 2016:

  • Persistent Chat (pChat) is in “Sustained” mode, means no new development or features. So much for the first class citizen status from Lync Server 2013… (http://www.justin-morris.net/microsoft-lync-server-2013-preview-available-today-whats-new/)
  • Something to be announced in the next few months to provide pChat like features in the cloud. Won’t talk about what was leaked, but you could check out: https://www.youtube.com/watch?v=7XWDMhbN9oo
  • Session Details Preview for Skype for Business Online in Oct. Already blogged about at: http://realtimeuc.com/2016/10/sfbo-session-details-preview/
  • CQD.lync.com will be enabled by default for Skype for Business Online soon.
  • Event Zero technology assets to be preview early 2017 for Skype for Business Online.
  • Many MAC items (General Availability in Oct, Microsoft Auto Update, Ability to use internal mobile site, hard requirement on SSL CRLs, Snooper support). Would recommend you check out: https://johnacook.wordpress.com/2016/10/02/so-you-say-hate-the-lync-2011-mac-client/
  • Skype for Business Network Assessment Tool (https://www.microsoft.com/en-us/download/details.aspx?id=53885) which leverages the Skype for Business Anycast IP of 13.107.8.2 (World Wide VIP for Media Relay).
  • Cloud PBX Auto Attendant and Hunt groups to preview in Oct.
  • Trusted Application SDK to preview soon: http://blog.thoughtstuff.co.uk/2016/10/connect-your-service-to-conversations-skype-for-business-trusted-application-sdk/
  • Cloud PBX Auto Attendant and Hunt groups are built using the new Trusted Application SDK.
  • Cloud PBX custom dialplans and extension support on the Roadmap.
  • Azure voicemail to transcribe in 15 languages.
  • Skype Meeting Broadcast to release language transcript soon. Wonder if Klingon will actually be included?
  • Video Based Screen Sharing (VBSS) will still maintain RDP signalling to speed up failback and once failed to RDP, will not fail forward back to VBSS.
  • VBSS very dependent on client graphics drivers, contact support when having issues vs. disabling VBSS. Lots of issues reported with HP Elitebooks.
  • Adoption Content Directory (includes templates, videos, portal, quick start guides and more…) : aka.ms/sfbrolloutkit
  • Talking with Chris and Tim the night before they released their Skype for Business Custom Sizing Calculator: http://emptymessage.com/?p=269
  • Offline messages use history spooler and client to Exchange EWS, no Front End involved. Requires that Conversation history be enabled and working.
  • New UDP ports to be added in Skype for Business Online Edge (3479,3480,3481). My guess is they’re consuming too many sockets off the 3478 UDP port.
  • WebRTC still planned for future in Trusted Application, Web App and looks to be enabled in the MCU and Mobile.
  • Sure you can enable Skype for Business pinless pstn conference activation (https://technet.microsoft.com/en-us/library/mt691535.aspx) but recommended not to do so.

As for the Expo (https://ignite.microsoft.com/Expo#fbid=iIj5ns4nnNQ you can spend hours wondering around and still somehow miss companies with a booth listed on the index you have interest in. Try not to fall into the giveaway/free pen trap at booths you have no interest in as you will be fielding calls and spam for weeks after the event. Veeam wins the prize for first to contact me after Ignite 🙂 And no I didn’t win a Surface, Xbox or motor bike.

Skype for Business anonymous join failure when meeting organizer is disabled for federation

$
0
0

Before we start, I highly recommend you first read Scott Stubberfield’s “Anonymous join from Skype for Business and Lync Clients” blog post: https://blogs.technet.microsoft.com/scottstu/2015/04/03/anonymous-join-from-skype-for-business-and-lync-clients/

Now that you understand the anonymous join process, we’ll go into one scenario that I’ve been tracking since Lync Server 2013 RTM (almost 4 years…).

Scenario:

  • Company A has Federation Enabled
  • User at Company A has an External Access Policy set to have Federated User Access disabled
  • This User schedules a meeting and sends the invite to an external participant
  • External participant is running the Lync or Skype for Business client
  • External participant tries joining the meeting, but is greeted with “An error occurred during the Skype Meeting”
  • External participant is able to join the meeting if forcing connection via Web App in browser (appends ?sl=1 to the end of the meeting URL)

ff-2
ff-1

Let’s compare some client logs for the External participant:

  • Company A Federation Enabled and Meeting organizer Enabled for Federated User Access (Successful federated join):
    ff-5

    ff-6

  • Company A Federation Disabled or External participant’s domain is blocked (Successful anonymous join):
    ff-3

    ff-4

  • Company A Federation Enabled and Meeting organizer Disabled for Federated User Access (Failed anonymous join):
    ff-7

    ff-1

As per Scott’s blog, the following table lists the valid SIP response or diagnostic codes that the client will use to trigger the anonymous join process:
ff-8

So we have the External participant’s client triggering anonymous join when seeing 504 or 404, but not the 403 response that is received when the meeting organizer is disabled for federation.

Invoke-SFBContacts

$
0
0

A few months ago my SIP address was changing and was looking for a way of exporting/importing my contact list. I wanted a solution to work no matter if the Lync/Skype for Business environment was on-premises, hosted or online. This led me down the path of playing with the Lync 2013 Client SDK: https://www.microsoft.com/en-ca/download/details.aspx?id=36824.

If looking at pure on-premises and you have server access, look at the Export-CSUserData cmdlet in PowerShell (http://social.technet.microsoft.com/wiki/contents/articles/25001.backing-up-and-restoring-lync-2013-contacts.aspx). But even then, I would say just grab Anthony Caragol’s Lync Contact Backup and Restore Tool (GUI): http://www.skypeadmin.com/2014/07/14/new-tool-lync-2013-backup-and-restore-tool-gui/

A few months later, I had a client that was migrating between two hosted Skype for Business environments so I combined both my export and import contact list scripts.

The script can be found on TechNet Gallery:
Script Download: Invoke-SFBContacts https://gallery.technet.microsoft.com/Invoke-SFBContacts-3b3ad2ef

The parameters for Invoke-SFBContacts.ps1 is “Export” or “Import” for the mode and “File” used for the CSV file location. The script does require PowerShell v3 or newer.

If Invoke-SFBContacts.ps1 is run without any parameters the script will default to export mode and the contact list of the currently signed in Skype for Business account will be exported to c:\temp\SFBcontacts.csv. The CSV file has three columns, Group, Key and SIP. The Key column is used as a quick way of indicating unique entries, as a sip address could be a member of multiple groups. Also at this point the export function doesn’t work with Exchange Distribution Groups.

When Importing contacts there is a known issue where importing contacts into “Other Contacts” default group will fail (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) for contacts already added elsewhere in the contact list. I’ve blogged about issues with the “Other Contacts” group prior at: http://realtimeuc.com/2015/09/move-user-to-other-contacts/. The script can run multiple times and only imports missing contacts.

A couple days ago a fellow MVP, Rodolfo Castro (https://twitter.com/ucblogmx) asked me if he could publish an exe version that used my script as an example. Of course I had no issue with this and you can find more details at: https://ucblogmx.com/2016/10/13/s4bcontactos-exportimport-contacts/.
Rodolf’s GUI looks like:
contactgui-1

Although I’m still hoping for the day that the Skype for Business client get’s a builtin Contact Manager under the Tools menu. Until then you can find my script at:
Script Download: Invoke-SFBContacts https://gallery.technet.microsoft.com/Invoke-SFBContacts-3b3ad2ef

Guest appearance on The Skype Show (Episode 3)

$
0
0

Earlier this year I had the pleasure of being a guest speaker on The Skype Show (http://www.theskypeshow.com/). This monthly online video web cast is the brainchild of a newly awarded Microsoft Office Servers and Services MVP Mark Vale, which is dedicated to the evangelism of unified communications. The Skype Show has been going strong for almost a year and has had many amazing guest speakers, kudos to Mark on all his hard work and gaining MVP status!

My session was “Path to Skype for Business client deployment” and can be found at the 25 minute mark on Channel 9 or The Skype Show Episode 3 page.

Episode 3’s full slide deck can be found at: PowerPoint deck here.

With Microsoft Ignite 2016 just wrapping up a few weeks ago, you can now watch on demand a few new Office deployment sessions:

So what has changed since Episode 3 aired?

Skype for Business Online/Cloud PBX dial plan extensions rule issue

$
0
0

You could say that I’ve spent a few hours with Cloud PBX, but it wasn’t until I attended Doug Lawty’s session “Understand the mysteries of Dial Plans and Voice Routes in Skype for Business” at Microsoft Ignite 2016. That a single slide on the default dial plans caught my eye (around the 15 minute mark).

The item in question was one of the default rules: “US Extensions rule”.
ext-2

As you may or may not notice, the translation rule doesn’t start with a “+”.
ext-1

This rule is not just under the “US” country code, but all 220 occurrences.
ext-4

ext-3

So if we set a Cloud PBX user with an extension:
ext-7

Next sign into another account, dial the full Line URI including extension starting with a plus. The number is normalized in the Skype for Business client and you can call the user.
ext-5

But say we dial the same number without the plus? The number is not normalized and clicking call within the Skype for Business client does nothing…
ext-6

Testing the default extensions rule’s regex, I like to use http://regexstorm.net/tester for quick checks. We can see when the plus is entered it’s carried into the replacement (translation) string, but the plus is not added if missing in the original input.

ext-8
ext-9

On a side note, Custom Dial Plan and short code dialing (extension dialing) support is on the roadmap for Cloud PBX. Can’t wait until we have access to create our own rules or when Ken Lasko’s https://www.lyncoptimizer.com/ can generate these for us!

Viewing all 47 articles
Browse latest View live