UPDATE 5/29/2021: This script has been updated to allow the CDN Skype Meetings App to work when there is no internet access for the user and the FE directly. See the Downloads Section below for more info!

Disclaimer: Please use this at your own risk as I do not take warranty in this script. I have verified that every function is working as expected when building this, but still want to make this disclaimer.

This script is one that I thought would be fun to build, but also one that preserves part of the current experience of Skype for Business Server. Whenever Skype for Business Server is eventually retired, there is a chance that the CDN that delivers the modern meeting join experience ,since 2015 CU5, would be deprecated. This script not only works to preserve that functionality, but it also brings it fully on-premises so that if Microsoft’s CDN is shut down, the service will still work. This works with Skype for Business Server 2015 CU5+ and 2019. A LOT of work went into this reverse engineering the processes that Microsoft built for this originally to work so I hope you enjoy!


Example

Standard On-Premises Meeting Join Page (Reverts to this if the CDN is unreachable):

https://meet.domain.com/user.name/A39DRHC2?UseCdn=false

Microsoft CDN Powered Meeting Join Page (What we are trying to preserve by bringing on-premises):

https://meet.domain.com/user.name/A39DRHC2?UseCdn=true


Added Bonuses

MS Bug Fix:

This script fixes an error in Microsoft’s own code with the Skype for Business logo when a invalid meeting URL is served up. This can be seen in the below image:

Skype Background IMG Change:

You can also customize the background image of the Meeting Join page once the data is fully on-premises by editing the files located at:

  • C:Program FilesSkype for Business Server 2019Web ComponentsJoin LauncherIntjoinuxprodv20200915.1assetsbackground-skype-meetings-blue.jpeg
  • C:Program FilesSkype for Business Server 2019Web ComponentsJoin LauncherExtjoinuxprodv20200915.1assetsbackground-skype-meetings-blue.jpeg

Example of a BG Change (Note, custom tint added to the image)

Download of the above custom image:


Prerequisites

  • You will need to allow unsigned scripts with the following command: Set-ExecutionPolicy -ExecutionPolicy Unrestricted
  • The Script will make sure that it is running as an admin
  • The Script will make sure it is running in a console and not the ISE
  • The Script will make sure that it is ran on a Front-End Server running Skype for Business Server 2015 or 2019
  • The Script will make sure you have the Skype for Business Module, if not it will attempt to install it

Use

Note: You will need to run this on each front-end server in a Enterprise Pool!

  1. Upon launching the script, the script will run through the prerequisites above
  2. The script will now ask if you want to download the CDN files from Microsoft’s PROD or DEV CDN branch. I HIGHLY recommend PROD as it is the most up-to-date.
  3. The script will now ask if you want to provide local CDN Files or use the Microsoft CDN. This is here since Microsoft’s CDN can go down at any time and you can then provide the local CDN files (I’ve included these in the download)
  4. The script will then ask you what the external web FQDN is of the local server from the list it provides
  5. The script will now either import the ZIP if running locally or download all known files from the Microsoft CDN, modify a few to contain the new on-premises URLs, and then write those files to the Meeting Join Site directories.
  6. The script will then request if you would like to allow Access-Control-Allow-Origin in the header since the URL is hosted on the source server in IIS. This NEEDS to be set to Y on the first run of the script and the first run only!!!

Limitations

  • None at this time

Features for Future Releases

  • None at this time

Download

https://github.com/EricMarsi/SFB_MJ_CDN_On-Prem/releases

  • Version 2105.1 – Release Date: 5/30/2021
    • Ehsan Zamiri in the comments below found that the Skype Meetings App would not work in a scenario with the FE and user not having internet access. A lot of assets for the meetings app has been added to the script after a lot of reverse engineering to get this working again. Thank you for the heads up! Unfortunately there is still a hard coded link pointing to Microsoft’s CDN in the LWAClient PreAuth Dll so if there is internet on the FE. If there is no internet to the FE directly, it will point to on-prem CDN Assets. Still working on this
    • Ehsan Zamiri also requested that [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 be added to the script to prevent the “Could not Create a SSL/TLS Secure Channel” error in some scenarios.
    • The download now comes in two variants: one has just the script, and the other has the latest CDN files included in case Microsoft were to remove the files for this from their CDN.

  • Version 2104.1 – Release Date: 4/1/2021
    • Found a bug in my original thought process that in practice only allowed one pool in a topology to be able to host the CDN. This has been recoded to make a new CsWebServiceConfiguration per pool so the CDN selections only affect that pool.
    • Fixed a minor bug during the SFB Directories cleanup check. Caused duplicate entries if the script was ran more than once.
    • Minor grammatical updates in the script (I’m a perfectionist :P)

  • Version 2103.2 – Release Date: 3/26/2021
    • The script will modify Microsoft’s original code in Error.html to fix the Skype Logo in the top right of the “We’re having trouble getting you into the meeting” page. The img src is missing on a non-working meeting page. This is a Microsoft bug that I fixed. See Appendix A for more information
    • Added a separate mode to the script so that it will work against local CDN assets backed up from the Microsoft CDN in case the CDN goes down. CDN Assets are included in v2103.2 and up downloads
    • Added the ability to change the Skype for Business Server installation directory from C:

  • Version 2103.1 – Release Date: 3/25/2021
    • First Release of the Script