While articles on this blog are primarily focused on real time communication capabilities provided throughout Lync on-premises environments, as Microsoft moves forward with including more voice and video features in their cloud offering then integration and management of Lync Online will start become more common here.
Background
One of the first steps in this journey is understanding how a Lync Online tenant can administer their environment. Just as with a Lync on-premises deployment there are two primary tools for doing this: a web-based graphical user interface (GUI) and a command-line shell.
Since the original Lync 2010 release the GUI tool has been a Microsoft Silverlight based control panel that was also delivered as a web portal provided by IIS running on a Lync Front End server. The shell portion has leveraged Windows PowerShell by using a module of several hundred cmdlets to control every aspect of the platform.
Yet Lync Online, soon to be upgraded to Skype for Business Online, leverages a single, massive multitenant deployment of Lync 2013 thus a large portion of server-side capabilities are not exposed to the individual tenant administrators. Clearly disastrous results could occur if a single tenant had the ability to modify the behavior of any single component or parameter that could potentially impact any or all other tenants. Because of this shared model the administration tools for managing Lync Online are quite different than what administrators of on-premises deployments are used to.
First off the Lync Control Panel is replaced with the Lync Admin Center which is a component of the centralized Office 365 Admin Center. As seen below the listed sections in the admin center is a mere shadow of what is available in the control panel shown above.
As expected the available PowerShell cmdlets is also quite different between the platforms. With just a couple commands the current total of individual cmdlets in the Lync on-premises server module can be retrieved.
As of the time this article was written there are only 50 unique cmdlets available in Lync Online, which is quite the difference from the nearly 750 cmdlets provided to manage an on-premises deployment of Lync.
Installation
While connecting to the admin center is as simple as opening a web browser on any computer or device with Internet access leveraging PowerShell does require a short one-time setup for a Windows workstation.
As a prerequisite the Windows operating system on the computer to be used must be of the 64-bit variety and be running at a minimum Windows 7 or Windows Server 2008 R2. Additionally Windows PowerShell 3.0 or newer must be installed on the system. Windows 7 and Server 2008 R2 with at least Service Pack 1 will already fulfill this requirement as PowerShell 3.0 is the default version, with newer operating systems (e.g. Windows 8 and Server 2012) utilizing 4.0 and newer.
- To confirm the version of PowerShell running on the selected Windows computer open a new PowerShell session and execute the $PSVersionTable cmdlet and then take note of the PSVersion value.
PS C:\Windows\system32> $PSversionTable
Name Value
—- —–
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.34209
BuildVersion 6.3.9600.17090
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2
- With the prerequisites covered the next step is to download and install the Windows PowerShell Module for Lync Online from the following Microsoft Download page: https://www.microsoft.com/en-us/download/details.aspx?id=39366
Once completed the installation will not create any shortcuts to a separate shell or application, but the Lync Online Connector module will be installed and ready to be imported into PowerShell.
As this new command module is not part of the inherent Windows installation and although provided and signed by Microsoft it was downloaded from the Internet, thus the default behavior of PowerShell will be to block even the computer administrator from importing the command module. To resolve this the script execution policy must be modified.
- Open a Windows PowerShell session as an administrator and then enter the following cmdlet to query the existing script execution policy configuration.
PS C:\> Get-ExecutionPolicy
Restricted
If this workstation has already been configured to use another product’s external modules then the value may already be set to something other than Restricted. If that is the case then the next step can possibly be skipped, depending on the current value.
If the default value of Restricted is set then this will need to be changed in order to import the Lync command module each time a new PowerShell instance is started.
- In the same PowerShell window enter the following Set-ExecutionPolicy cmdlet to lower the policy to a compatible level of RemoteSigned required to use the Lync Online module.
PS C:\> Set-ExecutionPolicy RemoteSigned
Execution Policy Change
The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose
you to the security risks described in the about_Execution_Policies help topic at
http://go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy?
[Y] Yes [N] No [S] Suspend [?] Help (default is "Y"): y
This completes the one-time setup for the workstation and these steps should not need to be performed again.
Connecting to Lync Online
While there are already a handful of articles on this topic, including the official TechNet documentation, many of these include extraneous steps which make it a bit difficult for the first time user to understand the process. This section will cover the minimum number of basic commands required to connected, while a later section will introduce a customized script which can be used to automate these individual steps for repeated future use.
What is important to understand is that the installed command module does not contain a complete set of Lync Online cmdlets, but is instead a single cmdlet that is used to establish a remote PowerShell session to Lync Online. Each online user account which is configured as an administrator in Lync is allowed up to 3 simultaneously remote PowerShell sessions.
The individual steps listed here all include the optional -Verbose parameter in the screenshots for instructional purposes and can be omitted when running each cmdlet.
- Open a Windows PowerShell session and then enter the Import-Module cmdlet to import the Lync Online command module into the active PowerShell instance.
Import-Module LyncOnlineConnector
If the Import-Module command fails with a message about not being able locate the modules then a reboot may be necessary to complete the previous installation.
- Enter the following command to establish a connection to Lync Online which automatically triggers a prompt for the user credentials of a Lync Online administrator account.
$session = New-CsOnlineSession
- Enter the following command to complete the connection by importing the Lync Online cmdlets form the remote session into the local session.
Import-PSSession $session
These three easy steps have now provided remote PowerShell access to the connected Lync Online tenant. To test connectivity simply try running one of the supported Lync Online cmdlets, like Get-CsClientPolicy.
Managing Lync Online
As previously mentioned there are only a handful of cmdlets for Lync Online so a majority of the common Lync cmdlets will not work here. How is one to know exactly which cmdlets are available to the Lync Online administrator? One option is to look at the TechNet documentation listing the Lync Online cmdlets but as that information is not always up to date another option is to query for the actual list directly from within PowerShell.
In the PowerShell instance from in the previous step notice that the output of the Import-PSSession cmdlet reports a temporary name (e.g. tmp_cmmvwal0.zrc) for the imported session. If that output has already been cleared or scrolled off of the buffer then the following cmdlet can be used to query for it.
- In the existing PowerShell instance run the Get-Module cmdlet to list all currently active modules. Note the name of last entry which lists a “*-Cs*” cmdlet format under the Exported Commands field.
PS C:\> Get-Module
ModuleType Version Name ExportedCommands
———- ——- —- —————-
Script 5.0.0.0 LyncOnlineConnector {New-CsOnlineSession, Set-W…
Manifest 3.1.0.0 Microsoft.PowerShell.Management {Add-Computer, Add-Conte…
Manifest 3.1.0.0 Microsoft.PowerShell.Utility {Add-Member, Add-Type, Clear…
Manifest 3.0.0.0 Microsoft.WSMan.Management {Connect-WSMan, Disable-WSMan…
Script 1.0 tmp_cmmvwal0.zrc {Copy-CsVoicePolicy, Disab…
- Using the temporary name displayed (e.g. tmp_cmmvwal0.zrc) issue the Get-Command cmdlet to list all of the Lync Online cmdlets which where imported into the local session.
PS C:\> Get-Command -Module tmp_cmmvwal0.zrc
CommandType Name ModuleName
———– —- ———-
Function Copy-CsVoicePolicy tmp_cmmvwal0.zrc
Function Disable-CsMeetingRoom tmp_cmmvwal0.zrc
Function Enable-CsMeetingRoom tmp_cmmvwal0.zrc
Function Get-CsAudioConferencingProvider tmp_cmmvwal0.zrc
Function Get-CsClientPolicy tmp_cmmvwal0.zrc
Function Get-CsConferencingPolicy tmp_cmmvwal0.zrc
Function Get-CsDialPlan tmp_cmmvwal0.zrc
Function Get-CsExternalAccessPolicy tmp_cmmvwal0.zrc
Function Get-CsExUmContact tmp_cmmvwal0.zrc
Function Get-CsHostedVoicemailPolicy tmp_cmmvwal0.zrc
Function Get-CsHostingProvider tmp_cmmvwal0.zrc
Function Get-CsImFilterConfiguration tmp_cmmvwal0.zrc
Function Get-CsMeetingConfiguration tmp_cmmvwal0.zrc
Function Get-CsMeetingRoom tmp_cmmvwal0.zrc
Function Get-CsOnlineUser tmp_cmmvwal0.zrc
Function Get-CsPresencePolicy tmp_cmmvwal0.zrc
Function Get-CsPrivacyConfiguration tmp_cmmvwal0.zrc
Function Get-CsPushNotificationConfiguration tmp_cmmvwal0.zrc
Function Get-CsTenant tmp_cmmvwal0.zrc
Function Get-CsTenantFederationConfiguration tmp_cmmvwal0.zrc
Function Get-CsTenantHybridConfiguration tmp_cmmvwal0.zrc
Function Get-CsTenantLicensingConfiguration tmp_cmmvwal0.zrc
Function Get-CsTenantPublicProvider tmp_cmmvwal0.zrc
Function Get-CsUserAcp tmp_cmmvwal0.zrc
Function Get-CsVoicePolicy tmp_cmmvwal0.zrc
Function Grant-CsClientPolicy tmp_cmmvwal0.zrc
Function Grant-CsConferencingPolicy tmp_cmmvwal0.zrc
Function Grant-CsDialPlan tmp_cmmvwal0.zrc
Function Grant-CsExternalAccessPolicy tmp_cmmvwal0.zrc
Function Grant-CsHostedVoicemailPolicy tmp_cmmvwal0.zrc
Function Grant-CsVoicePolicy tmp_cmmvwal0.zrc
Function Invoke-CsUcsRollback tmp_cmmvwal0.zrc
Function New-CsEdgeAllowAllKnownDomains tmp_cmmvwal0.zrc
Function New-CsEdgeAllowList tmp_cmmvwal0.zrc
Function New-CsEdgeDomainPattern tmp_cmmvwal0.zrc
Function New-CsExUmContact tmp_cmmvwal0.zrc
Function Remove-CsExUmContact tmp_cmmvwal0.zrc
Function Remove-CsUserAcp tmp_cmmvwal0.zrc
Function Remove-CsVoicePolicy tmp_cmmvwal0.zrc
Function Set-CsExUmContact tmp_cmmvwal0.zrc
Function Set-CsMeetingConfiguration tmp_cmmvwal0.zrc
Function Set-CsMeetingRoom tmp_cmmvwal0.zrc
Function Set-CsPrivacyConfiguration tmp_cmmvwal0.zrc
Function Set-CsPushNotificationConfiguration tmp_cmmvwal0.zrc
Function Set-CsTenantFederationConfiguration tmp_cmmvwal0.zrc
Function Set-CsTenantHybridConfiguration tmp_cmmvwal0.zrc
Function Set-CsTenantPublicProvider tmp_cmmvwal0.zrc
Function Set-CsUser tmp_cmmvwal0.zrc
Function Set-CsUserAcp tmp_cmmvwal0.zrc
Function Update-CsTenantMeetingUrl tmp_cmmvwal0.zrc
Simplifying the Process
As promised the following guidance can be used to create a script to start up the PowerShell session requiring nothing more than entering the administrator’s password.
- Using either a simple text editor like Notepad or a more advanced tool like Windows PowerShell ISE create a new script file (e.g. LyncOnline.ps1).
- Enter the following text into this file, replacing the highlighted example user account name with the desired administrator account for the appropriate Office 365 tenant.
Import-Module LyncOnlineConnector
$credential = Get-Credential jeff@jdskype.net
$session = New-CsOnlineSession -Credential $credential
Import-PSSession $session
Get-CsTenant | fl DisplayName
- Save the file and then either store it in a path that PowerShell can see by default (e.g. C:\Windows) and simply invoke this script after starting a new PowerShell session.
This basic script will perform all of the required commands including prompting for the supplied account’s password, and then complete with an optional query of the tenant’s Display Name to (a) verify the remote connection is working and (b) list the connected tenant name which may come in handy if administering more than one tenant form the same workstation. The last command can be omitted if desired.
[…] http://blog.schertz.name/2015/04/managing-lync-online-with-powershell/ […]
Jeff, not sure if you want to update this post as there are now 133 cmdlets coming through with SfB\Lync Online one of which being the client policy !
https://dat800.wordpress.com/2016/02/26/additional-lync-sfb-online-cmdlets/
As Microsoft will continue adding cmdlets as new features appear online I do not plan to keep updating this article. The setup process should remain the same but keeping all the latest cmdlets updated here would be a daunting task.
Some of the common stumbling blocks I have encountered with LYO shell.. Number two will amaze you!
http://bit.ly/1Bhe4t4
Hi Jeff,
I’m am trying to test the Office 365 Skype for Business Voice system. We currently use Polycom CX600 handsets. Do you have an idea as to if and when a firmware update will be made available so that the CX600 can work?
Thanks.
Andrew
Current firmware will work for some O365 tenants. I’ve got a CX600 and CX3000 registered to my E3 tenant, but I’ve heard of issues from others. It is unknown if/when those devices will be officially supported with SfB Online.
HI Jeff ,
Is there any scrip to make external communication blocking Skype for Business Skype for common , which is done by user?
Hi Jeff,
I’m trying to automate running Lync BPA so I can generate an action report for team members. Standard powershell cmdlets have an “invoke-bpamodel” that I’ve been using on our DCs. Is there an equivalent command somewhere in the Lync modules? I haven’t seen one, but I also haven’t dug too deep into every module.
Jeff,
I can get contact information when I use Get-CsOnlineUser but Set-CsUser doesn’t have attribute to set it. Is there a way to modify using powershell?
Thanks!
Jung
Is it possible to get individual call details from Skype For Business online. Since we no longer have access to the LcsCDR database I can see a way to do this ? Reports in the O365 admin only show totals and not details. Ive also tried looking at the Microsoft Graph API, online example still only show call totals and never call details.
I have a second issue where I want to get QoE Metrics from Skype For Business online. Anyone know how to do this other than call quality dashboard. I don’t see any references to this data in the Microsoft Graph API.
Any comments would be grateful
[…] en línea de Microsoft Office 365 a través de PowerShell. Van desde ejemplos como un viejo blog post escrito específicamente para Lync en línea a nuevo, actualizado Dirección de Microsoft sobre […]
[…] Managing Lync Online with PowerShell […]
Hi Jeff,
This looks good, but is there’s no mention of PeowerShell core. when I do “import-module LyncOnlineconnector” in PSCore I get
“import-module : The specified module ‘LyncOnlineconnector’ was not loaded because no valid module file was found in any module directory.”
How do I know if that’s an error or if there really isn’t such a module for PowerShell Core?
Thanks
This post is over 5 years old and Lync Online does not exist. You need to use the Skype for Business Online PowerShell Module outlined in this newer article: http://blog.schertz.name/2018/10/managing-office-365-with-powershell/