Pexip Infinity Microsoft Teams Deployment Guide V34.a
Pexip Infinity Microsoft Teams Deployment Guide V34.a
Infinity
Deployment Guide
Software Version 34
March 2024
Pexip Infinity Deployment Guide
Contents
Integration overview 6
Integration features 6
VTC user experience when joining a Teams conference 6
Admitting guest participants from the lobby 8
Microsoft Teams Rooms SIP/H.323 calling 10
Using SIP Guest Join 11
Joining from a meeting room 11
Joining from a personal video endpoint (that is set up for One-Touch Join) 11
Audio participant avatars 11
Raised hand indicators 11
Recording or transcribing a Teams conference 12
Teams-like layout and Large Gallery view 12
Migrating to Microsoft Teams from Skype for Business 13
Streaming to Teams live events 14
Integration overview
Pexip Cloud Video Interoperability (CVI) enables professional SIP and H.323 video conferencing systems to join Microsoft Teams
conferences as if they were native Microsoft clients.
It enables any video conferencing system to join Microsoft Teams meetings and allows authenticated systems to join as trusted
participants without additional user interaction (i.e. lobby by-pass), including:
l H.323 & SIP room-based videoconferencing systems, including Cisco, Polycom, Lifesize, and others
l Browser-based video (WebRTC)
Third-party systems can connect to Teams meetings via the Infinity Gateway either via a Virtual Reception (IVR) or by dialing the
conference directly.
You can also:
l Enable your Microsoft Teams Room systems to make and receive calls with SIP and H.323 endpoints, and join Pexip Infinity VMRs.
l Join Microsoft Teams meetings where that meeting is being hosted by an external third-party organization (even if the host’s
organization has not enabled Pexip interoperability themselves) — this is referred to as "SIP Guest Join". Note that this feature
works by routing the call to the external organization via the Pexip Service.
Integration features
Pexip Infinity is a Microsoft-certified video interoperability platform for Microsoft Teams. The Pexip Teams Connector is a Pexip
application that is deployed in Microsoft Azure and is used to enable Cloud Video Interoperability (CVI) with Microsoft Teams. It
handles all Teams communications and meeting requests from the Pexip Infinity platform and passes them on to the Microsoft Teams
environment.
The key features of Pexip's CVI integration with Microsoft Teams are:
l Call in to a Teams meeting from any standards-based VTC system on SIP and H.323
l Lobby bypass for trusted endpoints, notifications and customizable waiting screen for untrusted VTC endpoints that are held in the
lobby
l Choice of layouts for VTC participants, and spotlight support
l Audio-only participants are represented by their avatar from Exchange Online
l Raised hand, recording and transcription indicators
l Microsoft Teams Rooms SIP/H.323 calling (incoming and outgoing calls)
l Scheduled scaling to automatically scale up and down your call capacity at different times of the day
l Control and ownership of data
l Native VTC network resiliency and firewall traversal between private and public networks
l Bi-directional content sharing between VTCs and Microsoft Teams via Video-based Screen Sharing (VbSS)
l Synchronized mute/unmute control and status for VTCs
l Native scheduling via Outlook and Microsoft Teams client; join information is automatically added
l Tailored meeting invites with a customer-specific domain
l Full lobby and roster list control in the Teams client
Note that Microsoft Teams is inherently a dial-in service i.e. you can only dial from a third-party video system into Teams. You cannot
dial out from Teams to a SIP, H.323 device etc — instead, you have to send the relevant joining instructions/invitation to the user of
that device.
Pexip Infinity’s deployment model allows the use of a customer-specific domain such as [email protected] for dialing the Teams
Virtual Reception.
Alternative VTC dialing instructions can be provided that are customized to the company network and workflow such as:
l [email protected]
l [email protected]
l 104.215.95.187##123958530
Participants using a Teams client join a Teams meeting as usual, and any gatewayed third-party participants can be seen and heard in
the same way as any other directly-connected Teams clients in that meeting. VTC participants see Pexip's standard 1+7 layout by
default, but this can be changed to use other layouts, including a Teams-like layout.
Authenticated, trusted VTCs that are located within the organization can join the conference directly, without any additional user
interaction, whereas unauthenticated, untrusted external VTCs are admitted via the Teams lobby.
Join workflow from a third-party VTC system into a Microsoft Teams meeting (Pexip's default 1+7 layout)
The meeting host can then use their Teams client to admit the waiting guests (the VTC system cannot admit guests).
If only some guests are admitted, the VTC's display refreshes the count of waiting users. If all guests are admitted, the VTC's display
briefly shows a "The lobby is empty" message.
Note that:
l Different calling policies can be applied to certain rooms to, for example, not allow incoming SIP/H.323 calls, while other systems
are enabled for this functionality depending on your business requirements.
l When joining a Teams Meeting the full feature set of a Teams Room is available, including participant list and other advanced
meeting interaction features. However, this is not a call to a Teams meeting, thus when calling a SIP/H.323 destination many of
the standard Teams meeting features (such as call transfer, share whiteboard, and add participant) are not available, as the
functionality for 1:1 calls is focused around bidirectional audio/video communication and content sharing.
Joining from a personal video endpoint (that is set up for One-Touch Join)
1. Accept the meeting invite as usual (OTJ only looks for "accepted" meetings).
2. Press Join at the start of the meeting.
See Enabling SIP Guest Join for configuration and setup details.
Up to 3 indicators may be displayed, in the order that the hand was raised, with the oldest at the top. If there are more than 3 hands
raised then the third indicator also shows the number of additional raised hands.
Note that you cannot use the Connect apps to lower the hand of a Teams participant.
Pexip also supports Microsoft's Large Gallery view — you can use a customized theme to toggle between the Pexip layouts and Large
Gallery view.
See Controlling the layout seen by VTC participants for more information about layouts.
and then in each case the user would be directed to the appropriate Pexip Virtual Reception and would enter the appropriate
conference ID for the relevant Microsoft meeting platform.
Microsoft Teams interoperability with Skype for Business
Microsoft Teams supports some level of interoperability with Skype for Business. This includes the ability to do a point-to-point voice
and video call between Microsoft Teams and Skype for Business (depending on SfB/Teams setup, see https://docs.microsoft.com/en-
us/microsoftteams/teams-and-skypeforbusiness-coexistence-and-interoperability#native-interop-experiences).
As Pexip supports native Skype for Business federation, it is technically possible to place a call between a Teams client (if the tenant is
set up in a supported mode for SfB federation) and Pexip. However due to the limitations of this interoperability, in particular the lack
of support for screen sharing / app sharing between Microsoft Teams and Skype for Business, this is not a use case that Pexip
recommends or provides support for.
The certified interoperability for Microsoft Teams is for a Teams meeting to be scheduled (by an organization enabled for Pexip
interoperability), and non-Teams compatible systems to dial in to the Teams meeting (see user experience below). This type of
integration allows dual stream content sharing.
Architecture overview
The Pexip Teams Connector is a Pexip application that is deployed in Microsoft Azure and is used to enable Cloud Video Interoperability
(CVI) with Microsoft Teams. It handles all Teams communications and meeting requests from the Pexip Infinity platform and passes
them on to the Microsoft Teams environment. The dedicated application ensures control and ownership for organizations with
stringent regulatory compliance requirements.
The diagram below shows the Teams Connector components that are deployed in Azure, and how they interact with the Pexip Infinity
platform and Microsoft Teams. Note that:
l The Azure Virtual Machine scale set (VMSS) allows the Pexip application to run across a group of identical, load balanced VMs.
l The Azure Standard Load Balancer enables the use of Azure Availability Zones, which are used by default if they are available in
your selected region. It is represented twice in the diagram (performing load balancing towards Pexip Infinity, and NAT towards
Teams), but it is the same single Azure resource.
You do not have to set up these Azure components individually — they are all created as part of the Teams Connector deployment
process.
In this example deployment, external endpoints and federated systems, as well as on-premises devices can all connect to Teams
conferences via the Pexip DMZ nodes.
Cloud-hosted deployment
The Pexip Infinity platform can be deployed in a dedicated public or hybrid cloud within your own cloud subscription, providing full
control over your environment.
Here, external endpoints, federated systems and on-premises devices can all connect to Teams conferences via the cloud-hosted Pexip
Infinity nodes. You could use any supported cloud service but you would typically deploy your Conferencing Nodes in Microsoft Azure
alongside your Pexip Teams Connector.
If you have a third-party call control system that you want to retain, it can be configured to connect your on-premises systems to the
cloud-hosted Pexip Infinity platform.
Pexip Infinity has a close integration with Microsoft Teams and uses Teams APIs and Microsoft SDKs to provide Infinity's
interoperability features. Even though Pexip strives to maintain backwards compatibility between older versions of Pexip Infinity and
the latest release of Microsoft Teams, to ensure compatibility with the latest updates to Teams we recommend that you aim to keep
your Pexip Infinity deployment up-to-date with the latest Pexip Infinity software release. If, for example, you have a large Pexip
deployment for non-Teams related services, and you have stringent upgrade procedures meaning that you do not always keep your
Infinity software up-to-date with the latest release, you may want to consider deploying a second instance of the Pexip Infinity
platform that is dedicated to your Teams interoperability requirements, and which can be managed separately and upgraded more
frequently.
See Installing the Teams Connector using a blue-green deployment/upgrade strategy for full details, and see this article for more
background information on blue-green deployments.
The type is specified via $PxAzureVmSize in the variables script and is set to Standard_D4s_v5 by default.
You should consider your VM quota, availability in the region you’re deploying to and pricing. Each instance type has the same call
capacity.
The Azure region must support Automation and your nominated instance type. (See the Microsoft articles Azure automation for more
information about Automation, and Azure product availability by region.)
You can use the following PowerShell script to list the current set of Azure regions that support Automation and your preferred
instance type. The script currently lists where Standard_D4s_v5 is supported but you can change this (highlighted in orange in the
script) to Standard_D4as_v5 or Standard_F4s as required.
$(
$automationLocations = ((Get-AzResourceProvider -ProviderNamespace Microsoft.Automation).ResourceTypes | Where-Object ResourceTypeName -eq
automationAccounts).Locations;
$vmLocations = ((Get-AzResourceProvider -ProviderNamespace Microsoft.Compute).ResourceTypes | Where-Object ResourceTypeName -eq
locations/virtualMachines).Locations;
$vmInstanceLocations = $vmLocations | ?{ 'Standard_D4s_v5' -in @(Get-AzVMSize -Location $_ | %{ $_.Name }) };
Get-AzLocation | ?{ ($_.DisplayName -in $automationLocations) -and ($_.DisplayName -in $vmInstanceLocations) }
) | Select-Object -Property DisplayName,Location
Note this script does not support the Department of Defense (DoD) / Azure Government regions.
Ensure that you have sufficient resource quota and capacity for your region and instance types
By default, Azure Resource Manager virtual machine cores have a regional total limit and a regional per series limit, that are enforced
per subscription. Typically, for each subscription, the default quota allows up to 10-20 CPU cores per region and 10-20 cores per series.
The allocated quota may be increased by opening a support ticket with Microsoft via the Azure Portal. Based on your capacity
requirement, you should request a quota increase for your subscription. Ensure that you request a sufficient number of CPU cores.
Each Teams Connector instance will use 4 vCPU of type Dsv5-series (Dasv5-series, Fs-series). Thus, for example, if 6 Teams Connector
instances are required, then the quota must be increased to 4 cores x 6 Dsv5-series (Dasv5-series, Fs-series) instances = 24 CPU cores
of type Dsv5-series (Dasv5-series, Fs-series). However we strongly recommend that you request a quota covering more than the
minimum, such as 40 cores, to allow for an increase in the future. It may take a number of days for the quota increase request to be
processed. For more information see this article.
l You must have one or more publicly-reachable Conferencing Nodes. Those nodes:
o can be Transcoding Conferencing Nodes or Proxying Edge Nodes
o can have static NAT and/or dual network interfaces, as the Teams Connector is treated as a lineside connection.
l The public-facing Conferencing Nodes always communicate with the Teams Connector via public IP, even if they are within the
same Azure tenant.
l The Teams Connector communicates with the Teams (Microsoft 365) backend via public IP; all traffic stays within the Microsoft
network.
l The Teams Connector supports connections over TLSv1.2 only, and does not support RC2, RC4, DES and 3DES ciphers.
As an alternative network configuration you can consider using private routing between the Teams Connector and Pexip Infinity — see
Using private routing with the Teams Connector for more information. If you don't want to use private routing but still need more
control over the Teams Connector VNET, you can deploy and use your own customized VNET — see Using a custom VNET with the
Teams Connector.
In summary, the certificate usage principles are:
l The Teams Connector and Pexip Infinity validate the connection in both directions by TLS client certificate validation. This means
that every certificate's Enhanced Key Usage properties must be set for both server and client authentication.
l Public-facing Conferencing Nodes must have a valid publicly-signed PEM-formatted certificate (typically with a .CRT or .PEM
extension).
l The Teams Connector must have a publicly-signed PFX-formatted certificate. Multiple names/certificates are required if deploying
Teams Connectors in several regions.
Obtaining and preparing the TLS certificate for the Teams Connector
You must install on the Teams Connector a TLS certificate that has been signed by an external trusted CA (certificate authority).
You need to have this certificate available before you install the Teams Connector.
The certificate must be in Personal Information Exchange Format (PFX), also known as PKCS #12, which enables the transfer of
certificates and their private keys from one system to another. It must use RSA keys.
1. Decide on the FQDN (DNS name) you will use for the Teams Connector load balancer in Azure that will front the Teams Connector
deployment e.g. pexip-teamsconn-eu.teams.example.com.
o This FQDN is what you will use as:
n the value of $PxTeamsConnFqdn in the variables initialization script
n the certificate's subject name
n the DNS name you will configure in Pexip Infinity (Call Control > Microsoft Teams Connectors > Address Of Teams
Connector) later in the process.
o It can use the same domain space as your Pexip Infinity deployment, or your Teams deployment, or it can use an altogether
different domain. In all cases you always need to create the necessary DNS CNAME record(s) and public certificates for the
chosen domain.
o If you intend to deploy other Teams Connectors in other Azure regions, you will need a different DNS name for each Teams
Connector and a certificate that matches that identity. You can use a single certificate for this, containing Subject Alternative
Name (altNames attribute) entries for all of the regional Teams Connectors.
o It can be a wildcard certificate, where the wildcard character ('*') is the only character of the left-most label of a DNS domain
name. Note that Pexip supports RFC 6125 — this means that if you are using subdomains then, for example, a wildcard
certificate of *.example.com would match foo.example.com but not bar.foo.example.com or example.com.
2. Request a certificate for that name and generate the certificate in PFX format. Any intermediate certificates must also be in the
PFX file.
You can use the Pexip Infinity Management Node to generate a certificate signing request (CSR).
You can use the Pexip Infinity Management Node to convert PEM certificates to PFX format (or vice versa), by uploading a PEM-
formatted certificate and then downloading it again in PFX format. When downloading you can also include the private key and all
necessary intermediate certificates in the PFX bundle.
Conferencing Nodes
Conferencing 33000–39999 Teams Connector 443 TCP Initial call signaling is via the load balancer.
Nodes * load balancer When the call is established, signaling is
ephemeral directly between the Conferencing Node and
Teams Connector
the Teams Connector instance.
instance
Management Node
Management ephemeral Teams Connector 5671 AMQPS Only required if the Azure Event Hub is
Node Azure Event Hub enabled for advanced status reporting
Teams Connector ephemeral Conferencing 443 TCP Signaling (4277 is for calls between Microsoft
instance Nodes Teams Rooms and VTC endpoints)
4277
Teams Connector ephemeral Teams Connector 5671 AMQPS Only required if the Azure Event Hub is
instance Azure Event Hub enabled for advanced status reporting; this
port is managed by the Azure NSG
12000-12399
Management
Management <any> Teams Connector 50000-50399 TCP Only enabled for any workstation addresses
workstation load balancer specified during Teams Connector installation
* Configurable via the Media port range start/end, and Signaling port range start/end options.
† The Conferencing Nodes referenced in the InstructionUri for the "Alternate VTC dialing instructions".
You may need to modify some of the NSG rules in the future if you subsequently add more Conferencing Nodes to your Pexip Infinity
platform, or change the addresses of any management workstations.
In addition to this:
l You must allow the relevant ports through any of your own firewalls that sit between the Teams Connector components and your
public-facing Conferencing Nodes and management networks.
l If you enable advanced status reporting you must also allow the Pexip Infinity Management Node to connect out to the Azure
Event Hub component. If required you can also lock down the Event Hub to only allow internet access from your Management
Node IP address; access is currently unrestricted as it is secured by a connection string and the AMQPS protocol.
The following diagram shows the example Conferencing Node naming patterns, certificate, and DNS requirements to support these call
scenarios.
Note that the same Conferencing Nodes can be used for all other Pexip Infinity services, such as routing calls into Microsoft Skype for
Business and Lync environments, and the certificate and DNS naming requirements and examples are compatible with all Pexip Infinity
deployment scenarios.
Teams Connector and Conferencing Node certificates
In summary, the certificate usage principles are:
l The Teams Connector and Pexip Infinity validate the connection in both directions by TLS client certificate validation. This means
that every certificate's Enhanced Key Usage properties must be set for both server and client authentication.
l Public-facing Conferencing Nodes must have a valid publicly-signed PEM-formatted certificate (typically with a .CRT or .PEM
extension).
l The Teams Connector must have a publicly-signed PFX-formatted certificate. Multiple names/certificates are required if deploying
Teams Connectors in several regions.
1. Decide on the FQDN (DNS name) you will use for the Teams Connector load balancer in Azure that will front the Teams Connector
deployment e.g. pexip-teamsconn-eu.teams.example.com.
o This FQDN is what you will use as:
n the value of $PxTeamsConnFqdn in the variables initialization script
n the certificate's subject name
n the DNS name you will configure in Pexip Infinity (Call Control > Microsoft Teams Connectors > Address Of Teams
Connector) later in the process.
o It can use the same domain space as your Pexip Infinity deployment (i.e. vc.example.com in this example), or your Teams
deployment, or it can use an altogether different domain. In all cases you always need to create the necessary DNS CNAME
record(s) and public certificates for the chosen domain.
o If you intend to deploy other Teams Connectors in other Azure regions, you will need a different DNS name for each Teams
Connector and a certificate that matches that identity. You can use a single certificate for this, containing Subject Alternative
Name (altNames attribute) entries for all of the regional Teams Connectors.
o It can be a wildcard certificate, where the wildcard character ('*') is the only character of the left-most label of a DNS domain
name. Note that Pexip supports RFC 6125 — this means that if you are using subdomains then, for example, a wildcard
certificate of *.example.com would match foo.example.com but not bar.foo.example.com or example.com.
2. Request a certificate for that name and generate the certificate in PFX format. Any intermediate certificates must also be in the
PFX file.
You can use the Pexip Infinity Management Node to generate a certificate signing request (CSR).
You can use the Pexip Infinity Management Node to convert PEM certificates to PFX format (or vice versa), by uploading a PEM-
formatted certificate and then downloading it again in PFX format. When downloading you can also include the private key and all
necessary intermediate certificates in the PFX bundle.
DNS records
In DNS, ensure that the following records are configured:
l An A-record for each Conferencing Node. In our example this is 2 records with host names of conf01 and conf02, and they each
point to the individual IP address of the node.
For example (change the hostnames and IP addresses as appropriate for your actual deployment):
conf01.vc.example.com. 86400 IN A 10.44.0.10
conf02.vc.example.com. 86400 IN A 10.44.0.11
To allow enterprise-based VTC systems to dial directly into Microsoft Teams meetings, or dial a Pexip Virtual Reception using aliases in
the format <alias>@example.com (for example [email protected]), you must configure local DNS SRV records. These example
records will direct calls from H.323 devices, SIP devices and Connect apps (via the _pexapp SRV record) that are placed to the top-level
example.com domain to your Conferencing Nodes in your private enterprise network (that are hosted in the vc.example.com
subdomain):
In addition, those VTC devices and Connect apps may also want to call into Pexip Infinity services with addresses in the form
[email protected]. The local DNS records to support those calls would be:
_h323cs._tcp.vc.example.com. 86400 IN SRV 10 10 1720 conf01.vc.example.com.
_h323cs._tcp.vc.example.com. 86400 IN SRV 10 10 1720 conf02.vc.example.com.
Your standard DNS A records for your public DMZ Conferencing Nodes will typically already exist:
px01.vc.example.com. 86400 IN A 198.51.100.40
px02.vc.example.com. 86400 IN A 198.51.100.41
Certificates
The Conferencing Nodes (typically Proxying Edge Nodes) that will communicate with the Teams Connector must have TLS certificates
installed that have been signed by an external trusted CA (certificate authority). If a chain of intermediate CA certificates is installed on
the Management Node (to provide the chain of trust for the Conferencing Node's certificate) those intermediate certificates must not
include any HTTP-to-HTTPS redirects in their AIA (Authority Information Access) section.
The certificate guidelines are the same as for any internal Conferencing Nodes as described above, except that you should use a
different pool name and certificate:
l We recommend that you generate and use a single SAN certificate that encompasses all of the public DMZ-based "Edge"
Conferencing Nodes:
o The Subject name should be a common pool name, such as px.vc.example.com in our examples.
o The Subject Alternative Name (altNames attribute) entries must include the Subject name plus the FQDNs of all of the nodes
in the pool that are involved in any call signaling, such as px01.vc.example.com and px02.vc.example.com in our examples.
l Assign the same certificate to all of the public DMZ-based Conferencing Nodes that are involved in call signaling and
communications with the Teams Connector.
l Conferencing Nodes require PEM-formatted certificates (typically with a .CRT or .PEM extension).
Note that before configuring these DNS records you should check that there are no other example.com records for SIP and H.323 that
are already configured and that are routing such calls elsewhere. (You can use the tool at http://dns.pexip.com to lookup and check
SRV records for a domain.)
You then need to configure appropriate Virtual Reception and Call Routing Rules on your Pexip Infinity system that will route those
calls (placed to @example.com) onwards to Microsoft Teams. See Configuring Pexip Infinity as a Microsoft Teams gateway for
more information.
DNS records for routing calls to @vc.example.com
In addition, the following public DNS SRV records will route calls from H.323 devices, SIP devices and Connect apps placed to your
@vc.example.com subdomain to your Pexip Conferencing Nodes in the public DMZ:
_h323cs._tcp.vc.example.com. 86400 IN SRV 10 10 1720 px01.vc.example.com.
_h323cs._tcp.vc.example.com. 86400 IN SRV 10 10 1720 px02.vc.example.com.
Similarly you will then need suitable Call Routing Rules on your Pexip Infinity system to handle calls placed to @example.com.
Support for federated Skype for Business / Lync systems via the vc.example.com subdomain
If you want to enable federation for SfB/Lync clients to allow them to connect to Microsoft Teams (or other Pexip Infinity services)
through your Pexip Conferencing Nodes in the public DMZ, you need a federation DNS SRV record for your Pexip Infinity subdomain
that will handle calls placed to aliases in the format [email protected].
Note that SfB/Lync clients should use direct routing aliases into Teams conferences. If they are routed via a Virtual Reception the call
will revert to audio-only during the transfer.
The _sipfederationtls._tcp.vc.example.com DNS SRV and associated round-robin A-records shown below will route calls from
federated SfB/Lync clients that are placed to the Pexip Infinity subdomain (@vc.example.com) to your Pexip Conferencing Nodes in the
public DMZ (using the pool hostname px.vc.example.com):
_sipfederationtls._tcp.vc.example.com. 86400 IN SRV 1 100 5061 px.vc.example.com.
px.vc.example.com. 86400 IN A 198.51.100.40
px.vc.example.com. 86400 IN A 198.51.100.41
Note that these A-records specified for the px.vc.example.com pool are required in addition to the "standard" A-records that will exist
for each Conferencing Node based on their individual hostnames and resolve to the same IP addresses.
More stringent configuration and certificate guidelines also apply when handling SfB/Lync calls:
l The Configured FQDN setting on each Conferencing Node must match the node's DNS FQDN and it must be unique per node. For
example, if the node's DNS FQDN is px01.vc.example.com then its Configured FQDN setting must also be px01.vc.example.com.
l The certificate on each Conferencing Node must include the hostname referenced by the _sipfederationtls._tcp SRV record that
points to those nodes, plus the names of all of the Conferencing Nodes that are involved in call signaling:
o The Subject name (commonName attribute) should be set to the target hostname referenced by the _sipfederationtls._tcp
SRV record (the pool name of the Conferencing Nodes).
In our examples, if the DNS SRV record is:
_sipfederationtls._tcp.vc.example.com. 86400 IN SRV 1 100 5061 px.vc.example.com.
Note that the _sipfederationtls._tcp SRV record is used to route incoming calls from SfB/Lync clients. If you do not need to support
SfB/Lync calls then you do not need a _sipfederationtls._tcp SRV record.
By using a subdomain for your Pexip environment i.e. <subdomain>.example.com, such as vc.example.com in our example, you can
avoid any conflicts with your SfB/Lync environment.
However, by creating the H.323/SIP/Web App DNS SRV routing records for calls to @example.com as described above, you can provide
a dial-in lobby address of:
l [email protected] for interoperability into Skype for Business meetings
and
l [email protected] for interoperability into Teams meetings
and then in each case the user would be directed to the appropriate Pexip Virtual Reception and would enter the appropriate
conference ID for the relevant Microsoft meeting platform.
Your SfB/Lync-oriented routing rules in Pexip Infinity would then direct the SfB/Lync calls to your SfB/Lync environment, and your
Teams-oriented routing rules would direct the Teams calls into Microsoft Teams via the Teams Connector.
1. Download the Teams Connector ZIP file (Pexip_Infinity_Connector_For_Microsoft_Teams_v34_<build>.zip) from the Pexip
download page.
Ensure that the Teams Connector version you download is the same version as your Pexip Infinity deployment (including minor/
"dot" releases).
2. Extract the files to a folder on a local drive on your administrator PC.
3. Verify that the ZIP file is extracted and that you see the following files:
4. Add your PFX certificate (that also contains all of your intermediates) for the Teams Connector to this folder.
1. Update the variables in the initialization script with the real values for your environment, and then run the initialization script.
2. Create the resource groups used by the Teams Connector.
3. Create the Microsoft Entra ID (formerly called Azure AD) application used to secure the Teams Connector API and save the App ID
in the variables initialization script.
4. Deploy the Teams Connector by running the installation script.
5. Store the CVI App ID and CVI App certificate password in a password manager — these variables are needed to redeploy the
Teams Connector. Also, store the CVI App certificate PFX file in a safe location.
6. Update DNS with the Teams Connector's name and IP address.
7. Authorize the Pexip CVI application to join Teams meetings.
8. Authorize the app to bypass the Teams lobby and configure dialing instructions.
The steps above describe the first-time installation process for a standard deployment. If you want to follow a blue-green
deployment/upgrade strategy, see Installing the Teams Connector using a blue-green deployment/upgrade strategy. If you
subsequently need to redeploy or upgrade your Teams Connector, you need to follow the process described in Maintaining your
Teams Connector deployment. If you want to deploy another Teams Connector in a different Azure region, see Installing Teams
Connectors in multiple Azure regions.
Certificate-based authentication (CBA) is the default documented/scripted method from version 34 to authenticate the Teams
Connector CVI application towards MS Graph. You can still use the previous password-based authentication method, but we plan to
deprecate it in a future release, thus we recommend using CBA for new installations, or migrating to CBA as soon as practicable when
upgrading existing deployments.
If you need to temporarily continue using password-based authentication, see Using password-based authentication for the Teams
Connector CVI application.
The following diagram shows a summary of which scripts are used when initially installing and then subsequently maintaining your
Teams Connector deployment. The variables initialization script is always the first script used in all scenarios.
General information about using PowerShell with Microsoft Graph and Office 365 can be found at https://docs.microsoft.com/en-
us/graph/powershell/get-started.
You need to specify a range of PowerShell variables that are used during the installation process.
We recommend that you save these variables as a separate initialization script that you can reuse (and subsequently update if
necessary). This will make it easier if you have to abort and restart the installation for any reason, or if you redeploy or upgrade your
Teams Connector in the future.
You must replace the example values set in the variables with the real values for your deployment.
If you are deploying a Teams Connector in multiple regions, create a separate initialization script for each region, changing the
relevant region-specific variables as appropriate. Save each region-specific version of your script in a safe place.
The PowerShell variables initialization script is listed below.
Note that this script does not produce any output. It only sets some variables for subsequent use in the installation script.
# Powershell variables
# Set the following variables for ease of use of the subsequent commands - if starting a new window, just re-set these variables.
# Name prefix for all Teams Connector resources, e.g. company name.
# PxBaseConnName can have a maximum of 9 characters
# PxBaseConnName + PxVmssRegion must be minimum 3 and maximum 14 chars when combined
# It has to begin with a letter and cannot contain dashes, spaces or other non a-z0-9 chars.
$PxBaseConnName = "yourname" # replace with your company name
# Freetext region shortname (2-4 characters, no dashes, only use a-z) to separate regional deployments and/or
# to differentiate between deployment versions if you are following a blue-green deployment strategy
$PxVmssRegion = "eu"
# Hostname of Teams Connector in Azure - Must match name in pfx certificate below
# You need a different hostname for each region
$PxTeamsConnFqdn = "pexip-teamsconn-eu.teams.example.com"
# Conference or Edge node pool (must be reachable from Teams Connector in Azure)
# This name must exist in the certificate presented by the Pexip nodes
# Example 1) Multiple individual Edge nodes
# $PxNodeFqdns = "us-pxedge01.vc.example.com,us-pxedge01.vc.example.com"
# Example 2) Certificate with SAN names, this name is in the cert presented by all nodes
$PxNodeFqdns = "pxedge.vc.example.com"
# Username for the Windows VM accounts. Specifies the name of the administrator account.
# Windows-only restriction: Cannot end in "."
# Disallowed values: "administrator", "admin", "user", "user1", "test", "user2", "test1", "user3", "admin1",
# "123", "a", "actuser", "adm", "admin2", "aspnet", "backup", "console", "david", "guest", "john", "owner",
# "root", "server", "sql", "support", "support_388945a0", "sys", "test2", "test3", "user4", "user5", "1".
# It must be between 1 and 20 characters long
$PxWinAdminUser = "pexadmin"
# Wildcard, SAN or single name cert for FQDN of Teams Connector (PxTeamsConnServiceFQDN),
# the PFX must contain the intermediate chain as well.
$PxPfxCertFileName = ".\your_connector_certificate.pfx"
# These are the IPs/subnets that are allowed to access the Admin Consent web page.
# If not specified it is exposed/public by default. If left exposed then anyone accessing this web page can
# see the company's app IDs. You can alternatively stop the app service after granting consent.
# The page URL is in the form: https://$PxBaseConnName-pexip-cvi-abcde.azurewebsites.net/
#
# Example (specifying the Pexip management networks defined above):
# $PxConsentSourceAddressPrefixes = $PxMgmtSrcAddrPrefixes
$PxConsentSourceAddressPrefixes = @()
# Do you want to allow Microsoft to track and report to Pexip the Azure usage associated with this deployment?
# You must set $PxCustomerUsageAttribution to either $true (allow reporting) or $false (no reporting)
$PxCustomerUsageAttribution = <replace with $true or $false>
# Optional tags (name-value pairs) to apply to Azure resources and resource groups
# For example $tags= @{"ResourceOwner"="user@domain"; "CostCenter"="Video Services";}
$tags= @{}
# Teams Connector API app ID - update this with the API App ID that is created during the installation process
# If you are deploying in multiple regions you will have a different App ID per region
$TeamsConnectorApiApplicationId = ""
# If set to $true, the Azure functions apps are deployed using dedicated function app plan.
# This incurs additional charges, but allows for advanced networking configuration and increased stability.
$FunctionsDedicatedHostingPlan = $false
# IP addresses of the Pexip Management Node / NAT gateway that can communicate with the Teams Connector Event
# Hub over port 5671.
# This only applies if used together with dedicated functions and VNet integration:
# (parameter FunctionsDedicatedHostingPlan and parameter VnetIntegration).
# These addresses can also be added after the deployment.
# Example: Pexip Management Node public IP address or NAT address:
# x.x.x.x - IP of mgr.vc.example.com
# z.z.z.0/24 - IP subnet of mgr.vc.example.com
$EventHubSourceAddressPrefixes = @()
# If set to $true, certain resources (key vault, storage accounts and event hubs) will be
# accessible via virtual network instead of public endpoint.
# (With the exception of the Event hub -> Management Node connection.)
# This only applies if used together with dedicated functions (parameter FunctionsDedicatedHostingPlan).
$VnetIntegration = $false
# Set to $true if your organization participates in Microsoft's Azure Hybrid Benefit scheme
$PxUseAzureHybridBenefit = $false
# The FQDN of the Teams Connector from the perspective of Pexip Infinity — it must match the name in
# the Connector's PFX certificate.
# If the Teams Connector sits behind an additional proxy, this should be set to the FQDN of that proxy.
# If not set it defaults to TeamsConnectorFqdn ($PxTeamsConnFqdn), which is normally correct.
$PexipConfiguredConnectorFqdn = ""
# If set to $true, an additional internal load balancer is created (to support private routing).
# VNET peering must be enabled between the Infinity VNET and the Teams Connector's VNET.
# When Infinity is deployed in Azure, it allows traffic to be routed between Infinity and the
# Teams Connector through Microsoft's private network only.
$PxUsePrivateRouting = $false
The initialization script contains the following variables. If you are deploying a Teams Connector in multiple regions, each version
of your script per region should use a different value for those variables ticked as Regional.
$PxAzureVmSize This specifies the type/size of the virtual machines in the Virtual Machine Scale Set
(VMSS). Each instance type has the same call capacity. See Preparing your Azure
environment, regions, instance type, and capacity planning for more information.
Default: Standard_D4s_v5
$PxBaseConnName This is a prefix used when naming all Teams Connector resources. We recommend
using your own company name.
Note that if you are setting up multiple test environments within the same Azure
subscription, ensure that each Teams Connector deployment has a unique
$PxBaseConnName.
$PxVmssRegion A short (we recommend 2-8 characters) name to differentiate resource names in your
deployments:
l It can be used to represent the region in which you are deploying the Teams
Connector, for example, "eu". This will help in your naming convention if you
deploy the Teams Connector in multiple regions.
l You can also use this variable to name your deployments if you are following a
blue-green deployment strategy, for example "blue".
l If you have multiple regions and are also following a blue-green strategy then just
combine the two names, for example "eublue".
It cannot contain dashes, spaces or other non a-z0-9 characters.
This name must match the subject name in the PFX certificate specified in
$PxPfxCertFileName. If you are installing multiple Teams Connectors in different
regions you must use a different hostname for each region.
This is also the name you will configure in Pexip Infinity (Call Control > Microsoft
Teams Connectors > Address Of Teams Connector) later in the process.
$PxNodeFqdns The pool name or names of the Conferencing Nodes (typically Proxying Edge Nodes)
that will communicate with the Teams Connector. This can be a comma-separated list. (typically)
The name(s) specified here must exist in the certificate presented by those
Conferencing Nodes. These names cannot include wildcard characters.
See Ensuring Conferencing Nodes have suitable certificates for more information.
$PxSubscriptionId The Azure Subscription ID for your Teams Connector installation and Azure bot
resource. This takes the GUID format "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee".
$PxAzureLocation The name of the Azure region into which you are deploying the Teams Connector, for
example "westeurope", "southcentralus" etc. as per the RegionName in Decide Azure
deployment region(s) and instance type.
$PxWinAdminUser The account username for the Windows VMs that will be created in Azure. You may
need this for RDP login when troubleshooting.
$PxWinAdminPassword The account password for the Windows Teams Connector VMs that will be created in
Azure. If you don't want to store the password in the variables script, you can skip this
step and specify the password later from within the installation script (via Get-
Credential cmdlet).
Each instance can handle approximately 10 VTC connections into Teams meetings.
You can easily modify the number of instances via the Azure portal after installation of
the Teams Connector, to reflect changing capacity requirements.
$PxTeamsConnResourceGroup The regional resource group name for dynamic VMSS resources. We recommend
Name setting this variable to a concatenated combination of the first two variables plus some
additional text, for example:
$PxTeamsConnResourceGroupName = "$($PxBaseConnName)-TeamsConn-
$($PxVmssRegion)-RG"
$PxTeamsConnStaticResource The static regional resource group name. This stores static resources such as name and
GroupName address information for the load balancer, and the Azure Key Vault. It should follow
the same pattern as the previous variable ($PxTeamsConnResourceGroupName), and
be set to a concatenated combination of the first two variables plus some additional
text, for example:
$PxTeamsConnStaticResourceGroupName = "$($PxBaseConnName)-TeamsConn-
$($PxVmssRegion)-static-RG"
which, in our examples, would generate a static resource group name of pexip-
TeamsConn-eu-static-RG.
This is the resource group that must be created before running the installation
script (see Create the resource groups).
$PxBotResourceGroupName The Azure bot resource group name. It should follow the same pattern as the other
resource group names. We recommend:
$PxBotResourceGroupName = "$($PxBaseConnName)-TeamsBot-RG"
$PxTeamsConnIncidentReporting When this feature is enabled, incident reports are sent automatically to a secure web
server owned and managed by Pexip. The options are $true to enable incident
reporting or $false to disable reporting. We recommend keeping this enabled.
$PxPfxCertFileName The filename of the PFX certificate file to upload to the Teams Connector. See
Obtaining and preparing the TLS certificate for the Teams Connector for more
information.
Any addresses specified here are added into the Azure Network Security Group "RDP"
rule that is assigned to the Teams Connector instances to allow RDP access to those
instances from those addresses. You should not perform any security scans from these
addresses.
$PxNodesSourceAddressPrefixes Specifies the public IP addresses of the Conferencing Nodes (typically Proxying Edge
Nodes) that can communicate with the Teams Connector instances over port 443 (typically)
(https).
For example, if these are the public addresses of your Pexip Conferencing Nodes:
a.a.a.a - IP of us-pxedge01.vc.example.com
c.c.c.0/28 – IP subnet of eu-pxedges (allows for future expansion)
$PxConsentSourceAddress Specifies the external IP address (as seen from the Teams Connector's perspective) of
Prefixes the workstation / management network that will provide consent for the Pexip CVI app
to access Microsoft Teams in the Office 365 tenant.
If not specified, the consent page is exposed/public by default. If left exposed then
anyone accessing this page can see the company's app IDs. As an alternative to
restricting access, you can stop the Azure app service after granting consent (the app
service is in the <prefix>-TeamsBot-RG resource group).
For example, to use the Pexip management networks defined above you would
specify:
$PxConsentSourceAddressPrefixes = $PxMgmtSrcAddrPrefixes
Alternatively, you can specify specific addresses in the same way as shown above when
defining the values for $PxNodesSourceAddressPrefixes.
$PxWupdScheduledInstallDay Schedules the installation of Windows updates (everything that applies to Windows
Server 2016) to a specific day.
A string in the range "0"-"7" where "0" = every day and "1" through "7" are the days of
the week from Sunday ("1") to Saturday ("7").
$PxWupdScheduledInstallTime Schedules the Windows update installation time to a specific hour (UTC).
A string in the range "0"-"23" starting with 12 AM ("0") and ending with 11 PM ("23").
$PxWupdActiveHoursStart Sets the active (business) hours to start at a specific hour (UTC). If a restart is needed
to finish a Windows update, it won't take place during the active hours.
A string in the range "0"-"23" starting with 12 AM ("0") and ending with 11 PM ("23").
$PxWupdActiveHoursEnd Sets active (business) hours to end at a specific hour (UTC). The time between Active
hours start and Active hours end is limited to a maximum of 18 hours. The script stops
if this is not the case.
A string in the range "0"-"23" starting with 12 AM ("0") and ending with 11 PM ("23").
$PxCustomerUsageAttribution Controls whether Microsoft tracks and reports to Pexip the Azure usage that is
associated with your deployment of Pexip software. When enabled, Microsoft can
identify the installation of Pexip software and correlate the Azure resources that are
used to support that software. Microsoft collects this information to provide the best
experiences with their products and to operate their business. The data is collected
and governed by Microsoft's privacy policies, which can be found at
https://www.microsoft.com/trustcenter.
The data made visible to Pexip is controlled by Microsoft, and as of April 2019 includes
usage and spend on all of the Azure resources associated with your Teams Connector.
You can also track your usage of resources within the Azure portal.
$tags You can optionally specify a set of tags (name-value pairs) to apply to the Azure
resources and resource groups that are created for the Teams Connector. For example,
to apply a tag named "ResourceOwner" with a value of "user@domain" and a second
tag named "CostCenter" with a value of "Video Services" you would use:
$tags= @{"ResourceOwner"="user@domain"; "CostCenter"="Video Services";}
To not apply any tags, leave the variable set to an empty hash table:
$tags= @{}
$TeamsConnectorApiApplicationId The ID of the Microsoft Entra ID application that is used to secure requests to the
Teams Connector APIs.
It is created during the installation process as described below at Create the Teams
Connector API app, and you should then set this variable to the ID generated by that
process.
If you are deploying in multiple regions you'll have a different API App ID per region.
$FunctionsDedicatedHostingPlan If set to $true, the Azure functions apps are deployed using a dedicated function app
plan. This incurs additional charges, but allows for advanced networking configuration
and increased stability.
$EventHubSourceAddressPrefixes Specifies the IP addresses of the Pexip Management Node / NAT gateway that can
communicate with the Teams Connector Event Hub over port 5671.
This only applies if used together with dedicated functions and VNet integration
(parameter FunctionsDedicatedHostingPlan and parameter VnetIntegration).
$VnetIntegration If set to $true, certain resources (Key Vault, storage accounts and Event Hubs) will be
accessible via the virtual network instead of public endpoint (with the exception of the
Event Hub to Management Node connection). It only applies if used together with
dedicated functions (parameter FunctionsDedicatedHostingPlan).
$PxUseAzureHybridBenefit Set this option to $true if your organization uses Azure Hybrid Benefit and you want to
take advantage of this licensing for your Teams Connector virtual machines. For more
information, see Microsoft's website.
$PexipConfiguredConnectorFqdn This is used for Microsoft Teams Rooms SIP/H.323 calling, and is typically only required
in advanced deployments, otherwise it can be left blank ("").
Set it to the FQDN of the Teams Connector from the perspective of Pexip Infinity — it
must match the name in the Teams Connector's PFX certificate.
If the Teams Connector sits behind an additional proxy, such as an Azure Traffic
Manager, this should be set to the FQDN of that proxy.
Set it to the DNS name of the Conferencing Nodes to target when dialing out to Pexip
Infinity from a Teams Room. It should represent all external nodes and could be either
round-robin DNS, a reverse proxy, or anything else that load balances across Pexip
Infinity.
A value only needs to be assigned if MTR calling is needed, otherwise it can be left
blank ("").
Default = ""
See Using a custom VNET with the Teams Connector and Using private routing with the
Teams Connector for more information.
$PxUsePrivateRouting If set to $true, an additional internal load balancer is created (to support private
routing).
Default = $false
See Using private routing with the Teams Connector for more information.
Enabling the CIS STIG image (GCC High / Azure US Government Cloud deployments only)
Please skip this section if you are following a standard deployment model.
If this is a GCC High / Azure US Government Cloud deployment, and you are using the CIS STIG image, there are some additional steps
required to enable the image in Azure.
Note that using the CIS STIG image is optional, but typical, in GCC High deployments. If you do not want to use a STIG image you can
skip this section and also remove the VmImage switch from the installation script.
Installation commands to connect to Microsoft Graph, Azure Resource Manager and deploy
the Teams Connector
This section describes the Azure permissions, steps and PowerShell commands used to install the Teams Connector.
First-time use
You must install supported versions of PowerShell modules.
1. Open a new PowerShell ISE or PowerShell session before you install the modules.
2. Run the following PowerShell commands (as Administrator):
Note that:
l The Az PowerShell module collects telemetry data (usage data) by default, however you can opt out from this data collection using
Disable-AzDataCollection (see this article for more information).
l The Az PowerShell module remembers login information by default (i.e. you're not automatically logged out when closing your
PowerShell window), but you can disable this with Disable-AzContextAutosave if required (see this article for more information).
# Set execution policy for the current PowerShell process, when prompted type A (Yes to All)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
# The Unblock-File cmdlet lets you run PowerShell script files that were downloaded from the internet.
# By default, these files are blocked to protect the computer from untrusted files.
Get-ChildItem -Recurse | Unblock-File
# Resource group for static resources for the Teams Connector / region
New-AzResourceGroup -Name $PxTeamsConnStaticResourceGroupName -Location $PxAzureLocation -Force -Tag $tags
5. Ensure that the person who will perform all of the remaining installation steps has the Azure Owner role for the static and
dynamic resource groups, and Contributor role for the Azure Bot resource group you have just created. If the Owner of the Azure
subscription will perform all of the remaining installation steps then you can skip to Create the Teams Connector API app below.
Otherwise, you must run the following commands to assign the required roles for the resource groups you have just created to
the person who will perform all of the remaining installation steps:
New-AzRoleAssignment -SignInName <email_name> -RoleDefinitionName "Owner" -ResourceGroupName
$PxTeamsConnStaticResourceGroupName
New-AzRoleAssignment -SignInName <email_name> -RoleDefinitionName "Owner" -ResourceGroupName $PxTeamsConnResourceGroupName
New-AzRoleAssignment -SignInName <email_name> -RoleDefinitionName "Contributor" -ResourceGroupName $PxBotResourceGroupName
where <email_name> is the email address / user principal name of the person who will perform the remaining installation steps;
for example where [email protected] will perform the upgrade/redeploy, the SignInName would be -SignInName
[email protected] for the commands listed above.
Note:
l Some of these resource groups only need creating once; others need recreating when you upgrade or if you redeploy:
o The static resource group ($PxTeamsConnStaticResourceGroupName) only has to be created when deploying in a region for
the first time — you do not have to repeat this when redeploying or for subsequent upgrades.
o The dynamic resource group ($PxTeamsConnResourceGroupName) has to be recreated in each region whenever you upgrade
or redeploy.
o The Azure Bot resource group ($PxBotResourceGroupName) only has to be created once, and only in your first region — you
do not have to repeat this when redeploying or for subsequent upgrades.
l In the future, if another person were to upgrade or redeploy the Teams Connector, that person would also have to be granted the
appropriate roles for these resource groups.
l You can also use the Azure portal to check/assign permissions by selecting the resource group and using the Access control (IAM)
option.
# Set execution policy for the current PowerShell process, when prompted type A (Yes to All)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
# The Unblock-File cmdlet lets you run PowerShell script files that were downloaded from the internet.
# By default, these files are blocked to protect the computer from untrusted files.
Get-ChildItem -Recurse | Unblock-File
# Connect to Graph
Connect-PexTeamsMsGraph
4. Run your variable initialization script to set the required prefix and region name variables.
5. Run the following command to create the Teams Connector API app.
Please allow one minute for this command to complete and propagate within Azure.
6. Run the following commands to obtain the Teams Connector API app ID.
Note that if the New-MgServicePrincipal command fails, this means that you have not waited long enough for the previous
command to complete.
Write-Host
Write-Host
Write-Host "`n----------------------------------------`n"
Write-Host
Write-Host "### Teams Connector API App ID MUST be saved in the variables initialization script ###"
Write-Host
Write-Host "`$TeamsConnectorApiApplicationId = `"$($TeamsConnectorApiApplicationId)`""
Write-Host
Write-Host "`n----------------------------------------`n"
Write-Host
Write-Host
7. When the command runs, it generates some output that lists the Teams Connector API App ID, similar to this:
8. Copy the output line that defines the API App ID and paste it into the variable initialization script, replacing the existing line in the
script that says:
$TeamsConnectorApiApplicationId = ""
(If you will be performing the rest of the deployment, in the same PowerShell session, there is no need to re-run the variable
initialization script as the new $TeamsConnectorApiApplicationId variable has been set in the previous steps.)
9. If somebody else will be completing the deployment, ensure that the person who will perform all of the remaining installation
steps has Owner permissions for the API app. See Assigning Owner permissions for the API app for more information.
Note that:
l This app does not have to be granted any permissions. It does not have access to any resources in the Microsoft Entra ID tenant. It
has no associated credentials.
l It is different from the main Pexip CVI App which is created by the installation script.
l If you intend to deploy the Teams Connector in multiple Azure regions, you must create an API app in each region, and store the
app ID ($TeamsConnectorApiApplicationId) in the relevant variable initialization script for that region.
Installation script
The following script is referred to as the installation script:
l This script only needs to be run once (per Azure subscription).
l As there are several commands in this installation process, we recommend running each group of commands step-by-step within
PowerShell (you can copy-paste the commands below) to ensure that no elements are missed, and any unexpected issues are
identified. If you use PowerShell ISE instead of the normal PowerShell CLI prompt you can run one line at a time (select section and
press F8).
l After launching PowerShell you must change directory to the folder into which you extracted the files from the Teams Connector
ZIP.
l The create_vmss_deployment.ps1 command in the script that creates the Teams Connector VMs can take up to 30 minutes to
complete.
l See Troubleshooting Microsoft Teams and Pexip Infinity integrations for help with any installation script errors.
Remember to run the variable initialization script (above) first, before running this installation script.
Note that:
l The script passes a -ValidityInMonths parameter to the PexTeamsCviApplicationCertificateCredential cmdlet to specify the validity
period of the CVI App certificate. In this case it specifies "-ValidityInMonths 24" i.e. 2 years but you can specify your own period as
required.
l The Teams Connector application will stop working if the CVI App certificate expires. We recommend that you set certificate
contact notifications (see this Microsoft article) as they can warn you of certificates that are due to expire.
if ($PxConnMajorVersion -ne "34"){Write-Warning "The Connector version (extracted ZIP files) and this deployment script version do not match.
Connector version = $PxConnMajorVersion. Deployment script version = 34"}
# Connect to Microsoft Graph, Azure Resource Manager account and import Pexip CVI module
# Microsoft Graph commands
# Connect to Microsoft Graph
# If AAD/365 admin account is not the same as Azure Resource Manager admin account,
# the next section is to be run by the AAD admin.
#
# IMPORTANT: The output of IDs/credentials here must be saved as it will be required later
# Set execution policy for the current PowerShell process, when prompted type A (Yes to All)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
# The Unblock-File cmdlet lets you run PowerShell script files that were downloaded from the internet.
# By default, these files are blocked to protect the computer from untrusted files.
Get-ChildItem -Recurse | Unblock-File
# Connect to Azure with an authenticated account for use with Azure Resource Manager (in same window to reuse variables)
Connect-AzAccount
# Connect to Graph
Connect-PexTeamsMsGraph
# Create App Certificate - the certificate validity period is defined via the -ValidityInMonths parameter passed to New-
PexTeamsCviApplicationCertificateCredential
# New-PexTeamsCviApplicationCertificateCredential cmdlet creates a self signed certificate and uploads it to Microsoft Entra ID for use as a
credential for the CVI app
Write-Host "### Create and save CVI App certificate password using a password manager ###"
$AppCertificatePath = $App | New-PexTeamsCviApplicationCertificateCredential -ValidityInMonths 24
Write-Host
Write-Host
Write-Host "`n----------------------------------------`n"
Write-Host
Write-Host "### Save CVI App ID (use a password manager) ###"
Write-Host "### Save CVI App certificate ###"
Write-Host
Write-Host "`$AppId = `"$($AppId)`""
Write-Host "`$AppCertificatePath = `"$($AppCertificatePath)`""
Write-Host
Write-Host "`n----------------------------------------`n"
Write-Host
Write-Host
# Optionally if you did not want to specify the password as a variable, use Get-Credential
# $PxWinAdminCred = Get-Credential
# supply the PFX Teams Connector TLS certificate file password when prompted
# Please enter the password for the PFX Teams Connector TLS certificate '.\xxxxxxxx.pfx': ***************
# supply the PFX CVI app certificate file password when prompted
# Please enter the password for the CVI app PFX certificate '.\xxxxxxxx.pfx': ***************
# Generating the next steps summary (this assumes you are connected to Microsoft Graph and with an authenticated account for use with Azure
Resource Manager)
#
# Setting subscription
Set-AzContext -SubscriptionId $PxSubscriptionId
# Getting IP configurations
if ($PxUsePrivateRouting) {
$LB = Get-AzLoadBalancer -ResourceGroupName $PxTeamsConnResourceGroupName
$ExtLB = $LB | Where-Object { $_.Name.EndsWith("-LB") }
$IntLB = $LB | Where-Object { $_.Name.EndsWith("-INTLB") }
$LBExtIPID = $ExtLB.FrontendIpConfigurations[0].PublicIpAddress.id
$LBIntIP = $IntLB.FrontendIpConfigurations[0].PrivateIpAddress
$PublicIPAddresses = Get-AzPublicIpAddress -ResourceGroupName $PxTeamsConnStaticResourceGroupName
$ConnectorPublicIP = $PublicIPAddresses | Where-Object Id -eq $LBExtIPID
$publicIpAddress = $ConnectorPublicIP[0].IpAddress
$privateIpAddress = $LBIntIP
} else {
$LB = (Get-AzLoadBalancer -ResourceGroupName $PxTeamsConnResourceGroupName)[0]
$LBPublicIPID = $LB.FrontendIpConfigurations[0].PublicIpAddress.id
$PublicIPAddresses = Get-AzPublicIpAddress -ResourceGroupName $PxTeamsConnStaticResourceGroupName
$ConnectorPublicIP = $PublicIPAddresses | Where-Object Id -eq $LBPublicIPID
$publicIpAddress = $ConnectorPublicIP[0].IpAddress
}
# This script only applies to GCC High / Azure US Government Cloud deployments
if ($PxConnMajorVersion -ne "34"){Write-Warning "The Connector version (extracted ZIP files) and this deployment script version do not match.
Connector version = $PxConnMajorVersion. Deployment script version = 34"}
# Set VmImage variable to hold the CIS STIG image properties - STIG image is optional but typical
# In a later step in this script you can choose not to use the STIG image
$VmImage = @{
"sku" = "cis-win-2019-stig"
"offer" = "cis-win-2019-stig"
"publisher" = "center-for-internet-security-inc"
"version" = "latest"}
# Connect to Microsoft Graph, Azure Resource Manager account and import Pexip CVI module
# Microsoft Graph commands
# Connect to Microsoft Graph
# If AAD/365 admin account is not the same as Azure Resource Manager admin account,
# the next section is to be run by the AAD admin.
#
# IMPORTANT: The output of IDs/credentials here must be saved as it will be required later
# Set execution policy for the current PowerShell process, when prompted type A (Yes to All)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
# The Unblock-File cmdlet lets you run PowerShell script files that were downloaded from the internet.
# By default, these files are blocked to protect the computer from untrusted files.
Get-ChildItem -Recurse | Unblock-File
# Connect to Azure USGovernment with an authenticated account for use with Azure Resource Manager (in same window to reuse variables)
Connect-AzAccount -EnvironmentName AzureUSGovernment
# Connect to Graph
Connect-PexTeamsMsGraph
# Create App Certificate - the certificate validity period is defined via the -ValidityInMonths parameter passed to New-
PexTeamsCviApplicationCertificateCredential
# New-PexTeamsCviApplicationCertificateCredential cmdlet creates a self signed certificate and uploads it to Microsoft Entra ID for use as a
credential for the CVI app
Write-Host "### Create and save CVI App certificate password using a password manager ###"
$AppCertificatePath = $App | New-PexTeamsCviApplicationCertificateCredential -ValidityInMonths 24
Write-Host
Write-Host
Write-Host "`n----------------------------------------`n"
Write-Host
Write-Host "### Save CVI App ID (use a password manager) ###"
Write-Host "### Save CVI App certificate ###"
Write-Host
# Optionally if you did not want to specify the password as a variable, use Get-Credential
# $PxWinAdminCred = Get-Credential
# supply the PFX Teams Connector TLS certificate file password when prompted
# Please enter the password for the PFX Teams Connector TLS certificate '.\xxxxxxxx.pfx': ***************
# supply the PFX CVI app certificate file password when prompted
# Please enter the password for the CVI app PFX certificate '.\xxxxxxxx.pfx': ***************
# Generating the next steps summary (this assumes you are connected to Microsoft Graph and with an authenticated account for use with Azure
Resource Manager)
#
# Setting subscription
Set-AzContext -SubscriptionId $PxSubscriptionId
# Getting IP configurations
if ($PxUsePrivateRouting) {
$LB = Get-AzLoadBalancer -ResourceGroupName $PxTeamsConnResourceGroupName
$ExtLB = $LB | Where-Object { $_.Name.EndsWith("-LB") }
$IntLB = $LB | Where-Object { $_.Name.EndsWith("-INTLB") }
$LBExtIPID = $ExtLB.FrontendIpConfigurations[0].PublicIpAddress.id
$LBIntIP = $IntLB.FrontendIpConfigurations[0].PrivateIpAddress
$PublicIPAddresses = Get-AzPublicIpAddress -ResourceGroupName $PxTeamsConnStaticResourceGroupName
$ConnectorPublicIP = $PublicIPAddresses | Where-Object Id -eq $LBExtIPID
$publicIpAddress = $ConnectorPublicIP[0].IpAddress
$privateIpAddress = $LBIntIP
} else {
$LB = (Get-AzLoadBalancer -ResourceGroupName $PxTeamsConnResourceGroupName)[0]
$LBPublicIPID = $LB.FrontendIpConfigurations[0].PublicIpAddress.id
1. When the script ran, it generated some output that listed the CVI App ID and certificate path, similar to this:
This means that if you need to run the redeploy script, you will not rerun the commands that imported the PowerShell module and
created the app. Instead you will set the variables to the ID and certificate of the CVI app that you created the first time.
deployment script that prints out the details for you, for example:
Within DNS you need to set up an A-record that links the Teams Connector hostname/FQDN to the IP address that was assigned by
Azure to the load balancer. The A-record must be externally-resolvable.
The hostname of the Teams Connector is the name you used in the $PxTeamsConnFqdn variable, for example "pexip-teamsconn-
eu.teams.example.com".
The Azure-assigned IP address can also be obtained from the Azure portal:
1. Go to your subscription, then locate and select the resource group named <prefix>-TeamsConn-<region>-static-RG.
2. Select the item with a Type of Public IP address.
3. The IP address is shown in the right-hand column.
The resulting DNS A-record you need to create, when using the example names from above, is:
NAME TYPE VALUE
------------------------------------- ----- -------------------
pexip-teamsconn-eu.teams.example.com. A 40.115.xx.191
If you have enabled private routing you must also create an additional DNS record — see Using private routing with the Teams
Connector.
1. Use a web browser to go to the URL indicated in the output from the installation script and then follow the prompts in the consent
wizard to authorize the CVI app.
2. If the tenant you are logged in with is the tenant you will provide consent for, just select Initiate the consent for your tenant. If
you have admin access for another tenant, you can specify an alternative tenant instead.
3. You are asked to confirm the account. This must be an account with the Global Administrator role, to be able to grant the
necessary consent.
4. The permissions of the Pexip Teams Connector are listed. The domain shown here is the domain where the CVI App registration
was created (this is the Azure Bot from the installation script) – it does not have to be the same Entra ID domain as where the
Teams users are homed, but for most enterprises it will be the same domain.
5. When admin consent is successfully granted, the success page is displayed.
We recommend saving the information shown on this page in case of future faultfinding to ensure full knowledge of which apps
were consented in which tenant.
Read all users' full The User.Read.All application permission provides access to properties and Application permissions:
profiles permissions for operations listed at https://docs.microsoft.com/en- https://docs.microsoft.com/en-
us/graph/api/resources/users?view=graph-rest-1.0, in particular the methods and us/graph/permissions-
properties listed at https://docs.microsoft.com/en- reference#application-
us/graph/api/resources/user?view=graph-rest-1.0 that require the User.Read.All permissions-38
permission.
It is used to:
l Show the user's UPN (user@domain) instead of GUID in logs for an
administrator to know which user was in which call.
l Display the photo of a user if the user has not started their video.
l Allow point-to-point call capabilities.
Initiate outgoing 1 The Calls.Initiate.All application permission is used to support point-to-point Calls permissions:
to 1 calls from the calling scenarios. https://docs.microsoft.com/en-
app us/graph/permissions-
reference#calls-permissions
Initiate outgoing The Calls.InitiateGroupCall.All application permission is not currently used. It may
group calls from the be used in the future for creating ad hoc calls (e.g. to implement point-to-point
app calling scenarios).
Join group calls and The Calls.JoinGroupCall.All application permission allows VTC devices to join a
meetings as an app Teams meeting as a trusted participant (permits lobby bypass).
Join group calls and The Calls.JoinGroupCallAsGuest.All application permission allows VTC devices to
meetings as a guest join a Teams meeting as a guest/untrusted participant.
Access media The Calls.AccessMedia.All application permission is used to access the media
streams in a call as streams of participants that are attending a Teams meeting.
an app
Read online The OnlineMeetings.Read.All application permission is used to resolve the VTC Online meetings permissions:
meeting details meeting coordinate from the invite body into a Teams meeting. https://docs.microsoft.com/en-
us/graph/permissions-
reference#online-meetings-
permissions
Sign in and read The User.Read delegated permission is added by default for Microsoft Entra ID User permissions:
user profile tenant apps, but is not used by the Pexip Teams Connector. https://docs.microsoft.com/en-
us/graph/permissions-
reference#user-permissions
Any permissions that are not currently used are included in the current consent process as it is not practical to re-consent existing apps as
new functionality becomes available via the SDK and/or as we add additional functionality to the Teams Connector itself.
Authorize CVI app to bypass Teams lobby and configure dialing instructions
The Pexip CVI app can be used to route callers directly into the Teams meeting (typically calls from trusted participants, such as internal
employees or calls placed from registered and authenticated devices), or it can direct certain callers (such as external guests or calls
placed from unknown devices) into the Teams lobby where they have to be admitted into the meeting by an existing participant in the
meeting.
l Whether the caller is held in the lobby or routed directly into the meeting depends upon the Treat as trusted option that you can
set when you configure your Call Routing Rules in Pexip Infinity. For example, if the rule only applies to calls received from
registered endpoints then it will typically enable the Treat as trusted option which means that Pexip will route the call directly into
the Teams meeting. If the Treat as trusted option is not enabled on the rule, Pexip routes the call into the meeting lobby. See Call
Routing Rules for direct and indirect routing for more information.
Note that if the Teams meeting option Anonymous users can join a meeting is turned off, all untrusted/guest VTCs are prevented
from joining Teams calls, regardless of Pexip Infinity's rule settings.
l When a participant receives an invite to a Teams meeting, an "Alternate VTC dialing instructions" link to a webpage of alternative
dialing addresses can be included. This provides customizable information for which address to dial, based on the type of client
being used, such as a SIP device, an H.323 system or a browser, or whether you want to route callers via a Pexip IVR (Virtual
Reception) into which they must enter the conference ID.
The PowerShell commands to configure the lobby bypass and dialing instructions require the Teams PowerShell module:
(These commands ensure the appropriate MicrosoftTeams module is installed, and that it replaces any existing
SkypeOnlineConnector module that may already be installed.)
2. Run the following commands to sign in to your Teams tenant:
o In all standard deployments run:
Import-Module MicrosoftTeams
Connect-MicrosoftTeams
o If this is a GCC High / Azure US Government Cloud deployment then use these commands instead:
Import-Module MicrosoftTeams
Connect-MicrosoftTeams -TeamsEnvironmentName TeamsGCCH
where <node_address> is an FQDN that resolves to your Pexip Conferencing Nodes (it can also be the FQDN or IP address of an
individual Conferencing Node). Note that:
o To view this webpage, the client application used to view the invitation must be able to access the specified Conferencing
Nodes (or alternative server) on HTTPS 443/TCP.
o This FQDN is not necessarily the same name as that specified in the $PxNodeFqdns variable (as that is used only for external
DNS resolution from the Teams Connector to your externally-facing nodes). You must ensure that the FQDN used here is
resolvable by any internal or external client applications that may be used to view the invitation i.e. that they can access the
webpage on the nodes referenced by the FQDN. This means that if these nodes have private addresses, then depending on
your internal network routing, you may need appropriate local DNS resolution for the <node_address> FQDN for internally-
based clients, in addition to external DNS resolution for that FQDN for externally-based clients.
The InstructionUri parameters are:
Parameter Mandatory Description
conf Yes This must be set to {ConfId} and when displayed it will contain the conference ID of the Teams meeting.
ivr Yes The name part of the alias of the Pexip Virtual Reception that you will configure on Pexip Infinity later,
and that will act as the IVR gateway. Do not include the domain — this is the d parameter below. Note
that <ivr@d>, e.g. [email protected], must match the name of the alias that you will configure for
the Virtual Reception.
d Yes The domain name of your Pexip Infinity platform e.g. example.com. This is used as the domain for all of
the URI-style addresses that are displayed on the webpage.
prefix No A prefix to apply to the conf parameter when building the address to call for direct routing into the
Teams meeting. Typically you only need to use a prefix if you have a more complicated dial plan. If used,
the prefix will typically match the Call Routing Rules set up in Pexip Infinity to route calls into Teams
meetings.
w No Displays the "From a browser" access details on the webpage. There is no value associated with this
parameter. Note that these details are not displayed if the user is viewing the page on Microsoft Edge
(as it is expected they would join the Teams meeting directly via Teams itself).
ip No This is the public-facing IP address of one of your Conferencing Nodes. When specified, alternative direct
dialing options via that IP address (which may be required by some H.323 systems for example) are
included. You can only specify a single address. If included, the IP address specified here must also be
added as an alias to the Virtual Reception that you will configure on Pexip Infinity later.
test No Includes a "Test call" option on the webpage, where the value of this parameter is the name part of the
alias to dial e.g. test_call. Do not include the domain — this is the d parameter above. This uses Pexip
Infinity's inbuilt Test Call Service; you must ensure that <test@d>, e.g. [email protected], matches
the name of the alias configured in Pexip Infinity for the test call service.
qrcode No Includes a QR code on the webpage, which when scanned by a device with a supported Connect app
installed (such as Pexip Connect for RealWear or one of the Connect mobile apps) will open the meeting
directly in that app.
and that would produce the following webpage (where the Teams conference ID is "234567890"):
Use the following steps to assign lobby-bypass capabilities to the app, define the content of the "Alternate VTC dialing instructions"
page, and grant interoperability for the users in your tenant.
The following commands may take several hours (sometimes over 24 hours) to come into effect.
1. Assign lobby-bypass capabilities to the app and specify the "Alternate VTC dialing instructions". This command takes the form:
New-CsVideoInteropServiceProvider -Name Pexip -TenantKey "<address>" -InstructionUri "<link>" -
AllowAppGuestJoinsAsAuthenticated $true -AadApplicationIds "<App ID>"
For example (note that all of the available command parameters are described above):
New-CsVideoInteropServiceProvider -Name Pexip -TenantKey "[email protected]" -InstructionUri
"https://px.vc.example.com/teams/?conf={ConfId}&ivr=teams&d=example.com&test=test_call&w&qrcode" -
AllowAppGuestJoinsAsAuthenticated $true -AadApplicationIds "c054d1cb-7961-48e1-b004-389e81356232"
During trials you may want to only grant access to selected individuals in your company, by using the -Identity switch instead of -
Global, for example:
Grant-CsTeamsVideoInteropServicePolicy -PolicyName PexipServiceProviderEnabled -Identity "[email protected]"
Notes:
l The troubleshooting topic contains some PowerShell commands that are useful when troubleshooting or maintaining your system.
l To change the settings for your Teams meetings, such as customizing your meeting invitations, see https://docs.microsoft.com/en-
us/microsoftteams/meeting-settings-in-teams.
l CVI participants can join meetings created using the "Meet Now" feature from within the Calendar page in the Teams client.
However, meetings created using "Meet Now" from within the Teams/Channel page do not contain CVI join details.
Next steps
You must now complete the configuration within Pexip Infinity as described in Configuring Pexip Infinity as a Microsoft Teams gateway.
How it works
The main difference between the blue-green deployment and upgrade strategy described here compared to the regular deployment is
that you deploy two Teams Connectors (one called "blue" and another called "green") and switch between them as you upgrade from
one version of Teams Connector software to the next. Whereas with the regular deployment you only maintain one Teams Connector
which you replace at every upgrade cycle.
Specifically, the differences between the two methods are:
l For blue-green you deploy two Teams Connectors. Each Teams Connector needs a unique DNS name and a TLS certificate that
matches that identity. You use different names for the $PxVmssRegion variable to create specific, separate Azure resources for
the two deployments (you use a separate variables script for each deployment).
l For blue-green each deployment requires its own API app. However, the two deployments can both use the same CVI app and you
only need to perform one app authorization process (per tenant). You also only need one Azure bot.
l With the regular deployment procedure:
o You simply replace your existing single deployment every time you upgrade to the next Teams Connector software version. It
reuses the existing Azure resources, DNS records and so on.
o While upgrading you have a period of time when you have no Teams interop service and no ability to separately test the
latest version. Typically you have to perform the entire upgrade process during "out-of-hours".
l You do not need to create a new CVI app or perform any additional app authorizations when deploying the second Teams
Connector — only one CVI app registration is required per tenant. However you do need to create a new API app for each new
deployment.
l You do not need to create a new CVI app or API app when upgrading (redeploying) to a new version.
l Both Teams Connectors can use the same set of Conferencing Nodes (the $PxNodeFqdns variable in the initialization script).
l You create 2 DNS A-records (one for each deployment), and you need to enable the relevant firewall ports for both Teams
Connector deployments while you are testing / switching over.
This guide assumes that this is your first Teams Connector deployment. If you have an existing Teams Connector and want to switch to
using a blue-green upgrade strategy then you can still follow the principles explained in this guide by creating a second "green"
deployment to use alongside your existing deployment (which in effect becomes your "blue" deployment, using whatever name is
currently assigned to $PxVmssRegion in your existing variables script).
1. Create a new variable initialization script for your <version> deployment. You should do this by making a copy of the variable
initialization script. Save this script to a safe location as it will be needed for future upgrades.
2. Update the variables in the initialization scripts with the values for your <version>. The variables that must be different for the
<version> deployment are:
o $PxVmssRegion: the short name that identifies the deployment. In this case it refers to the Teams Connector deployment
identifier: e.g "blue" or "green". Note that you can combine this with a regional deployment if required, e.g. "eublue".
o $PxTeamsConnFqdn: the hostname of the Teams Connector, for example "pexip-teamsconn-blue-eu.teams.example.com" or
"pexip-teamsconn-green-eu.teams.example.com".
o $TeamsConnectorApiApplicationId: this must be updated to hold the ID of a new Teams Connector API app for the <version>
deployment, and is described later in the process below.
o $PxExistingVNETResourceId: if you are using private routing, each deployment must use its own non-overlapping VNET.
All other variables can be identical across both scripts.
3. Create the static and dynamic resource groups for the <version> deployment and ensure that the person performing the
installation has the Owner role for them.
These steps must be performed by the Owner of the Azure subscription used for the Teams Connector.
a. Run the following PowerShell command to connect to Azure:
n In all standard deployments run:
Connect-AzAccount
n If this is a GCC High / Azure US Government Cloud deployment then use this command instead:
Connect-AzAccount -EnvironmentName AzureUSGovernment
# Resource group for static resources for the Teams Connector / region
New-AzResourceGroup -Name $PxTeamsConnStaticResourceGroupName -Location $PxAzureLocation -Force -Tag $tags
e. Ensure that the person who will perform all of the remaining installation steps has the Azure Owner role for the static and
dynamic resource groups, and Contributor role for the Azure Bot resource group you have just created. If the Owner of the
Azure subscription will perform all of the remaining installation steps then you can skip to Create the Teams Connector API
app. below.
Otherwise, you must run the following commands to assign the required roles for the resource groups you have just created
to the person who will perform all of the remaining installation steps:
New-AzRoleAssignment -SignInName <email_name> -RoleDefinitionName "Owner" -ResourceGroupName
$PxTeamsConnStaticResourceGroupName
New-AzRoleAssignment -SignInName <email_name> -RoleDefinitionName "Owner" -ResourceGroupName $PxTeamsConnResourceGroupName
New-AzRoleAssignment -SignInName <email_name> -RoleDefinitionName "Contributor" -ResourceGroupName $PxBotResourceGroupName
where <email_name> is the email address / user principal name of the person who will perform the remaining steps; for
example where [email protected] will perform the upgrade/redeploy, the SignInName would be -SignInName
[email protected] for the commands listed above.
Note:
o Some of these resource groups only need creating once; others need recreating when you upgrade or if you redeploy:
n The static resource group ($PxTeamsConnStaticResourceGroupName) only has to be created when deploying for the first
time — you do not have to repeat this when redeploying or for subsequent upgrades to either deployment.
n The dynamic resource group ($PxTeamsConnResourceGroupName) has to be recreated whenever you upgrade or
redeploy.
o In the future, if another person were to upgrade or redeploy the Teams Connector, that person would also have to be granted
the appropriate roles for these resource groups.
o You can also use the Azure portal to check/assign permissions by selecting the resource group and using the Access control
(IAM) option.
4. Create the Teams Connector API app.
You must create an Azure app that is used to secure requests to the Teams Connector APIs.
Each deployment must have its own Teams Connector API app, and thus the variables initialization script for each deployment
must be updated to contain the API App ID for that deployment.
a. Run the following PowerShell command to connect to Azure:
n In all standard deployments run:
Connect-AzAccount
n If this is a GCC High / Azure US Government Cloud deployment then use this command instead:
Connect-AzAccount -EnvironmentName AzureUSGovernment
# Set execution policy for the current PowerShell process, when prompted type A (Yes to All)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
# The Unblock-File cmdlet lets you run PowerShell script files that were downloaded from the internet.
# By default, these files are blocked to protect the computer from untrusted files.
Get-ChildItem -Recurse | Unblock-File
# Connect to Graph
Connect-PexTeamsMsGraph
d. Run your variable initialization script for the <version> deployment to set the required variables.
e. Run the following command to create the Teams Connector API app.
Please allow one minute for this command to complete and propagate within Azure.
f. Run the following commands to obtain the Teams Connector API app ID.
Note that if the New-MgServicePrincipal command fails, this means that you have not waited long enough for the previous
command to complete.
Write-Host
Write-Host
Write-Host "`n----------------------------------------`n"
Write-Host
Write-Host "### Teams Connector API App ID MUST be saved in the variables initialization script ###"
Write-Host
Write-Host "`$TeamsConnectorApiApplicationId = `"$($TeamsConnectorApiApplicationId)`""
Write-Host
Write-Host "`n----------------------------------------`n"
Write-Host
Write-Host
g. When the command runs, it generates some output that lists the Teams Connector API App ID, similar to this:
h. Copy the output line that defines the API App ID and paste it into the variable initialization script, replacing the existing line in
the script that says:
$TeamsConnectorApiApplicationId = ""
(If you will be performing the rest of the deployment, in the same PowerShell session, there is no need to re-run the variable
initialization script as the new $TeamsConnectorApiApplicationId variable has been set in the previous steps.)
i. If somebody else will be completing the deployment, ensure that the person who will perform all of the remaining installation
steps has Owner permissions for the API app. See Assigning Owner permissions for the API app for more information.
Note that:
o This app does not have to be granted any permissions. It does not have access to any resources in the Microsoft Entra ID
tenant. It has no associated credentials.
5. Install the Teams Connector.
First/existing installation (blue)
When performing your first (blue) installation:
a. You must run the standard installation script to install the <version> Teams Connector deployment.
Second installation (green)
When performing the second (green) installation:
a. You need to update the $AppId and $AppCertificatePath variables in the script below to the values reported for the CVI
application from the first installation.
b. Run the modified installation script that is provided below to install the <version> Teams Connector deployment.
if ($PxConnMajorVersion -ne "34"){Write-Warning "The Connector version (extracted ZIP files) and this deployment script version do not
match. Connector version = $PxConnMajorVersion. Deployment script version = 34"}
# Connect to Microsoft Graph, Azure Resource Manager account and import Pexip CVI module
# Microsoft Graph commands
# Connect to Microsoft Graph
# If AAD/365 admin account is not the same as Azure Resource Manager admin account,
# the next section is to be run by the AAD admin.
#
# IMPORTANT: The output of IDs/credentials here must be saved as it will be required later
# Set execution policy for the current PowerShell process, when prompted type A (Yes to All)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
# The Unblock-File cmdlet lets you run PowerShell script files that were downloaded from the internet.
# By default, these files are blocked to protect the computer from untrusted files.
Get-ChildItem -Recurse | Unblock-File
# Connect to Azure with an authenticated account for use with Azure Resource Manager (in same window to reuse variables)
Connect-AzAccount
# Connect to Graph
Connect-PexTeamsMsGraph
# Before running the following commands, update the following 2 lines/variables with the CVI App ID and
# the path to the CVI App certificate file that were output when the first/blue installation script was run
# You'll be prompted for the CVI App certificate password later.
$AppId = ""
$AppCertificatePath = ".\your_cvi_app_certificate.pfx"
# Optionally if you did not want to specify the password as a variable, use Get-Credential
# $PxWinAdminCred = Get-Credential
# supply the PFX Teams Connector TLS certificate file password when prompted
# Please enter the password for the PFX Teams Connector TLS certificate '.\xxxxxxxx.pfx': ***************
# supply the PFX CVI app certificate file password when prompted
# Please enter the password for the CVI app PFX certificate '.\xxxxxxxx.pfx': ***************
# Generating the next steps summary (this assumes you are connected to Microsoft Graph and with an authenticated account for use with
Azure Resource Manager)
#
# Setting subscription
Set-AzContext -SubscriptionId $PxSubscriptionId
# Getting IP configurations
if ($PxUsePrivateRouting) {
$LB = Get-AzLoadBalancer -ResourceGroupName $PxTeamsConnResourceGroupName
$ExtLB = $LB | Where-Object { $_.Name.EndsWith("-LB") }
$IntLB = $LB | Where-Object { $_.Name.EndsWith("-INTLB") }
$LBExtIPID = $ExtLB.FrontendIpConfigurations[0].PublicIpAddress.id
$LBIntIP = $IntLB.FrontendIpConfigurations[0].PrivateIpAddress
$PublicIPAddresses = Get-AzPublicIpAddress -ResourceGroupName $PxTeamsConnStaticResourceGroupName
$ConnectorPublicIP = $PublicIPAddresses | Where-Object Id -eq $LBExtIPID
$publicIpAddress = $ConnectorPublicIP[0].IpAddress
$privateIpAddress = $LBIntIP
} else {
$LB = (Get-AzLoadBalancer -ResourceGroupName $PxTeamsConnResourceGroupName)[0]
$LBPublicIPID = $LB.FrontendIpConfigurations[0].PublicIpAddress.id
if ($PxConnMajorVersion -ne "34"){Write-Warning "The Connector version (extracted ZIP files) and this deployment script version do not
match. Connector version = $PxConnMajorVersion. Deployment script version = 34"}
# Set VmImage variable to hold the CIS STIG image properties - STIG image is optional but typical
# In a later step in this script you can choose not to use the STIG image
$VmImage = @{
"sku" = "cis-win-2019-stig"
"offer" = "cis-win-2019-stig"
"publisher" = "center-for-internet-security-inc"
"version" = "latest"}
# Connect to Microsoft Graph, Azure Resource Manager account and import Pexip CVI module
# Microsoft Graph commands
# Connect to Microsoft Graph
# If AAD/365 admin account is not the same as Azure Resource Manager admin account,
# the next section is to be run by the AAD admin.
#
# IMPORTANT: The output of IDs/credentials here must be saved as it will be required later
# Set execution policy for the current PowerShell process, when prompted type A (Yes to All)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
# The Unblock-File cmdlet lets you run PowerShell script files that were downloaded from the internet.
# By default, these files are blocked to protect the computer from untrusted files.
Get-ChildItem -Recurse | Unblock-File
# Connect to Azure USGovernment with an authenticated account for use with Azure Resource Manager (in same window to reuse variables)
Connect-AzAccount -EnvironmentName AzureUSGovernment
# Connect to Graph
Connect-PexTeamsMsGraph
# Before running the following commands, update the following 2 lines/variables with the CVI App ID and
# the path to the CVI App certificate file that were output when the first/blue installation script was run
# You'll be prompted for the CVI App certificate password later.
$AppId = ""
$AppCertificatePath = ".\your_cvi_app_certificate.pfx"
# Optionally if you did not want to specify the password as a variable, use Get-Credential
# $PxWinAdminCred = Get-Credential
# supply the PFX Teams Connector TLS certificate file password when prompted
# Please enter the password for the PFX Teams Connector TLS certificate '.\xxxxxxxx.pfx': ***************
# supply the PFX CVI app certificate file password when prompted
# Please enter the password for the CVI app PFX certificate '.\xxxxxxxx.pfx': ***************
# Generating the next steps summary (this assumes you are connected to Microsoft Graph and with an authenticated account for use with
Azure Resource Manager)
#
# Setting subscription
Set-AzContext -SubscriptionId $PxSubscriptionId
# Getting IP configurations
if ($PxUsePrivateRouting) {
$LB = Get-AzLoadBalancer -ResourceGroupName $PxTeamsConnResourceGroupName
$ExtLB = $LB | Where-Object { $_.Name.EndsWith("-LB") }
$IntLB = $LB | Where-Object { $_.Name.EndsWith("-INTLB") }
$LBExtIPID = $ExtLB.FrontendIpConfigurations[0].PublicIpAddress.id
$LBIntIP = $IntLB.FrontendIpConfigurations[0].PrivateIpAddress
$PublicIPAddresses = Get-AzPublicIpAddress -ResourceGroupName $PxTeamsConnStaticResourceGroupName
$ConnectorPublicIP = $PublicIPAddresses | Where-Object Id -eq $LBExtIPID
$publicIpAddress = $ConnectorPublicIP[0].IpAddress
$privateIpAddress = $LBIntIP
} else {
$LB = (Get-AzLoadBalancer -ResourceGroupName $PxTeamsConnResourceGroupName)[0]
$LBPublicIPID = $LB.FrontendIpConfigurations[0].PublicIpAddress.id
$PublicIPAddresses = Get-AzPublicIpAddress -ResourceGroupName $PxTeamsConnStaticResourceGroupName
$ConnectorPublicIP = $PublicIPAddresses | Where-Object Id -eq $LBPublicIPID
$publicIpAddress = $ConnectorPublicIP[0].IpAddress
}
Note that this script omits the following steps in the standard installation script that only have to be run once (i.e. they do not
need to be performed a second time i.e. when installing the second <version> or if you are re-using another pre-existing CVI
application):
o Creating the CVI application and its associated credentials (but you must run the command to assign the
$AppSecurePassword variable if you are still using password-based authentication).
o Creating the Azure Bot.
o Deploying the Teams Connector admin consent web page.
6. Update DNS with the <version> Teams Connector FQDN (DNS name) and IP address. The deployment script should have printed
the instructions. Thus, at the end of the process you will have two DNS A-records — one for each <version>.
Initial installation
When installing the Teams Connectors you can follow the standard instructions to configure your Pexip Infinity platform (Configuring
Pexip Infinity as a Microsoft Teams gateway).
However, as you are configuring two Teams Connectors within Pexip Infinity, we suggest that:
1. When defining your Teams Connectors (Call Control > Microsoft Teams Connectors):
o Define one Teams Connector for the "blue" deployment that is named, for example, "Production system" and is configured
with the address and Event Hub connection details for the first/blue deployment.
o Define a second Teams Connector for the "green" deployment that is named, for example, "Test system" and is configured
with the address and Event Hub connection details for the second/green deployment. You should also then deselect the
Enable Azure Event Hub checkbox at this stage to prevent any unnecessary alarms being raised while the test system is not in
use.
2. When defining your Call Routing Rules and system locations:
o Configure all of your main rules and locations to use the "Production system" Teams Connector.
o Configure one Call Routing Rule to use for testing purposes. For example, you could configure the rule as follows:
n Destination alias regex match: teamstesting\.(\d{9,12})(@example\.com)?
(replace example\.com with your own domain)
n Destination alias regex replace string: \1
n Call target: select the "Test system" Teams Connector
This means whenever you want to use your test system you can dial a prefix of "teamstesting." in front of the ID of the Teams
conference you want to join, and the call will then be routed through the test Teams Connector.
1. Update the "Production system" Teams Connector to use the address and Event Hub connection details of the "green"
deployment.
You are now live with the new software and any new calls will be routed through the new "green" system (any existing calls will
remain connected via the "blue" deployment).
2. Update the "Test system" Teams Connector with the address and Event Hub connection details of the "blue" deployment. You
should then also deselect the Enable Azure Event Hub checkbox again.
This gets it ready for the next upgrade cycle.
At the next upgrade, just repeat the process of switching the configuration of the two Teams Connectors — this time the "blue" system
will go back to being the production environment, and "green" will go back to being the test environment. And then just repeat this
toggling process in the future.
The benefit of this approach is that you only have to update the configuration of the two Teams Connectors whenever you want to
complete the switchover, rather than potentially having to update lots of Call Routing Rules to switch between the two Teams
Connector deployments. However, any process that follows the same principles of toggling between the two deployed Teams
Connectors is fine.
If you do need to fallback to the previous system you can just reverse the configuration steps to reinstate the previous blue/green
deployment as the production system.
Note that no DNS changes required when switching over (after initially creating the 2 A-records during the installation process).
1. Redeploy the deployment which is currently not in use. For example, after initially using the blue system you will redeploy the
green system. You will then have two functioning deployments again — the old version and the new version.
2. Test the newly redeployed system.
3. Switch over to the new system and decommission the old deployment version when the transition is complete.
Upgrades to a new version are performed by following the standard steps outlined in Upgrading the Teams Connector to the latest
software. However, when using the blue-green deployment strategy note that:
l You always upgrade the Teams Connector deployment that is currently not in use. The variable script you use for the
redeployment has to match the variable script used to deploy that particular deployment (i.e. blue or green).
l As with any upgrade of the Teams Connector you need to ensure that the dynamic resource group for that deployment is empty.
This means that when redeploying, for example the blue deployment, you need to delete and recreate the
$PxTeamsConnResourceGroupName of the blue deployment. Make sure that the name doesn’t change when recreating the
resource group — it must stay the same as when used previously for that version.
l After the deployment finishes, and has been tested, follow the Management Node configuration described above to complete the
switchover.
l When the transition is complete you can optionally decommission the old deployment version by removing the dynamic resource
group ($PxTeamsConnResourceGroupName) of the old/previous deployment so you don't have to pay for the redundant Azure
resources while that environment is not in use.
You do not need to create a new CVI app or perform any additional app authorizations when installing additional Teams
Connectors — only one CVI app registration is required per tenant. However you do need to create a new API app for each new
region, as described here.
1. Create a new variables initialization script for the new Azure region. You should do this by making a copy of your existing
initialization script.
2. Update the regional variables in the new initialization script with the values for your new Azure region. The variables you need to
update are:
o $PxVmssRegion: the short name that represents the new region in which you are deploying the new Teams Connector.
o $PxTeamsConnFqdn: the hostname of the new Teams Connector.
o $PxNodeFqdns: the pool name or names of the Conferencing Nodes that will communicate with the new Teams Connector.
o $PxAzureLocation: the name of the Azure region into which you are deploying the new Teams Connector.
o $PxPfxCertFileName: the filename of the PFX certificate file to upload to the new Teams Connector.
o $PxNodesSourceAddressPrefixes: the IP addresses of the Conferencing Nodes that will communicate with the new Teams
Connector instances.
o $TeamsConnectorApiApplicationId: this must be updated to hold the ID of a new Teams Connector API app for this region,
and is described later in the process below.
3. Create the static and dynamic resource groups for the new region and ensure that the person performing the installation has the
Owner role for them. (You do not need to create a resource group for the Azure Bot.)
These steps must be performed by the Owner of the Azure subscription used for the Teams Connector.
a. Run the following PowerShell command to connect to Azure:
n In all standard deployments run:
Connect-AzAccount
n If this is a GCC High / Azure US Government Cloud deployment then use this command instead:
Connect-AzAccount -EnvironmentName AzureUSGovernment
d. Run the following script to create the resource groups for static and dynamic resources:
# Resource group for static resources for the Teams Connector / region
New-AzResourceGroup -Name $PxTeamsConnStaticResourceGroupName -Location $PxAzureLocation -Force -Tag $tags
e. Ensure that the person who will perform all of the remaining installation steps has the Azure Owner role for the static and
dynamic resource groups you have just created. If the Owner of the Azure subscription will perform all of the remaining
installation steps then you can skip to Create the Teams Connector API app. below.
Otherwise, you must run the following commands to assign the required roles for the resource groups you have just created
to the person who will perform all of the remaining installation steps:
New-AzRoleAssignment -SignInName <email_name> -RoleDefinitionName "Owner" -ResourceGroupName
$PxTeamsConnStaticResourceGroupName
New-AzRoleAssignment -SignInName <email_name> -RoleDefinitionName "Owner" -ResourceGroupName $PxTeamsConnResourceGroupName
where <email_name> is the email address / user principal name of the person who will perform the remaining steps; for
example where [email protected] will perform the upgrade/redeploy, the SignInName would be -SignInName
[email protected] for the commands listed above.
Note:
o Some of these resource groups only need creating once; others need recreating when you upgrade or if you redeploy:
n The static resource group ($PxTeamsConnStaticResourceGroupName) only has to be created when deploying in a region
for the first time — you do not have to repeat this when redeploying or for subsequent upgrades.
n The dynamic resource group ($PxTeamsConnResourceGroupName) has to be recreated in each region whenever you
upgrade or redeploy.
o In the future, if another person were to upgrade or redeploy the Teams Connector, that person would also have to be granted
the appropriate roles for these resource groups.
o You can also use the Azure portal to check/assign permissions by selecting the resource group and using the Access control
(IAM) option.
4. Create the Teams Connector API app.
You must create in this region an Azure app that is used to secure requests to the Teams Connector APIs.
Each region must have its own Teams Connector API app, and thus the variables initialization script for each region must be
updated to contain the API App ID for that region.
a. Run the following PowerShell command to connect to Azure:
n In all standard deployments run:
Connect-AzAccount
n If this is a GCC High / Azure US Government Cloud deployment then use this command instead:
Connect-AzAccount -EnvironmentName AzureUSGovernment
# Set execution policy for the current PowerShell process, when prompted type A (Yes to All)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
# The Unblock-File cmdlet lets you run PowerShell script files that were downloaded from the internet.
# By default, these files are blocked to protect the computer from untrusted files.
Get-ChildItem -Recurse | Unblock-File
# Connect to Graph
Connect-PexTeamsMsGraph
d. Run your variable initialization script to set the required prefix and region name variables.
e. Run the following command to create the Teams Connector API app.
Please allow one minute for this command to complete and propagate within Azure.
f. Run the following commands to obtain the Teams Connector API app ID.
Note that if the New-MgServicePrincipal command fails, this means that you have not waited long enough for the previous
command to complete.
Write-Host
Write-Host
Write-Host "`n----------------------------------------`n"
Write-Host
Write-Host "### Teams Connector API App ID MUST be saved in the variables initialization script ###"
Write-Host
Write-Host "`$TeamsConnectorApiApplicationId = `"$($TeamsConnectorApiApplicationId)`""
Write-Host
Write-Host "`n----------------------------------------`n"
Write-Host
Write-Host
g. When the command runs, it generates some output that lists the Teams Connector API App ID, similar to this:
h. Copy the output line that defines the API App ID and paste it into the variable initialization script, replacing the existing
variable definition in the script that currently contains the API App ID for the main region used by the original variables script
(the one you used as the basis for the variables script for this new region).
i.e. the script will initially contain:
$TeamsConnectorApiApplicationId = "<App ID for the existing main region>"
(If you will be performing the rest of the deployment, in the same PowerShell session, there is no need to re-run the variable
initialization script as the new $TeamsConnectorApiApplicationId variable has been set in the previous steps.)
i. If somebody else will be completing the deployment, ensure that the person who will perform all of the remaining installation
steps has Owner permissions for the API app. See Assigning Owner permissions for the API app for more information.
Note that:
o This app does not have to be granted any permissions. It does not have access to any resources in the Microsoft Entra ID
tenant. It has no associated credentials.
5. Run the redeploy script to install the Teams Connector into the new region.
This should be the script that you produced after the initial installation or most recent upgrade. This script should already have the
variables for the CVI App ID and password updated with the correct values for your deployment. As with the initial installation, we
recommend running each group of commands step-by-step within PowerShell.
6. Update DNS with the new Teams Connector's name and IP address.
Note that you do not need to create a new CVI app or perform any additional app authorizations when installing additional Teams
Connectors.
1. If required, set up new Conferencing Nodes / locations that will use the new Teams Connector.
2. Ensure that the Conferencing Nodes have suitable certificates installed (see Certificate and DNS examples for a Microsoft Teams
integration).
3. Configure a new Microsoft Teams Connector (Call Control > Microsoft Teams Connectors) where the address of the Teams
Connector is the name specified in $PxTeamsConnFqdn in your new initialization script for the new Azure region.
4. Assign the new Teams Connector to the locations (and thus Conferencing Nodes) where you want that new Teams Connector to
be used (Platform > Locations).
5. Now that you have multiple Teams Connectors you must ensure that calls are routed via your desired Conferencing Nodes to the
appropriate Teams Connector. This assumes that GeoDNS or your call control system is routing incoming calls to the appropriate
This example diagram shows how your Call Routing Rules should evolve when moving from routing all calls via a single Teams
Connector to deploying a second Teams Connector in another Azure region. Note that this example also includes locations/nodes in
the enterprise internal network, in addition to the locations/nodes in the DMZ.
You do not have to change your existing Virtual Reception configuration — there is minimal performance overhead by always using a
single location and Teams Connector to resolve Teams Conference IDs entered into a Virtual Reception.
Example: "pexip-TeamsConn-eu-static-RG"
VnetName No The name of the VNET. If omitted the name is generated in the format "pexip-tc-{uid}-VNET".
Default: @("10.0.0.0/23")
Default: "10.0.0.0/24".
Default: "10.0.1.0/28".
Tags No Optional tags (name-value pairs) to apply to Azure resources and resource groups ($tags in
the variable script).
Note that:
l The VNET must be in the same subscription as your Teams Connector.
l We recommend that you assign the $resourceGroupName variable in the following example script to use the static resource
group for the VNET (i.e. $PxTeamsConnStaticResourceGroupName in the variables initialization script). It will be created if it does
not already exist.
l You should run your variables initialization script to set the $PxAzureLocation and $PxSubscriptionId variables.
l You should create the VNET in advance of deploying the Teams Connector.
l The NSG attached to the VNET is not customizable and is created during the deployment of the Teams Connector.
Using your own preferred subnet ranges, you could run the create_vnet_deployment.ps1 script as:
# Name of the resource group to use. We recommend using the static resource group i.e. $PxTeamsConnStaticResourceGroupName
# in the variable script. For example "pexip-TeamsConn-eu-static-RG"
# The resource group is created if it does not already exist
$resourceGroupName = ""
# Azure Region (must be a supported region) in lowercase: uses $PxAzureLocation in the variable script
# Optional tags (name-value pairs) to apply to Azure resources and resource groups ($tags in the variable script)
# For example $tags= @{"ResourceOwner"="user@domain"; "CostCenter"="Video Services";}
$tags = @{}
Connect-AzAccount
# Make sure to call this script from the expanded TeamsConnector ZIP folder
# You can assign a custom VNET name by providing a -VnetName parameter, otherwise "pexip-tc-{uid}-VNET" is used
Blue-green deployments
If you are also following (or planning to follow) a blue-green deployment strategy, you should set up a second VNET in the other static
resource group.
Use the name of the other e.g. "green" static resource group for the $resourceGroupName variable.
The resource ID is then passed as the -ExistingVNETResourceId parameter in the create_vmss_deployment.ps1 script. The Teams
Connector VMs being deployed are then attached to this custom VNET instead of the default VNET.
Note that if the custom VNET is deployed into the static resource group, the deployment script will use this custom VNET automatically
(without the need to specify the -ExistingVNETResourceId parameter).
Requirements
Here are the requirements for setting up private routing:
l The link that connects the Teams Connector VNET to the other private network where Pexip Infinity is deployed (by whichever
method — VNET peering within Azure, a site-to-site VPN, ExpressRoute to an on-premises network, or a cross-cloud interconnect)
must be configured to:
o Route the IP address range of the Teams Connector VNET from the private network to the Teams Connector VNET, and
o Route the IP address range of Pexip Infinity from the Teams Connector VNET to the private network.
To achieve this, the following requirements must be met:
o Unique addressability within the entire private network: when you connect the VNET of a Teams Connector installation to
another private network, you need to ensure that the address space of the Teams Connector VNET and its subnets is unique,
i.e. it cannot overlap with any existing VLAN, subnet or other network resource in the connected private network. This
ensures the link can route requests to the correct destination.
o Two-way routability between Pexip Infinity and the Teams Connector: the network must be able to route requests from Pexip
Infinity to the Teams Connector deployment and requests from the Teams Connector deployment to Pexip Infinity over the
link that connects the existing private network to the Teams Connector VNET.
l A split-DNS setup is required as Pexip Infinity must be able to resolve the FQDN of the Teams Connector load balancer to its
private IP address, but Microsoft Teams must also be able to resolve the FQDN to its public IP address. Thus you must have the
relevant A records both in internal DNS and public DNS. You can achieve the necessary internal DNS requirements by configuring a
DNS A record in a private DNS zone in Azure, if required.
l Note that the TLS certificate installed on the Teams Connectors still must be a publicly-signed certificate.
# Name of the resource group to use. We recommend using the static resource group i.e. $PxTeamsConnStaticResourceGroupName
# in the variable script. For example "pexip-TeamsConn-eu-static-RG"
# The resource group is created if it does not already exist
$resourceGroupName = ""
# Azure Region (must be a supported region) in lowercase: uses $PxAzureLocation in the variable script
# Optional tags (name-value pairs) to apply to Azure resources and resource groups ($tags in the variable script)
# For example $tags= @{"ResourceOwner"="user@domain"; "CostCenter"="Video Services";}
$tags = @{}
Connect-AzAccount
# Make sure to call this script from the expanded TeamsConnector ZIP folder
# You can assign a custom VNET name by providing a -VnetName parameter, otherwise "pexip-tc-{uid}-VNET" is used
2. Set up VNET peering between the Pexip Infinity VNET and the Teams Connector VNET.
The specific details of how you set up peering to the Teams Connector VNET depends on your Pexip Infinity environment — see
the Deployment environments and inter-network connectivity options section above for more information. Also, if relevant, see
Setting up peering where the Pexip Infinity platform is in Azure.
3. If you are also following (or planning to follow) a blue-green deployment strategy, you should repeat steps 1 and 2 to set up a
second VNET in the other static resource group and configure VNET peering for it:
o Use the name of the other e.g. "green" static resource group for the $resourceGroupName variable.
o Ensure that the second VNET's address space does not overlap with the first VNET or the Pexip Infinity subnet range.
We recommend setting up both VNETs as part of the initial setup so that you can plan all of your subnet assignments and simplify
the first upgrade process as you will have the alternative VNET and peering already in place.
4. Set the variables in the variable initialization script:
$PxExistingVNETResourceId You must set this variable to the resource ID of the VNET created in step 1.
o Use the output of the create_vnet_deployment.ps1 script — line "Deployed VNET resource ID:
{VNET resource ID}".
o The resource ID can also be retrieved from Azure Portal > VNET resource > JSON view > Resource
ID.
The deployment process will create an additional internal load balancer, allowing traffic to be routed
between Pexip Infinity and the Teams Connector through Microsoft's private network only.
Note that these variables are passed as parameters (-ExistingVNETResourceId and -UsePrivateRouting) to create_vmss_
deployment.ps1 in the installation and redeploy scripts.
5. You can configure the deployed Teams Connector in the Pexip Infinity Management Node according to the main documentation.
6. After the Teams Connector deployment has finished you must configure an additional DNS record:
o In addition to creating a public A record pointing to the external IP of the Azure load balancer, you must also create an
internal DNS record pointing to the (private) frontend IP of the internal load balancer.
o Our recommended method for this is to create an Azure private DNS zone and set it up in the Management Node as described
below. However, this could also be configured using an external DNS provider.
7. Test that calls are working.
1. Set up a private DNS zone in Azure for your Teams Connector domain:
2. Create an A record specifying your Teams Connector hostname ($PxTeamsConnFqdn) pointing to the (private) frontend IP address
of the load balancer.
3. Link your DNS zone to your Pexip Infinity deployment VNET (go to Virtual Network Links > Add).
4. In the Pexip Infinity Management Node:
a. Add the Azure DNS zone as a DNS server (System > DNS Servers > Add DNS Server).
Use an IP address of 168.63.129.16 for the DNS virtual server (this is the Azure DNS IP address).
b. Assign this DNS server to all the relevant system locations that need to resolve to your Teams Connector FQDN (the Outgoing
location used by your Call Routing Rules used for Teams calls).
Prerequisites
Here are the prerequisites you must perform before configuring Pexip Infinity as a Microsoft Teams gateway.
Before configuring Pexip Infinity as a Microsoft Teams gateway, you should have:
l Performed a basic installation of the Pexip Infinity platform.
l Installed the Pexip Teams Connector as described in Installing and configuring the Teams Connector in Azure.
1. Go to Call Control > Microsoft Teams Tenants and select Add Teams Tenant.
2. Add the details of your tenant:
Name The name that you specify here is used elsewhere in the Pexip Infinity interface when associating the tenant with a
Teams Connector.
Teams tenant The Office 365 tenant ID where the Microsoft Teams users are homed.
ID
To retrieve your tenant ID from the Azure portal:
a. Select Azure Active Directory.
b. Under Manage, select Properties.
c. The tenant ID is shown in the Directory ID field. You can use the Click to copy option to copy it.
You can also check your tenant ID at https://www.whatismytenantid.com/.
3. Select Save.
This Teams tenant is now available to associate with your Teams Connectors.
1. Go to Call Control > Microsoft Teams Connectors and select Add Microsoft Teams Connector.
2. Add the details of your Teams Connector:
Name The name that you specify here is used elsewhere in the Pexip Infinity interface when associating the Teams Connector
with a system location, Call Routing Rule or Virtual Reception.
Address of The FQDN of the Teams Connector to use when placing outbound calls to Microsoft Teams.
Teams
This is the address you stored in $PxTeamsConnFqdn in the PowerShell variables initialization script, and is the FQDN
Connector
(DNS name) of the Teams Connector load balancer in Azure that fronts the Teams Connector deployment e.g. pexip-
teamsconn-eu.teams.example.com.
Teams tenant Select the Teams tenant to associate with this Teams Connector.
Enable Azure When enabled, this provides the ability to create scheduled scaling policies, and also provides enhanced status
Event Hub information for each Teams Connector node, such as call capacity and current media load.
Azure Event When the Azure Event Hub is enabled you need to specify its connection string.
Hub
The connection string is in the format Endpoint=sb://examplevmss-lltsgzoqun-
connection
ehn.servicebus.windows.net/;SharedAccessKeyName=pexip_teams_connector_access;SharedAccessKey=[string]
string
To find this string in the Azure portal:
a. Go to the static resource group for the Teams Connector (this has a name in the format <prefix>-TeamsConn-
<optional version>-<region>-static-RG).
b. Select the Event Hubs Namespace component (<name>-EHN).
c. From the left-hand navigation menu, under Settings select Shared access policies.
d. Select the pexip_teams_connector_access policy.
e. Copy the Connection string–primary key.
You can also obtain it via the following PowerShell script (you must run your variables initialization script first):
Minimum The minimum required number of instances in the Teams Connector scale set.
number of
This setting only applies when the Azure Event Hub is enabled, and is the number of instances that are always running
instances
when there are no scaling policies in effect (it overrides the manual scaling settings in the Azure portal). See Scheduling
scaling and managing Teams Connector capacity for more information.
If you increase this setting it can temporarily raise the "Scheduled scaling: some or all of the requested Teams
Connector instances are not operational" alarm. It will last for a few minutes until the new instances are up and
running. This is expected behavior and can occur with or without any scheduled scaling policies.
Default: 1
3. Select Save.
This Teams Connector is now available to associate with any system locations, Call Routing Rules or Virtual Receptions that you
configure (as described below) to handle Teams conferences.
Configuring Virtual Receptions and Call Routing Rules for Teams meetings
You must configure the Call Routing Rules, and optionally the Virtual Receptions, that are required to route calls into Microsoft Teams
meetings.
There are two ways you can configure Microsoft Teams gateway calls within Pexip Infinity:
l Routing indirectly via a Virtual Reception: here you configure Pexip Infinity to act as an IVR gateway or "lobby" by configuring a
Virtual Reception to capture the Conference ID of the required conference, and then use a Call Routing Rule (typically the same
rule as used for direct routing) to route the call into the Teams conference.
l Routing directly via the Infinity Gateway: here you only use one or more Call Routing Rules to route incoming calls for specific
alias patterns — that will typically include the Conference ID — directly into the relevant Teams conferences.
To route calls to Teams conferences via a Virtual Reception (IVR gateway) you need:
l A Virtual Reception configured specifically to handle Microsoft Teams conferences.
l A Call Routing Rule to route the calls handled by the Virtual Reception into the relevant Teams conference. Typically you would
configure the Virtual Reception and Call Routing Rule patterns so that the same rule can also support direct routing if required.
The Virtual Reception requests the caller to enter the Teams Conference ID which it then sends to the Teams Connector for
verification. You can then optionally transform the Conference ID to meet any dial plan requirements, before the Infinity Gateway then
matches the (optionally transformed) Conference ID and routes the caller to the appropriate Teams conference.
The Virtual Reception details you enter here must correspond to the "Alternate VTC dialing instructions" that you specified in the
InstructionUri switch in the New-CsVideoInteropServiceProvider command when installing the Teams Connector (see Authorize
trusted app to bypass Teams lobby and configure dialing instructions).
Name The name you will use to refer to this Virtual Reception, for example "Microsoft Teams IVR gateway".
Theme If required, assign a customized theme to this Virtual Reception to brand it as the gateway to Teams
conferences, for example by customizing the voice prompts or changing the appearance of the Virtual
Reception splash screen.
Teams Connector Select the name of the Teams Connector to use to resolve Teams codes.
Lookup location Specify the location that contains the Conferencing Nodes (typically Proxying Edge Nodes) that will
communicate with the Teams Connector. These are the nodes referenced in the $PxNodeFqdns variable in
the initialization script.
Alias (#1) Enter the alias that users will dial to use this Virtual Reception to place calls into Teams conferences.
This must correspond to the ivr and d parameters that were specified in the InstructionUri switch in the New-
CsVideoInteropServiceProvider command when installing the Teams Connector, i.e. the alias of the Virtual
Reception is ivr@d, for example [email protected].
3. If you have specified the ip parameter in the InstructionUri switch in the New-CsVideoInteropServiceProvider command when
installing the Teams Connector, then you must specify that IP address as an alias of this Virtual Reception.
Select Add another Alias and add Alias (#2).
Alias (#2) This must be the same IP address of the Conferencing Node that is specified in the ip parameter, e.g.
198.51.100.40.
4. Select Save.
different alias patterns in your Virtual Reception's Post-lookup regex replace string and your rule's Destination alias regex match
string.
You need to create at least one Call Routing Rule, regardless of whether you are using indirect routing, direct routing, or both. The rule
(s) must match the alias that has been captured — and probably transformed — by the Virtual Reception (for indirect routing) or match
the alias originally dialed by the meeting participant (for direct routing).
Setting up direct routing
As with indirect routing, if you want to route calls to Teams conferences directly via the Infinity Gateway you need:
l To decide on an alias pattern that participants will dial to access the Teams conferences. The alias pattern will typically include the
9 to 12-digit Conference ID, for example the pattern could be just <conference ID> or <conference ID>@<domain>, for example
[email protected] to access a Teams conference with a Conference ID of 234567890.
See Dial plan conflicts if you have a more complicated dial plan to consider.
l A Call Routing Rule that matches that alias pattern and, if necessary, transforms it such that it contains just the Teams Conference
ID which it can then use to connect to the conference.
For rules configured to match against trusted participants, you should enable the rule's Treat as trusted option, which would cause
Pexip Infinity to route the call directly into the Teams meeting (see Authorize app to bypass Teams lobby and configure dialing
instructions for more information). The call is held in the meeting lobby if the rule does not have Treat as trusted enabled.
1. Go to Services > Call Routing and select Add Call Routing Rule.
2. The following table shows the fields to configure for your Call Routing Rule, and shows example values for three rules:
o Rule #1: treats all devices on your enterprise network (handled by Conferencing Nodes in your "Internal network" location) as
trusted.
o Rule #2: treats any device that is registered to Pexip Infinity as trusted (regardless of the source location of the call).
o Rule #3: treats any other call (not matching rule #1 or rule #2) as coming from an untrusted device.
(Leave all other fields with default values or as required for your specific deployment.)
Option Description Rule #1 Rule #2 Rule #3
Name The name you will use to refer to this rule. "Enterprise "Registered "Unknown /
network" devices" guest"
Calls being Applies the rule only if the incoming call is being handled by a "Internal Any location Any location
handled in Conferencing Node in the selected location. network"
location location
To apply the rule regardless of the location, select Any Location.
Match incoming Select this option if you want this rule to only apply to calls placed ☐ ☑ ☐
calls from from devices that are registered to Pexip Infinity. You will typically
registered devices use this option in conjunction with the rule's Treat as trusted
only setting.
Match Infinity Select one or more of the match options as appropriate, Select these options as appropriate
Connect depending on which types of systems/protocols you want to offer
Match SIP interoperability into Teams.
Match Lync /
Skype for Business
(MS-SIP) /
Match H.323 /
(Match Teams)
Destination alias Enter a regular expression that will match the calls to be sent to a (\d{9,12})(@example\.com)?
regex match Teams conference.
(\d{9,12})(@example\.com)?
(Note that Teams Conference IDs are between 9 and 12 digits long.
Putting ( )? around the @domain part of the regex makes that part
of the dial string optional.)
Destination alias If required, enter the regular expression string to transform the \1
regex replace originally dialed (matched) alias into the 9 to 12-digit Conference
string ID to use to place the call into the Teams conference. If you do not
need to change the alias, leave this field blank.
\1
which would extract just the <conference ID> element of the alias.
Call capability To support incoming calls via SIP, H.323 and WebRTC/RTMP, Same Select these options as appropriate
as incoming call is recommended as this makes the most efficient
use of Pexip Infinity resources.
If you also want to support calls from Skype for Business / Lync,
then you should select Main video + presentation instead to
ensure that any SfB/Lync participants are able to escalate from
audio-only to a video call after joining the conference (alternatively
you can configure a separate rule just for matching incoming calls
from Skype for Business / Lync and set that rule to use Main video
+ presentation).
Maximum call Controls the maximum call quality for participants connecting to Select these options as appropriate
quality this service:
o Use global setting: use the global maximum call quality
setting.
o SD: each participant is limited to SD quality.
o HD: each participant is limited to HD (720p) quality.
o Full HD (1080p): allows any endpoint capable of Full HD to
send and receive its main video at 1080p.
Default: Use global setting
Theme If required, assign a customized theme to this rule (which will then Select these options as appropriate
be used for callers that use this rule to gateway into Teams). For
example, the theme could use alternative labels on some of the
splash screens that are displayed when connecting to a
conference. You can also customize and enable the in-lobby and
mute notifications, or the in-conference DTMF/keypad layout
control options.
Outgoing location Specify the location that contains the Conferencing Nodes Select the location that contains the
(typically Proxying Edge Nodes) that will communicate with the Conferencing Nodes that are referenced in
Teams Connector. These are the nodes referenced in the the $PxNodeFqdns variable in the
$PxNodeFqdns variable in the initialization script. initialization script
Teams Connector You can optionally select the Teams Connector you want to handle Leave unselected
the call. If you do not specify anything, the Teams Connector
associated with the outgoing location is used.
Treat as trusted Select Treat as trusted if you want Teams to treat the devices ☑ ☑ ☐
routed via this rule as part of the target organization for trust
purposes.
Typically you will select this option if the rule is handling devices
that are trusted from Pexip Infinity's perspective, for example, you
could treat the device as trusted if the caller is coming from a
specific location, or if the device is registered to Pexip Infinity.
External This determines whether or not the Teams Connector requests Select these options as appropriate
participant avatar from Exchange Online an avatar for each participant in the Teams
lookup conference.
o Use global setting: use the global external participant avatar
lookup setting.
o Yes: request the participant avatar from Exchange Online via
the Teams Connector.
o No: use default avatar behavior.
Default: Use global setting
3. Select Save.
4. Repeat the above steps adding your second and subsequent rules as appropriate.
With these changes, callers dialing the meeting directly would need to use this extended format of teams.<conference
ID>@<domain>, but there is no change to callers going indirectly via the Virtual Reception (they would still dial [email protected]
and then enter the Conference ID as before).
You also need to configure a different set of "Alternate VTC dialing instructions" to use the prefix parameter to append "teams." to the
displayed direct-dial addresses. In this case, our example New-CsVideoInteropServiceProvider command would look like this:
If you have already configured the dialing instructions webpage, you can use the Set-CsVideoInteropServiceProvider command to
amend it (see Changing the alternative dialing instructions or IVR address).
Microsoft requirements:
l Teams Room Pro license
l Windows based device
l Teams Room software needs to be at least 4.19
Pexip reserves the right to audit the Teams Room Pro license quantity to ensure compliance. Such an audit can consist of requesting a
screenshot from the customer's Teams admin center:
You can then use the following commands to configure your calling policies.
To get a list of your existing policies, run the following command:
Get-CsTeamsRoomVideoTeleConferencingPolicy
where:
l <CVI App ID> is replaced with the CVI App ID of the Teams Connector to be contacted when the Teams Room places a call. (This
means that you can have different policies assigned to different Teams Rooms within the same tenant. i.e. a tenant is not locked
to a single logical Teams Connector App ID.)
l "MtrSipCallingPolicy" is the name of the policy being created. You can use any name of your choosing.
Note that ReceiveExternalCalls and ReceiveInternalCalls default to Disabled when not provided. These properties take only two values:
Enabled or Disabled. This lets you configure which types of calls (marked as internal and/or externally originating) you can receive.
To grant a particular policy configuration ("MtrSipCallingPolicy" in this example) to all users/rooms:
Grant-CsTeamsRoomVideoTeleConferencingPolicy -Identity Global -PolicyName "MtrSipCallingPolicy"
The example above disables receiving external calls on the "MtrSipCallingPolicy" policy. Note that the Identity field is mandatory.
To view systems assigned with a policy:
Get-CsOnlineUser -Filter {TeamsRoomVideoTeleConferencingPolicy -eq "MtrSipCallingPolicy"} | Select-Object DisplayName,
UserPrincipalName
The example above shows the systems assigned to the "MtrSipCallingPolicy" policy.
To delete a policy:
Remove-CsTeamsRoomVideoTeleConferencingPolicy -Identity "MtrSipCallingPolicy"
1. Go to Services > Call Routing and select Add Call Routing Rule.
2. The following table shows the fields to configure for your Call Routing Rule, and shows example values for three rules:
o Rule #1: treats all devices on your enterprise network (handled by Conferencing Nodes in your "Internal network" location) as
trusted.
o Rule #2: treats any device that is registered to Pexip Infinity as trusted (regardless of the source location of the call).
o Rule #3: treats any other call (not matching rule #1 or rule #2) as coming from an untrusted device.
(Leave all other fields with default values or as required for your specific deployment.)
Option Description Rule #1 Rule #2 Rule #3
Name The name you will use to refer to this rule. "To MTR "To MTR "To MTR
from from from
Enterprise Registered Unknown /
network" devices" guest"
Outgoing calls from If you only want to support 1:1 calls then leave this option Select these options as appropriate
a conference unselected.
Calls being handled Applies the rule only if the incoming call is being handled by a "Internal Any location Any
in location Conferencing Node in the selected location. network" location
location
To apply the rule regardless of the location, select Any Location.
Match incoming calls Select this option if you want this rule to only apply to calls placed ☐ ☑ ☐
from registered from devices that are registered to Pexip Infinity. You will typically
devices only use this option in conjunction with the rule's Treat as trusted
setting.
Match Infinity Select one or more of the match options as appropriate, depending Select these options as appropriate
Connect on which types of systems/protocols you want to offer
Match SIP interoperability into Teams.
Match Lync / Skype
for Business (MS-
SIP) /
Match H.323 /
(Match Teams)
Destination alias Enter a regular expression that will match the calls addressed to a .+@example\.com
regex match Microsoft Teams Room — this is the user principal (also referred to
as the "calling URI") or mail address of a Teams room.
.+@example\.com
Outgoing location Specify the location that contains the Conferencing Nodes (typically Select the location that contains the
Proxying Edge Nodes) that will communicate with the Teams Conferencing Nodes that are referenced
Connector. These are the nodes referenced in the $PxNodeFqdns in the $PxNodeFqdns variable in the
variable in the initialization script. initialization script
Teams Connector You can optionally select the Teams Connector you want to handle Leave unselected
the call. If you do not specify anything, the Teams Connector
associated with the outgoing location is used.
Treat as trusted Select Treat as trusted if you want Teams to treat the devices ☑ ☑ ☐
routed via this rule as part of the target organization for trust
purposes.
Typically you will select this option if the rule is handling devices
that are trusted from Pexip Infinity's perspective, for example, you
could treat the device as trusted if the caller is coming from a
specific location, or if the device is registered to Pexip Infinity.
If the "trusted" flag is set, the call is classed as "internal", and if the
"trusted" flag is not set, the call is classed as “external”. This
classification is used in conjunction with the Teams Room tenant
policy to decide whether the call is delivered to a Teams Room.
3. Select Save.
4. Repeat the above steps adding your second and subsequent rules as appropriate.
1. Run the variable initialization script. If you performing these steps in a new session you must also assign the $AppId variable.
2. Run the following commands to configure the Azure Bot:
# Connect to Azure
Connect-AzAccount
# Import the PexTeamsCviApplication PowerShell module
Import-Module .\PexTeamsCviApplication.psm1
# Enable incoming calls from a Teams Room
Enable-PexTeamsBotIncomingCallRoute -SubscriptionId $PxSubscriptionId -ResourceGroupName $PxBotResourceGroupName -AppId $AppId -
TeamsConnectorFqdn $PxTeamsConnFqdn
The Teams Connector can now handle incoming calls from a Teams Room (and route them onwards to Pexip Infinity).
1. Go to Services > Call Routing and select Add Call Routing Rule.
2. Configure the following fields (leave all other fields with default values or as required for your specific deployment):
Option Description
Name The name to use to refer to this rule e.g. "Incoming Teams Room calls".
Calls being handled in Applies the rule only if the incoming call is being handled by a Conferencing Node in the selected location.
location
To apply the rule regardless of the location, select Any Location.
Match Infinity Connect Select Match Teams and deselect all of the other options.
(WebRTC / RTMP)
Match SIP
Match Lync / Skype for
Business (MS-SIP)
Match H.323
Match Teams
Destination alias regex Enter a regular expression that will match the calls received from the Teams Room.
match
For example, to match any alias in the vc.example.com domain: [email protected]
Destination alias regex If required, enter the regular expression string to transform the originally dialed (matched) alias into the alias
replace string to use to place the outbound call. If you do not need to change the alias, leave this field blank.
Call target Select the appropriate target for the call, typically Registered device or external system or Registered
devices only depending on your requirements.
Protocol Select the protocol and associated proxy/gatekeeper as required if you are routing to external systems.
SIP proxy
H.323 gatekeeper
3. Select Save.
When using SIP Guest Join, your calls are routed via the Pexip Service, therefore you need to contact your Pexip authorized support
representative to perform the necessary steps to enable the guest join process on your behalf. This includes:
l Purchasing a Trusted Devices license for the number of endpoints you own. Note that the Enterprise Room Connector (ERC)
premium licensing package for Infinity includes SIP Guest Join (which allows for external Teams calls outside the organization, up
to the purchased calling capacity).
l Providing the domains and IP addresses of all of the systems that will send SIP call signaling to the Pexip Service (typically these
are the addresses of your externally-facing Conferencing Nodes, or VCS Expressway if relevant).
Note that you do not need to register your endpoints to the Pexip Service, or route any of your non-guest Teams interop calls via the
Pexip Service.
Scope and limitations
This is a Teams commercial focused capability, thus all Teams meetings for Work or School i.e. used by enterprises and most
governments in the commercial cloud are supported.
Note that the following are not supported:
l Teams meetings with "teams.live.com" (part of Teams for Home or Small Business)
l Teams meetings with "gov.teams.microsoft.us" (part of the Microsoft Government cloud)
1. Add an OTJ Meeting Processing Rule (One-Touch Join > OTJ Meeting Processing Rules):
If you are using Pexip Infinity version 32 or later:
o You must add a new OTJ Meeting Processing Rule with a Meeting type of Microsoft Teams SIP Guest Join.
If you are using Pexip Infinity versions 29 to 31:
o You must add a new OTJ Meeting Processing Rule with a Meeting type of Custom.
o Use the following script in the rule's Custom template field:
{% if matches %}
{% set context = pex_regex_search("%7b%22Tid%22%3a%22([a-z0-9-]+)%22%2c%22Oid%22%3a%22([a-z0-9-]+)%22%7d", matches[2]) %}
{{(matches[0] ~ "," ~ matches[1]~ "," ~ context[1]) | pex_base32 ~ "." ~ context[0]}}@pex.ms
{% else %}
(This rule looks for https://teams.microsoft.com/<meetingcode> and converts it into a SIP URI that can be routed via the
Pexip Service.)
Consider the priorities of your rules. If you use Teams interop for your own Microsoft Teams meetings then your rules for
those meetings should have a higher priority (lower number).
2. Ensure that the SIP Guest Join calls placed from your endpoint are routed to the Pexip Service.
Typically you can do this via DNS as follows:
a. Add a Call Routing Rule (Services > Call Routing).
b. Configure the following fields (leave all other fields with default values or as required for your specific deployment):
Option Description
Match incoming calls from Select this option if you want the rule to apply only to calls received from devices that are
registered devices only registered to Pexip Infinity.
Match Infinity Connect (WebRTC Select the relevant types of system/protocols you want to support, typically Match SIP or
/ RTMP) Match H.323.
Match SIP
Match Lync / Skype for Business
(MS-SIP)
Match H.323
(Match Teams)
Destination alias regex match Enter a regular expression that will match the Teams calls that are sent to the Pexip Service.
We recommend:
.*@pex\.ms
{
{% if service_config and service_config.service_type == "gateway" and service_config.called_device_type == "teams_conference" %}
"action" : "continue",
"result" : {{service_config|pex_update({"enable_overlay_text": true, "view":"teams", "enable_active_speaker_indication":"true"})|pex_to_
json}}
{% elif service_config %}
"action" : "continue",
"result" : {{service_config|pex_to_json}}
{% else %}
"action" : "reject",
"result" : {}
{% endif %}
}
If you want to apply the policy to a specific Call Routing Rule you can test against service_config.name (the Name of the rule), for
example: service_config.name == "name of routing rule"
l Limiting the DTMF/keypad controls to the ones that are suitable for use in a Teams conference.
l Selecting and specifying the sequence in which the layouts are displayed (by pressing *8).
l Adding the command to toggle between the current layout and Microsoft's Large Gallery view.
Here is an example theme configuration file (themeconfig.json) that is suitable for use with a Teams conference:
{
"theme_version": 2,
"dtmf_conference_control_commands": {
"*3": "toggle_teams_large_gallery",
"*4": "toggle_pres_in_mix",
"*6": "toggle_self_mute",
"*8": "cycle_layout",
"*9": "toggle_multiscreen"
},
"dtmf_allowed_layouts": ["1:7", "teams", "ac", "2x2", "3x3", "1:0"]
}
This theme would override the default behavior and limit the DTMF controls to the following options that are relevant to a VTC
connected to a Teams conference:
l *3 command: toggles between the current layout and Microsoft's Large Gallery view
l *4 command: toggles whether the presentation stream is sent to that endpoint in the main video mix (replacing some of the other
video participants), or as a separate stream
l *6 command: toggles the mute status of the participant
l *8 command: cycles the layout through the set of available layouts as defined in dtmf_allowed_layouts
l *9 command: toggles multiscreen participant display
It also limits the available layouts to Teams-like, Adaptive Composition plus the other Pexip layouts that have a maximum of 9 or fewer
video participants. If required, you can adapt the list to change the order, or to further reduce the available layouts by removing the
layout types you do not want to use.
You can then apply this theme to your Call Routing Rule(s) used to route calls into Teams (or you can set it as your default theme if
appropriate for your deployment).
Note that:
l You cannot use the Pexip branding portal to create your theme configuration file (themeconfig.json). You have to manually create
your own theme configuration file (using the example above as the basis for this) and package it into a theme ZIP file.
l If multiple endpoints are gatewayed into the same Teams conference then they will all start with the same default layout, but any
commands to change the layout received by the endpoint only apply to the endpoint issuing the commands.
l If you switch from a less resource-intensive layout (such as "1+7") to a more resource-intensive layout (such as "ac" or "teams")
this will consume additional Conferencing Node hardware resources.
See Example themes below for links to some example downloadable theme files.
Other layout control options
You can also use the Pexip APIs to control the layout:
l Client API: you can use the client API (typically via the Connect web app) to dynamically change the layout applied to a Teams
gateway call. This involves using the transform_layout function with the client REST API or the transformLayout function with the
PexRTC JavaScript client API.
l Management API: you can use the transform_layout management API command.
l Cisco endpoint macros: Cisco endpoints can use the Pexip Layout Controls macro that allows you to dynamically change the
layout, or the Pexip Meeting Controls macro which offers an even greater range of conference control features in Teams meetings.
l Up to 9 video participants are shown in the Adaptive Composition layout seen by VTC participants.
l Each participant's video that is received from Teams for display to VTC participants is cropped and framed as appropriate.
l The VTC participant's video stream sent to Teams is cropped and framed as appropriate.
l Audio participant avatars are not supported.
l Inactive video participants are not removed from the video layout.
l Raised hand indicators are not supported.
l Spotlighting is not supported.
disable_conference_locked_indicator false Set this to true if you want to disable the in-lobby notifications.
conference_locked_indicator_text Conference locked This is displayed when somebody enters the Teams lobby or there is
a change in the count of waiting participants.
conference_locked_indicator_n_ {number_of_waiting_ This is also displayed when somebody enters the Teams lobby or
waiting_text participants} waiting for there is a change in the count of waiting participants.
host
We suggest you change it to something more appropriate, such as "
{number_of_waiting_participants} waiting in lobby".
conference_unlocked_indicator_text Conference unlocked This is displayed when the lobby is empty (everybody has been
admitted, rejected, or left the lobby).
disable_watermark_mute_icon true Set this to false if you want to enable the "Your mic has been muted"
notifications which are shown to a conference participant who is
administratively muted.
For example, to implement the text label changes suggested above, and to enable muted indicators, you would configure your
themeconfig.json file with:
{
"theme_version": 2,
"conference_locked_indicator_n_waiting_text": "{number_of_waiting_participants} waiting in lobby",
"conference_locked_indicator_text": "Action required",
"conference_unlocked_indicator_text": "The lobby is empty",
"disable_watermark_mute_icon": false
}
Audio files:
conf-participant_locked_out_48Khz_ Three knocks This is played to VTC participants when people are in the Teams
mono.wav lobby.
Example themes
We have provided some example themes that you can download from https://dl.pexip.com/resources/themes/index.html.
An example theme zip file, containing suggested themeconfig.json file settings for the in-lobby and mute notification, and some
alternative svg graphics files for the locked/unlocked indicators is available in lock-mute-indicator-theme.zip. The indicators in the
example theme look like this:
Another example theme, lock-mute-indicator-dtmf-theme.zip, extends the previous theme by including the recommended subset of
DTMF commands that may be used to control a Teams conference.
By default the "Fit to frame" option is not enabled for the video stream received from VTC participants. It can be enabled if required,
but currently only via local or external policy:
l It is controlled via the teams_fit_to_frame field in the response to an Infinity Gateway service request.
l Set teams_fit_to_frame to "yes" to enable the fit to frame option for the VTC participant.
o If a Teams user chooses to get a callback from the meeting to their PSTN device (instead of using computer audio) the user
appears in the Pexip layout as a video participant and also as an audio-only participant with the avatar of that user. However,
the video participant does not get voice-switched into main view when they speak.
o If a Teams user selects "manual dial-in" they appear in the Pexip layout as an audio-only participant without that user's avatar
as that audio participant has no association with the Teams user (and is also separate from any video connection).
l You cannot limit the Maximum outbound call bandwidth (the call leg towards the Teams Connector) — it is managed
automatically by Pexip Infinity.
For general troubleshooting, call failures and installation issues, see Troubleshooting Microsoft Teams and Pexip Infinity integrations.
The instances are represented by icons. Each purple square represents a Teams Connector instance and the fill level of the square
represents the current media load. A filled square in lighter purple represents an instance that is draining.
More details are shown when hovering over an instance, and you can double-click on an instance to see more detailed information
about it.
You can also view a list of all deployed Teams Connector instances via Status > Microsoft Teams Connectors. This provides a summary
of information including each node's name, IP address, maximum call capacity, current media load and the date/time of start-up and
last update.
Note that the instance status information is only displayed if you have enabled the Azure Event Hub (Call Control > Microsoft Teams
Connectors — see Configuring your Teams Connector addresses for more information). If the Azure Event Hub is not enabled then Live
View only displays Teams Connector instances when a Teams call is in progress.
l When viewing the status of the gateway call (Status > Conferences), the Participants tab also lists the other participants in the
conference. The format of their alias indicates the type of participant:
o <name>@<domain> (email address) is used for any Teams Rooms or Teams clients in the call
o trusted:<id> represents another gatewayed participant who joined as a trusted participant
o guest:<id> represents another gatewayed participant who joined as an untrusted participant
These other participants do not have any associated media stream information.
Note that only the gatewayed participant is shown as consuming a port license. The outbound leg of the gateway call (into the
Teams Connector), which consumes the second license of each gateway call, is not represented in the participant list.
The media streams associated with the call into the Teams meeting are shown against the conference backplane:
o There is one audio stream and multiple video streams. You also see a presentation stream if any participant is sharing
content.
o Multiple video streams are set up to receive video from the Teams Connector to support the Pexip conference layout seen by
gatewayed participants; if there are fewer participants than streams then the currently unused streams are shown as "Off
stage".
o Pexip Infinity may simultaneously send up to 4 video streams and 4 presentation streams at different resolutions and
frame rates to the Teams Connector, as requested by Teams.
l You cannot disconnect or transfer any of the other participants connected to the Teams conference.
1. Every minute, Pexip Infinity checks whether any scheduled scaling policies are to be applied at that time/day, taking into account
the policy's Minutes in advance offset for the start time.
As it can take up to 20 minutes to start an instance, the offset is to allow enough time for all of the requested additional instances
to be started up.
2. If a policy is to be applied, Pexip Infinity sends a request to Azure to start up the specified number of additional instances for the
nominated Teams Connector.
o The Minimum number of instances (configured against the Teams Connector in Pexip Infinity) defines the number of
instances that are always running when there are no scaling policies in effect. The Number of instances to add (configured
against each policy) is the amount of extra instances to start up.
o If multiple policies are in force at the same time then Pexip Infinity will add all of the requested instances. For example, if the
Minimum number of instances is 3 and there is a policy to add 2 more, and while that policy is in operation another policy to
add 4 more comes into effect, then you will have 9 instances.
o The maximum number of instances that can be running is capped by the instance count (slider) configuration in the Azure
portal for the Virtual machine scale set in your Teams Connector resource group (see Setting the maximum number of
instances). This limit is initialized by the $PxTeamsConnInstanceCount variable when you deploy a Teams Connector.
3. At the end of the scheduled time period, Pexip Infinity sends a request to Azure to turn off the additional instances, and Azure
decides which excess instances to turn off.
o The status of those instances is changed from Active to Waiting for termination and they will not accept any further calls.
o Any existing calls will continue to be hosted on that instance, and the instance is only stopped when all calls have drained.
However, if another instance becomes empty in the meantime then that other instance is terminated instead.
o If a new policy comes into effect while some existing instances are waiting for termination then they may be restored to an
active state, or brand new instances may be started up. This decision depends upon the current load of those instances and is
to ensure that the expected capacity is available at the requested time.
1. Within the Pexip Infinity Administrator interface, go to Call Control > Microsoft Teams Connectors and select your Teams
Connector.
2. Configure the Minimum number of instances as required.
3. Save your changes.
If you increase this setting it can temporarily raise the "Scheduled scaling: some or all of the requested Teams Connector instances are
not operational" alarm. It will last for a few minutes until the new instances are up and running. This is expected behavior and can
occur with or without any scheduled scaling policies.
Note that if the same Teams Connector is being used by multiple Teams tenants, then the minimum number of instances running in the
scale set will be the highest of all of the individual Minimum number of instances settings for each tenant.
1. In the Azure portal, for your subscription, go to the Virtual machine scale set in your Teams Connector resource group.
2. In the Settings menu, select Scaling, and then select the Configure tab.
3. Ensure that Manual scale is selected (do not use autoscale).
4. Use the slider to increase/decrease the instance count as appropriate.
Note that if you reduce the instance count, any calls that are being handled by an instance that Azure chooses to delete will be
dropped.
1. Within the Pexip Infinity Administrator interface, go to Platform > Teams Connector Scheduled Scaling and select Add scheduled
scaling policy.
Policy type Select Teams Connector Scaling. (Currently this is the only policy type available.)
Teams Connector Select the Teams Connector associated with this scheduling policy.
Number of Enter the number of instances to add when this policy is in effect
instances to add
Minutes in advance The number of minutes in advance of the activation time to begin scaling up the instances.
Enable this policy Determines whether or not this scheduled scaling policy is enabled.
Timing
Enter a string in the format YYYY-MM-DD or use the associated calendar picker.
Time from Specify the time of day when the additional instances are required. Enter a string in the format HH:MM:SS or
choose one of the preconfigured options.
Note that scaling up starts at the specified Minutes in advance of this time.
Time to Specify the time of day when the additional instances should be stopped. Enter a string in the format HH:MM:SS
or choose one of the preconfigured options.
Timezone Select the timezone used to specify the activation date and time above.
Days
Monday, Tuesday... Select the days of the week when the policy should be applied.
etc.
3. Select Save.
1. In the Azure portal, for your subscription, go to the Virtual machine scale set in your Teams Connector resource group.
2. In the Settings menu, select Scaling, and then select the Configure tab.
3. Ensure that Manual scale is selected (do not use autoscale).
4. Use the slider to increase/decrease the instance count as appropriate.
Note that if you reduce the instance count, any calls that are being handled by an instance that Azure chooses to delete will be
dropped.
Note that:
l When the Azure Event Hub is enabled, this slider setting has a different purpose: it controls the maximum number of instances
that can be running (instead of setting the current number).
l The Minimum number of instances (configured against the Teams Connector in Pexip Infinity) has no effect when the Azure Event
Hub is not enabled.
Note that you do not need to redeploy the Teams Connector if you need to change the Azure Network Security Group configuration,
for example to add the IP address of a new Conferencing Node, update its certificate, or if you need to modify the number of Teams
Connector instances.
a. Open a new PowerShell ISE or PowerShell session before you install the modules.
b. Run the following PowerShell commands (as Administrator):
Note that:
o The Az PowerShell module collects telemetry data (usage data) by default, however you can opt out from this data collection
using Disable-AzDataCollection (see this article for more information).
o The Az PowerShell module remembers login information by default (i.e. you're not automatically logged out when closing
your PowerShell window), but you can disable this with Disable-AzContextAutosave if required (see this article for more
information).
l You must import the required versions of PowerShell modules for this Teams Connector version:
a. Open a new PowerShell ISE or PowerShell session.
b. Change directory to the folder into which you extracted the files from the Teams Connector ZIP.
c. Run the following PowerShell commands to import the required module versions:
# Set execution policy for the current PowerShell process, when prompted type A (Yes to All)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
# The Unblock-File cmdlet lets you run PowerShell script files that were downloaded from the internet.
# By default, these files are blocked to protect the computer from untrusted files.
Get-ChildItem -Recurse | Unblock-File
l You must use the latest version of the redeploy script as contained here.
l If you have deployed multiple Teams Connectors, you must follow the same redeploy process (with the appropriate variable
initialization script) for each Teams Connector.
l As with all upgrades, you can continue to use the Pexip CVI app from your existing deployment.
l Your Pexip Infinity and Teams Connector installations must both be running the same software version (including minor/"dot"
releases).
Version 33
l There are some new variables in the variables script to support Microsoft Teams Rooms SIP/H.323 calling:
o $PexipConfiguredConnectorFqdn and $PexipOutboundFqdn.
These new variables are passed as new parameters to create_vmss_deployment.ps1 in the installation and redeploy scripts.
l There are some new variables in the variables script to support private routing:
o $PxExistingVNETResourceId and $PxUsePrivateRouting.
These new variables are passed as new parameters to create_vmss_deployment.ps1 in the installation and redeploy scripts.
l Changes related to the support of certificate-based authentication of the CVI app:
o A password-based authentication future deprecation notice has been added to the installation script.
o The create_vmss_deployment.ps1 command in the installation and redeploy scripts now takes AppId and AppPassword
parameters instead of AppCredential (they still support password-based authentication).
l Other changes to the installation/redeployment scripts:
o The commands to connect to MS Graph have been replaced by Connect-PexTeamsMsGraph command from the
PexTeamsCviApplication module.
Version 32
Install/redeploy script:
l Microsoft Graph PowerShell is now used for creating the Teams Connector API app and for deploying the Teams Connector.
l The strong API app password generation is now performed by Microsoft Entra ID.
Variables script:
l No changes.
Version 31
Install/redeploy script:
l The create_vmss_deployment.ps1 command passes three new parameters: $FunctionsDedicatedHostingPlan,
$EventHubSourceAddressPrefixes and $VnetIntegration (set to the new variables).
l A Get-ChildItem -Recurse | Unblock-File command has been added after Set-ExecutionPolicy to let you run PowerShell script files
that were downloaded from the internet.
Variables script:
l There are three new variables: $FunctionsDedicatedHostingPlan, $EventHubSourceAddressPrefixes and $VnetIntegration. These
are used to control support for dedicated hosting plans for Azure functions and VNet integration.
o if you want to use the new features, set $FunctionsDedicatedHostingPlan and $VnetIntegration to $true, and specify the
required IP addresses in the $EventHubSourceAddressPrefixes variable. The addresses specified in
$EventHubSourceAddressPrefixes can also be added or modified later in Azure if required.
o If you do not want to use the new features then you must add the following variable settings to your variables script:
$FunctionsDedicatedHostingPlan = $false
$EventHubSourceAddressPrefixes = @()
$VnetIntegration = $false
Version 30
Install/redeploy script:
l The Import-Module Az command now requires Az version 7.0.0 as a minimum.
Variables script:
l No changes.
Note that there is no need to backup the Teams Connector as there are no specific settings, status or history information to preserve
— if the deployment is lost you can just reinstall it with this redeploy process.
The redeployment process is summarized below:
1. Check that you have the latest relevant version of the Teams Connector software, and your variable initialization and redeploy
scripts.
2. Delete the previous dynamic resource group and then recreate it for the new deployment, and ensure that the person performing
the redeployment has the appropriate role for the resource groups in each region.
3. Reinstall the Teams Connector software.
Before running your scripts we recommend that you check the Azure status (https://status.azure.com) for your region. Any
ongoing issues in your region with the Azure services used by the Teams Connector could cause the script to fail.
The redeployment steps are shown in the following diagram and are then described in detail below.
Check Teams Connector software, retrieve your original scripts, and check your Azure environment
These instructions describe how to upgrade a Teams Connector that is already using CBA.
l If you are migrating (upgrading) an existing Teams Connector using password-authentication to CBA, see Migrating (upgrading) an
existing Teams Connector using password-authentication to CBA first.
l If you need to temporarily continue using password-based authentication, see Using password-based authentication for the Teams
Connector CVI application for upgrade instructions.
1. Download the latest relevant version of the Teams Connector ZIP file (Pexip_Infinity_Connector_For_Microsoft_Teams_v34_
<build>.zip) from the Pexip download page.
Ensure that the Teams Connector version you download is the same version as your Pexip Infinity deployment (including minor/
"dot" releases).
2. Extract the files to a folder on a local drive on your administrator PC.
3. Add your PFX Teams Connector TLS certificate to this folder.
4. Add your PFX certificate for the Teams Connector CVI app to this folder.
5. Retrieve your saved copy of the initialization script. You should have created and stored your version of this script after you
completed your initial installation of your first Teams Connector.
6. Check your saved copy of the initialization script that sets the environmental variables:
o If you are upgrading your Teams Connector, you should compare the saved copy of your initialization script against the
current version of this script (as listed here), and adjust your script if necessary, for example if new variables have been
added.
o If you are redeploying and need to change any of the previous configuration you should also adjust your initialization script as
required.
o If you have Teams Connectors in many regions, ensure that you have the correct versions of the initialization scripts that set
the regional variables to the appropriate values.
7. Prepare your redeploy script:
o If you are upgrading to v34, ensure that you use the latest version of the redeploy script and that you have updated it with
your Pexip CVI App ID and CVI App certificate path, as described immediately below.
o The CVI App ID and CVI App certificate password should have been stored in a password manager.
Use the stored CVI App ID value to update the first of the two existing lines in the redeploy script that say:
$AppId = ""
$AppCertificatePath = ".\your_cvi_app_certificate.pfx"
and set $AppCertificatePath to refer to the file name of the certificate that you retrieved in step 4.
You'll be prompted for the CVI App certificate password later.
This means that when you run the redeploy script, you will reuse the CVI app and CVI app certificate that you created the first
time.
o You should use the redeploy script in all scenarios except for when deploying a Teams Connector for the very first time for
your Azure subscription i.e. you should use the redeploy script when upgrading, redeploying, or deploying a new Teams
Connector in another region.
o You only need one version of this script — you can use the same redeploy script in every region if you have multiple Teams
Connectors.
Remove and then recreate the dynamic resource group and ensure appropriate roles are assigned to the resource groups
These steps must be performed by the Owner of the Azure subscription used for the Teams Connector.
4. Run the following script. It first deletes the existing dynamic resource group and then recreates it for the new/redeployed Teams
Connector.
5. Ensure that the person performing the redeploy/upgrade has the Azure Owner role for the static and dynamic resource groups,
and Contributor role for the Azure Bot resource group. If you have deployed in multiple regions you must do this for all of the
resource groups in each region.
If the Owner of the Azure subscription will be performing the redeploy/upgrade then this step can be skipped, otherwise the
subscription Owner must assign the required roles to the person performing the upgrade. You do this by running the following
commands:
New-AzRoleAssignment -SignInName <email_name> -RoleDefinitionName "Owner" -ResourceGroupName
$PxTeamsConnStaticResourceGroupName
New-AzRoleAssignment -SignInName <email_name> -RoleDefinitionName "Owner" -ResourceGroupName $PxTeamsConnResourceGroupName
New-AzRoleAssignment -SignInName <email_name> -RoleDefinitionName "Contributor" -ResourceGroupName $PxBotResourceGroupName
where <email_name> is the email address / user principal name of the person who will perform the remaining upgrade/redeploy
steps; for example where [email protected] will perform the upgrade/redeploy, the SignInName would be -SignInName
[email protected] for the commands listed above.
Note:
l In the future, if another person were to upgrade or redeploy the Teams Connector, that person would also have to be granted the
appropriate roles for these resource groups.
l You can also use the Azure portal to check/assign permissions by selecting the resource group and using the Access control (IAM)
option.
1. Ensure that you have Owner permissions for the API app (check App registrations in the Azure portal); see Assigning Owner
permissions for the API app if you do not have permission.
2. In PowerShell, run your initialization script that sets the environmental variables.
If you have Teams Connectors in many regions, ensure that you run the version of the initialization script that sets the regional
variables to the appropriate values.
3. In PowerShell run your redeploy script.
You only need one version of this script — you can use the same script in every region if you have multiple Teams Connectors.
This is the redeploy script. It is a variation on the installation script that only performs the necessary commands to redeploy the Teams
Connector. As with the initial installation, we recommend running each group of commands step-by-step within PowerShell.
if ($PxConnMajorVersion -ne "34"){Write-Warning "The Connector version (extracted ZIP files) and this deployment script version do not match.
Connector version = $PxConnMajorVersion. Deployment script version = 34"}
# The Unblock-File cmdlet lets you run PowerShell script files that were downloaded from the internet.
# By default, these files are blocked to protect the computer from untrusted files.
Get-ChildItem -Recurse | Unblock-File
# Connect to Azure with an authenticated account for use with Azure Resource Manager (in same window to reuse variables)
Connect-AzAccount
# Connect to Graph
Connect-PexTeamsMsGraph
# Before running the following commands, update the following 2 lines/variables with the CVI App ID and
# the path to the CVI App certificate file that were output when the original installation script was run
# You'll be prompted for the CVI App certificate password later.
$AppId = ""
$AppCertificatePath = ".\your_cvi_app_certificate.pfx"
# Optionally if you did not want to specify the password as a variable, use Get-Credential
# $PxWinAdminCred = Get-Credential
# Please enter the password for the PFX certificate '.\xxxxxxxx.pfx': ***************
# supply the PFX CVI app certificate file password when prompted
# Please enter the password for the CVI app PFX certificate '.\xxxxxxxx.pfx': ***************
# This script only applies to GCC High / Azure US Government Cloud deployments
if ($PxConnMajorVersion -ne "34"){Write-Warning "The Connector version (extracted ZIP files) and this deployment script version do not match.
Connector version = $PxConnMajorVersion. Deployment script version = 34"}
# Set VmImage variable to hold the CIS STIG image properties - STIG image is optional but typical
# In a later step in this script you can choose not to use the STIG image
$VmImage = @{
"sku" = "cis-win-2019-stig"
"offer" = "cis-win-2019-stig"
"publisher" = "center-for-internet-security-inc"
"version" = "latest"}
# The Unblock-File cmdlet lets you run PowerShell script files that were downloaded from the internet.
# By default, these files are blocked to protect the computer from untrusted files.
Get-ChildItem -Recurse | Unblock-File
# Connect to Azure USGovernment with an authenticated account for use with Azure Resource Manager (in same window to reuse variables)
Connect-AzAccount -EnvironmentName AzureUSGovernment
# Connect to Graph
Connect-PexTeamsMsGraph
# Before running the following commands, update the following 2 lines/variables with the CVI App ID and
# the path to the CVI App certificate file that were output when the original installation script was run
# You'll be prompted for the CVI App certificate password later.
$AppId = ""
$AppCertificatePath = ".\your_cvi_app_certificate.pfx"
# Optionally if you did not want to specify the password as a variable, use Get-Credential
# $PxWinAdminCred = Get-Credential
# Please enter the password for the PFX certificate '.\xxxxxxxx.pfx': ***************
# supply the PFX CVI app certificate file password when prompted
# Please enter the password for the CVI app PFX certificate '.\xxxxxxxx.pfx': ***************
if ($PxConnMajorVersion -ne "34"){Write-Warning "The Connector version (extracted ZIP files) and this deployment script version do not
match. Connector version = $PxConnMajorVersion. Deployment script version = 34"}
Connect-AzAccount
# Connect to Graph
Connect-PexTeamsMsGraph
Enter the password for the CVI app PFX certificate when prompted. We recommend that you create and save the CVI App PFX
certificate password using a password manager.
Note that:
o The script passes a -ValidityInMonths parameter to the PexTeamsCviApplicationCertificateCredential cmdlet to specify the
validity period of the CVI App certificate. In this case it specifies "-ValidityInMonths 24" i.e. 2 years but you can specify your
own period as required.
o The Teams Connector application will stop working if the CVI App certificate expires. We recommend that you set certificate
contact notifications (see this Microsoft article) as they can warn you of certificates that are due to expire.
8. Store the CVI App certificate PFX file in a safe location.
9. Now you can follow the redeploy instructions above.
Updating the Teams Connector TLS certificate or the CVI app certificate
The Teams Connector TLS certificate and the CVI app certificate (when using CBA to authenticate the Teams Connector CVI application
towards MS Graph) are stored in the Azure key vault and can be updated without having to redeploy the Teams Connector. The old
(existing) certificates can be updated when they are expiring or when they have already expired. We recommend updating the
certificates before they expire to avoid service disruptions.
If you need to roll back to an older (but still valid) version of a certificate, you must follow these steps to import it as an additional
certificate. Simply disabling the current certificate will not automatically revert to the previous version.
See Teams Connector certificate requirements for more information about the certificate requirements.
Note:
l An alarm is raised on Pexip Infinity when the Teams Connector TLS certificate is due to expire within the next 30 days, and if it has
expired. Currently there are no alarms raised if the CVI app certificate is due to expire.
l You can use the test_pfx_certificate.ps1 script (which is in the Teams Connector ZIP file) to verify the currently installed Teams
Connector TLS certificate (you cannot use it on the CVI app certificate). The command takes the format (run your variables
initialization script first):
test_pfx_certificate.ps1 -TeamsConnectorFqdn $PxTeamsConnFqdn -PfxPath $PxPfxCertFileName -PfxPassword <certificate password>
l If you need to create a new CVI app certificate, follow steps 1-7 of the instructions at Migrating (upgrading) an existing Teams
Connector using password-authentication to CBA.
To update either the Teams Connector TLS certificate or the CVI app certificate:
1. In the Azure portal, for your subscription, select the Teams Connector static resource group (which typically has a name in the
style <prefix>-TeamsConn-<region>-static-RG).
2. Ensure that you are an owner of the resource group.
3. Select the Key vault in that resource group.
4. Add a Key Vault Certificates Officer role (a4417e6f-fecd-4de8-b567-7b0420556985) for your user principal (see this article for
instructions).
5. Open the Certificates pane (under Settings).
(Note that the screenshot examples below are for the Teams Connector TLS certificate.)
If you have VNet integration enabled and you see a warning "Firewall is turned on and your client IP address is not authorized
to access this key vault" then you need to temporarily add your client IP address in the key vault’s Networking settings
(Firewall > + Add your client IP address).
6. Select the relevant certificate:
o To update the Teams Connector TLS certificate: select the certificate named pexip-teams-connector-certificate.
o To update the CVI app certificate: select the certificate named pexip-cvi-app-certificate.
(Don't create/import a new certificate under a different name.)
7. Select New Version.
9. Select your new pfx certificate and provide a password if the certificate is password protected.
10. Import the certificate.
After importing a certificate any alarm in Pexip Infinity related to an expiring or expired Teams Connector TLS certificate will be
lowered, but the new certificate is not applied across the VMSS yet.
There is no need to delete the expired certificate.
11. You have to reboot the scale set to apply the new certificate version.
To do this, in the Azure portal, for your subscription, select the Teams Connector dynamic resource group (which typically has a
name in the style <prefix>-TeamsConn-<version>-<region>-RG where <version> is optional), then the Virtual Machine Scale Set
and select the Restart option from the top menu.
Perform the reboot during out-of-hours — rebooting the scale set drops any existing calls.
12. After a few minutes, when the instances have restarted, verify that you can make calls and that the desired state configuration
(from within your dynamic resource group, select the Automation Account, and then State configuration DSC) is green for all the
running VMSS instances. (Some instances might be deallocated if using scheduled scaling — these instances will be provisioned
with the new certificate on startup.)
We recommend that you set certificate contact notifications (see this Microsoft article) as they can warn you of certificates that are
due to expire.
For external users (guests in a tenant) the -UserId parameter should be in the form "<emailname_domain>#EXT#@<tenant_url>".
For example, for external users, if the external user has an email name of [email protected] and is a guest in
maintenant.com, then you would specify (note the _ replacing the @ between guestname and guestdomain.com):
-UserId "guestname_guestdomain.com#EXT#@maintenant.onmicrosoft.com"
# Connect to Graph
Connect-PexTeamsMsGraph
# Assign owner role for the API application registration to the assignee
$newOwner = @{
"@odata.id"= "$($graphUrl.AbsoluteUri)v1.0/directoryObjects/$($user.Id)"
}
# Assign owner role for the API application service principal to the assignee
New-MgServicePrincipalOwnerByRef -ServicePrincipalId $apiAppSp.Id -BodyParameter $newOwner
and then
Write-Host "To give consent to the CVI app, go to: $AdminConsentUrl"
Note that if you run the above commands in a new window/session you will first need to run the PowerShell variables initialization
script.
Changing the workstation / management network addresses that can access the consent
page
To change the workstation / management network addresses that can provide consent for the Teams Connector CVI app (the
addresses that were initially specified in $PxConsentSourceAddressPrefixes):
1. In the Azure portal, go to the Azure bot resource group — this is called <prefix>-TeamsBot-RG.
2. Select the App Service object.
3. Under Settings, select Networking.
4. Select Configure Access Restrictions.
5. Modify the addresses as required and save your changes.
and you want to add a new Conferencing Node px03.vc.example.com, you would have to:
1. Install a certificate on the new Conferencing Node that contains the common px.vc.example.com identity.
To remain consistent with our example certificate naming policy this would mean creating a new certificate with a subject name of
px.vc.example.com and altNames of px.vc.example.com, px01.vc.example.com, px02.vc.example.com and
px03.vc.example.com. You would then install this certificate on the new node and the two existing nodes.
Note that purely from a Teams Connector perspective, the node certificate only needs to contain the identity specified in the
$PxNodeFqdns variable, but if the same Conferencing Nodes handle SIP and Skype for Business signaling then the example
certificate naming policy used here is more appropriate.
2. You may need to update the Network Security Group associated with your Teams Connector in Azure.
The "MCU-signalling-endpoint" rule (priority 120) specifies the IP addresses of the Conferencing Nodes that can communicate with
the Teams Connector. These addresses were based on the value of the $PxNodesSourceAddressPrefixes initialization script
variable. If individual IP addresses were specified then you need to add the IP address of the new Conferencing Node to this NSG
rule. If the variable specified an IP subnet and the new node's address is within that subnet, then no changes are required.
3. If you had to update the NSG rule, you should add the same new address to the $PxNodesSourceAddressPrefixes variable in your
stored initialization script to keep it in sync with your actual deployment in case it is needed for a future redeployment or upgrade.
To change the instructions to remove the "Test call" option, for example, the revised InstructionUri parameter would be
"https://px.vc.example.com/teams/?conf={ConfId}&ivr=teams&d=example.com&ip=198.51.100.40&w&qrcode"
and the command to apply the revised InstructionUri parameter would be:
Set-CsVideoInteropServiceProvider -Identity Pexip -InstructionUri "https://px.vc.example.com/teams/?conf=
{ConfId}&ivr=teams&d=example.com&ip=198.51.100.40&w&qrcode"
Note that when using Set-CsVideoInteropServiceProvider, the first parameter is called -Identity, not -Name.
These changes may take up to 6 hours to come into effect.
1. In the Azure portal, for your subscription, go to the Network security group in your Teams Connector resource group.
2. Select rule 1000 RDP.
3. Change the Source IP addresses/CIDR ranges as appropriate for the management workstation / network subnet addresses you
want to allow RDP access.
4. Select Save.
5. Update the $PxMgmtSrcAddrPrefixes installation variable in your stored initialization script to match your changes applied to the
NSG to keep the script in sync with your actual deployment.
1. From within the Azure portal, go to the Teams Connector's dynamic resource group and select + Create.
2. Use the search bar to find and select Log Analytics Workspace.
3. Select Create to add the Log Analytics Workspace in your dynamic resource group.
a. Your subscription and resource group should be preselected.
b. Enter a Name, for example "pexip-teams-connector-log-analytics".
c. Select a Region.
d. Select Review + Create.
iv. As a Destination, select Azure Monitor Logs and choose your log analytics workspace. You can also send these metrics to
Azure Monitor Metrics (in preview at the time of writing).
v. Select Add data source.
vi. Add a second data source: repeat the above steps for a data source of Windows event logs.
vii. Select Review + Create, and then select Create.
7. This installs extension AzureMonitorWindowsAgent onto your VMSS instances. The agent will start sending metrics and logs to
your log analytics workspace, although this can take some time.
In the Log analytics workspace you can query the event logs or performance metrics in the General > Logs pane.
In Azure Monitor > Metrics you can view the metrics/logs of the VMSS by selecting the correct scope pointing to the resource itself. In
Metrics you can either choose "guest" or "host" metrics.
The above is only an example of monitoring configuration. If you want to persist the log analytics workspace, you could deploy it in
the static resource group and only recreate the data collection rules after each Teams Connector redeployment. Monitoring can
also be set up against an already existing log analytics workspace. You can also collect custom performance counters and custom
event logs.
Key Vault
Event Hub
VMSS
You will see resource groups with names in the following formats:
n <prefix>-TeamsBot-RG: this contains the Azure Bot.
n <prefix>-TeamsConn-<region>-RG: this contains the Teams Connector instances (Virtual Machine scale set).
n <prefix>-TeamsConn-<region>-static-RG: this includes the Azure Key Vault and the public IP address of the Teams
Connector.
If you have deployed a Teams Connector in multiple regions you will see several <prefix>-TeamsConn-... resource groups.
b. Select each resource group in turn (with the prefix of the Teams Connector you want to delete), and then select Delete
resource group and confirm with the name of the resource group.
Note that the Azure Key Vault is only soft-deleted when the static resource group is deleted. This means that if you
subsequently redeploy your Teams Connector using the same variables initialization script, you will encounter deployment
errors due to conflicts with key vault object names. To avoid this you must first purge the soft-deleted key vault:
i. Go to the Key Vaults services within Azure.
ii. Select Manage deleted vaults.
iii. Select the subscription and purge the key vault.
For information about Teams Connector status and troubleshooting failed calls, see Viewing Teams Connector instance, call and
participant status.
Installation issues
This table describes issues that might occur when running the Teams Connector installation script.
Invalid Bot data error message If the PowerShell script output reports an error stating
"InvalidBotData - Bot is not valid - Id is already in use", this
means that the name of the Azure Bot you are attempting to
create (via the Register-PexTeamsCviApplicationBot
commands) is already in use elsewhere in Azure (most likely in
another company's tenant).
Web space already exists error message If the scripts fail to create a resource group with an error
message in the style "Web space with name <name> already
exists for subscription <id>", this typically means that a
previous resource group of the same name had its contents
deleted, but the resource group itself was not deleted. When
removing resources from Azure e.g. prior to an upgrade or
redeployment, ensure that the resource group itself is deleted.
Certificate error: CNG Key Storage Provider If you see the error message "Theprivate key of certificate
'<thumbprint>' is stored in a CNG Key Storage Provider, which
is currently not supported", this means that the RSA
certificate has a private key in a CNG KSP (Cryptographic API:
Next Generation Key Storage Provider), which is not
supported. The private key must be stored in a Cryptographic
Service Provider (CSP) of the CryptoAPI.
Certificate error: ECDSA certificate If you see the error message "The certificate '<thumbprint>'
Get-AzADServicePrincipal: Insufficient privileges to complete the operation. This error occurs if a guest user in the tenant attempts to
deploy a Teams Connector, but the guest user does not have
the Directory Readers role.
Invalid addresses Ensure that any CIDR-style addresses are valid. For example, an
"MCU-signalling-endpoint has invalid Address prefix" error
would be reported if an invalid CIDR address, such as
"91.90.42.96/26", was specified for the
$PxNodesSourceAddressPrefixes variable.
Other errors reported when running the create_vmss_deployment script Many errors that are reported when you run create_vmss_
deployment.ps1 are a result of typos or formatting errors in
the variables initialization script, such as missing quotes
around an IP address. Check the error messages produced by
the script for more information about the nature of the
problem.
More Teams Connector instances than expected are seen during the Scale sets default to overprovisioning VMs. With
deployment process overprovisioning turned on, the scale set spins up more VMs
than requested, then deletes the extra VMs when the
requested number of VMs are successfully provisioned. See
https://docs.microsoft.com/en-us/azure/virtual-machine-
scale-sets/virtual-machine-scale-sets-design-
overview#overprovisioning for more information.
Connect-AzAccount WARNING: Unable to acquire token for tenant Try to Connect with: Connect-AzAccount -DeviceCode
7. Retry Connect-AzAccount
The remote server returned an error: (407) Proxy Authentication Required Set default web proxy credentials and retry the deployment:
[System.Net.WebRequest]::DefaultWebProxy.Credentials =
[System.Net.CredentialCache]::DefaultCredentials
Module being installed is not catalog signed This can happen when you run the Install-Module command if
you have downgraded a package that was signed in the newer
version.
WARNING: The names of some imported commands from the module These warnings may appear and can be safely ignored.
'Microsoft.Azure.PowerShell.Cmdlets.Network' include unapproved verbs
that might make them less discoverable.
and
or a warning:
WARNING: Unable to acquire token for tenant {tenantId} with error 'You
must use multi-factor authentication to access tenant {tenantId}, please
rerun 'Connect-AzAccount' with additional parameter '-TenantId
{tenantId}'.'
Errors like: These occur if you are using Microsoft.Graph module version
Get-MgApplication : Method not found: 'Void 2.0.0. (See https://github.com/microsoftgraph/msgraph-sdk-
Microsoft.Graph.Authentication.AzureIdentityAccessTokenProvider...'. powershell/issues/2148 for more information.)
At line:1 char:1
+ Get-MgApplication
You should uninstall version 2.0.0 and install version 2.2.0
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-MgApplication_List], instead.
MissingMethodException
+ FullyQualifiedErrorId :
Microsoft.Graph.PowerShell.Cmdlets.GetMgApplication_List
or
WARNING: Unable to acquire token for tenant 'organizations' with error
'Method not found:
'System.Threading.Tasks.Task`1<Azure.Identity.AuthenticationRecord>...'
Connect-AzAccount : Method not found:
'System.Threading.Tasks.Task`1<Azure.Identity...'.
At line:1 char:1
+ Connect-AzAccount
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [Connect-AzAccount],
MissingMethodException
+ FullyQualifiedErrorId :
Microsoft.Azure.Commands.Profile.ConnectAzureRmAccountCommand
Intermittent call failures: no unusual The user is entering the wrong conference ID. Ensure that the correct 9 to 12-digit conference
failures or error codes are in the logs. ID is being entered.
Persistent call failures: no unusual There is no Teams Connector configured Ensure that a Teams Connector is configured
failures or error codes are in the logs. against the Virtual Reception or the Virtual against the Virtual Reception or the Lookup
Reception's Lookup location, or the location, and that the Conferencing Nodes in
Conferencing Node cannot reach the that location can reach the nominated Teams
nominated Teams Connector. Connector.
Support log entries report "Teams API There is a problem with the certificate on Ensure that the Teams Connector and the
request failed" and Error="401". either the Teams Connector or the Conferencing Nodes have a valid certificate
Conferencing Node, for example it may have that is signed by an external trusted CA. See
expired, been revoked, or the certificate Network and certificate requirements for
subject names may not match against expected information about certificate subject name
values. requirements.
The Conferencing Node is communicating with Ensure that the Virtual Reception is nominating
the wrong Teams Connector (if, for example, the appropriate Outgoing location (and thus
you have other Teams Connectors configured Conferencing Nodes) for the associated Teams
in different regions, or a lab system etc). Connector (i.e. the nodes that were referenced
in the $PxNodeFqdns variable in the
initialization script for that Teams Connector).
Support log entries report "Teams API The wrong Azure tenant ID is configured in Check the Azure tenant ID configured in Pexip
request failed" and Error="500". Pexip Infinity. Infinity (Call Control > Microsoft Teams
Tenants) and which tenant ID is associated with
the Teams Connector (Call Control > Microsoft
Teams Connectors).
CVI caller gets an invalid conference ID The meeting may have expired. This can The CVI caller cannot join that meeting.
message when trying to join a scheduled happen if the meeting invitation was created a
The only option is to create a new scheduled or
meeting, but Teams clients can connect long time ago (typically more than 60 days
instant meeting.
to the meeting. ago). In this scenario, when the Teams user
clicks on their meeting link, Teams
automatically creates a new meeting with a
new conference ID, and it appears as though
they have joined the original meeting. The CVI
caller cannot join as they do not have the new
conference ID.
See https://docs.microsoft.com/en-
us/microsoftteams/limits-specifications-
teams#meeting-expiration for more
information.
Support log entries report "Failed to You are using an invald conference ID. Ensure you are using the correct conference ID.
create call leg: Failed to resolve VTC
short key".
Intermittent failures: disconnect reason The dialed alias includes the wrong conference Ensure that the dialed alias contains the correct
is "Gateway dial out failed" or "Call ID (direct dialing). 9 to 12-digit conference ID.
rejected".
The Teams Connector was at maximum Consider increasing the number of instances in
capacity and thus unable to take the call. your Teams Connector (see Changing the call
capacity of a Teams Connector).
Persistent failures: disconnect reason is The Call Routing Rule has an incorrect regex Ensure that the Call Routing Rule regex replace
"Gateway dial out failed" or "Call replace string. string is extracting only the 9 to 12-digit
rejected". conference ID.
The wrong tenant ID is configured in Pexip Check the Azure tenant ID configured in Pexip
Infinity. Infinity (Call Control > Microsoft Teams
Tenants) and which tenant ID is associated with
the Teams Connector (Call Control > Microsoft
Teams Connectors).
Disconnect reason is "Gateway dial out There is a problem with the certificate on Ensure that the Teams Connector and the
failed" and the support log entries for either the Teams Connector or the Conferencing Nodes have a valid certificate
the associated Call-id reports "Teams Conferencing Node, for example it may have that is signed by an external trusted CA. See
API request failed" and Error="401". expired, been revoked, or the certificate Network and certificate requirements for
subject names may not match against expected information about certificate subject name
values. requirements.
The Conferencing Node is communicating with Ensure that the Call Routing Rules that are
the wrong Teams Connector (if, for example, handling the calls are nominating the
you have other Teams Connectors configured appropriate Outgoing location (and thus
in different regions, or a lab system etc). Conferencing Nodes) for the associated Teams
Connector (i.e. the nodes that were referenced
in the $PxNodeFqdns variable in the
initialization script for that Teams Connector).
You get this audio message: "You can’t Port 4277 is blocked from the Teams Connector Allow port 4277. See Enabling a Microsoft
talk to the bot just yet, but we’re to the Conferencing Node. Teams Room to call a VTC endpoint or VMR for
working on it" when calling from a more information.
Teams Room.
Calls are disconnected from a This can occur if the Adaptive Composition This can be mitigated by assigning more RAM
conference and "Running conference layout is in use and there is a large number of to your Conferencing Node processor cores.
has been forcibly terminated due to active participants.
MCU shutdown" messages are in the
Pexip Infinity administrator log.
Azure SAS URL Paste in here the Blob SAS URL from the Azure portal and select Fetch dates.
Select a file to upload Ignore this button when uploading the Azure logs.
Select a file to upload Select Choose file and select the diagnostic snapshot file you downloaded from the Management
Node.
Note that if you have deployed the Teams Connector several times, old app registrations will also show — even if you have deleted
the Azure Bot resource group. If required, you can delete these old registrations.
4. To check if consent has been granted in your Tenant, select the CVI app registration from the list (the one named
"<prefix>TeamsConn").
If it shows Create Service Principal (as shown below) then consent has not been granted in your own Microsoft Entra ID. (Note
that this is expected if Teams is in a different Entra ID from your Azure Bot, however in most enterprises it will be in the same
Entra ID.)
If consent has been granted in your tenant, the registration will show a reference to the enterprise app ("pexipTeamsConn" in the
example below).
1. From the Azure portal go to Azure Active Directory > Enterprise Applications.
2. Search for the prefix you used when deploying your Teams Connector.
In the example screenshot below there are currently no apps where consent has been granted:
If the app has had consent granted, you will see the app as shown below (your app name will be different):
3. If your Teams Connector CVI app is not shown, you must provide consent to it as described in Authorize Pexip CVI applications.
Your app will then appear in the list of enterprise applications as shown in the second example screenshot above.
Also when you view the app via Azure Active Directory > App Registrations, each registration will show a reference to the
enterprise app.
Outgoing denial-of-service:
Azure Security Center detected unusual network activity originating from the virtual machine providers <component list>. An
unusually large number of connections were made from this machine. This anomalous activity may indicate that your virtual machine
was compromised and is now engaged in denial-of-service (DoS) attacks against external endpoints.
This occurs when Azure detects the media traffic from your Teams Connector as potential UDP flooding. These messages can be safely
ignored as the Teams Connector is behaving correctly, and Azure has not blocked your media connection.
Azure is developing an "Alert suppression" feature that in the future will allow you to disable these alerts for your subscription.