Create Teams Auto Attendant and Call Queue with Powershell

Hallo zusammen,

Vor zwei Wochen habe ich einen Blog Artikel über Teams Auto Attendnant und Call Queue geschrieben.

Seither habe ich nebenbei daran gearbeitet, das ganze auch per PowerShell anzulegen. Ich bin ja ein grosser Fan von PowerShell und Automatisierung.

Erstmal muss man sich mit dem Teams Modul mit Skype for Business Online verbinden

######################################################################

# Connect to SkypeForBusiness Online (Teams Module)

######################################################################

Import-Module MicrosoftTeams

$sfbSession = New-CsOnlineSession -OverrideAdminDomain icewolfch.onmicrosoft.com

Import-PSSession $sfbSession

Resource Accounts

Es müssen Resource Accounts für den Autoattendant und Call Queue angelegt

######################################################################

# Create Resource Account

######################################################################

#ApplicationID

#Auto Attendant: ce933385-9390-45d1-9512-c8d228074e07

#Call Queue: 11cd3e2e-fccb-42ad-ad00-878b93575e07

 

New-CsOnlineApplicationInstance

https://docs.microsoft.com/en-us/powershell/module/skype/new-csonlineapplicationinstance?view=skype-ps

 

New-CsOnlineApplicationInstance -UserPrincipalName CallQueueDemo02@icewolf.ch -DisplayName "CallQueueDemo02" -ApplicationId "11cd3e2e-fccb-42ad-ad00-878b93575e07"

 

New-CsOnlineApplicationInstance -UserPrincipalName AutoattendantDemo02@icewolf.ch -DisplayName "AutoattendantDemo02@icewolf.ch" -ApplicationId "ce933385-9390-45d1-9512-c8d228074e07"

Um den Resource Accounts Lizenzen zuzuweisen, benötigt man das AzureADPreview Module

######################################################################

# Connect AzureAD

######################################################################

Import-Module AzureADPreview

Connect-AzureAD

Als erstes muss beim Account die Location gesetzt werden

######################################################################
# Assign PhoneSystem Virtual Licence and Location
######################################################################
Configure Microsoft 365 user account properties with PowerShell
 
$User = Get-AzureADUser -ObjectId "CallQueueDemo02@icewolf.ch" 
$User | Set-AzureADUser -UsageLocation "CH"

Mit dem folgenden Befehl, kann man sich die vorhandenen Lizenzen im Tenant anzeigen lassen

Get-AzureADSubscribedSku

Nun können den zwei Resource Accounts die "Phone System Virtual User" Lizenz zugewiesen werden.

Set-AzureADUserLicense
 
$User = Get-AzureADUser -ObjectId "CallQueueDemo02@icewolf.ch" 
$License = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$License.SkuId = "440eaaa8-b3e0-484b-a8be-62870b9ba70a"
$LicensesToAssign = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$LicensesToAssign.AddLicenses = $License
Set-AzureADUserLicense -ObjectId $User.ObjectId -AssignedLicenses $LicensesToAssign
 
$User = Get-AzureADUser -ObjectId "AutoAttendantDemo02@icewolf.ch" 
$User | Set-AzureADUser -UsageLocation "CH"
 
$User = Get-AzureADUser -ObjectId "AutoAttendantDemo02@icewolf.ch" 
$License = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$License.SkuId = "440eaaa8-b3e0-484b-a8be-62870b9ba70a"
$LicensesToAssign = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$LicensesToAssign.AddLicenses = $License
Set-AzureADUserLicense -ObjectId $User.ObjectId -AssignedLicenses $LicensesToAssign

Nun kann man den ResourceAccounts noch die Telefonnummer zuweisen. Dauert manchmal eine Weile, bis die Lizenz gezogen hat.

######################################################################

# Assign Number to Resource Account

######################################################################

Set-CsOnlineApplicationInstance -Identity AutoAttendantDemo02@icewolf.ch -OnpremPhoneNumber +41215553973

Set-CsOnlineApplicationInstance -Identity CallQueueDemo02@icewolf.ch -OnpremPhoneNumber +41215553974

Es gibt jetzt vier Resource Accounts

Get-CsOnlineApplicationInstance

Audio Upload

Für den Upload von Audio Files gibt es zwei Befehle.

  • New-CsOnlineAudioFile
  • Import-CsOnlineAudioFile

Wie es scheint, funktioniert nur der Import-CsOnlineAudioFile, denn nur dort erhält man eine ID zurück.

New-CsOnlineAudioFile

https://docs.microsoft.com/en-us/powershell/module/skype/new-CsOnlineAudioFile?view=skype-ps

 

#Upload Audio File New-CsOnlineAudioFile

$content = Get-Content "E:\Temp\CallQueueDemo02.mp3" -Encoding byte -ReadCount 0

$audioFile = New-CsOnlineAudioFile -FileName "CallQueueDemo02.mp3" -Content $content -Tenant "46bbad84-29f0-4e03-8d34-f6841a5071ad"

$audioFile

Im GUI kann man Files bis 5MB hochladen. In PowerShell sind das anscheinend nur 850 KB

Import-CsOnlineAudioFile

https://docs.microsoft.com/en-us/powershell/module/skype/import-csonlineaudiofile?view=skype-ps

#Per Powershell 850KB

 

#Upload Audio File Import-CsOnlineAudioFile

$content = Get-Content "E:\Temp\CallQueueDemo02.mp3" -Encoding byte -ReadCount 0

$audioFile = Import-CsOnlineAudioFile -ApplicationId "HuntGroup" -FileName "CallQueueDemo02.mp3" -Content $content

$audioFile

Call Queue

Nun kann der CallQueue angelegt werden 

New-CsCallQueue

https://docs.microsoft.com/en-us/powershell/module/skype/new-CsCallQueue?view=skype-ps

New-CsCallQueue -Name "CallQueueDemo02" -LanguageId "de-DE" -UseDefaultMusicOnHold $true -RoutingMethod Attendant -Users @("6db8cdd5-8e93-462d-9907-994406c07f60") -AllowOptOut $true -AgentAlertTime 30 -OverflowThreshold 50 -OverflowAction DisconnectWithBusy -TimeoutThreshold 1200 -TimeoutAction Disconnect

 

Oder hier noch eine andere Variante

 

New-CsCallQueue -Name "CallQueueDemo02" -LanguageId "de-DE" -WelcomeMusicAudioFileId $audioFile.ID -UseDefaultMusicOnHold $true -RoutingMethod Attendant -Users @("6db8cdd5-8e93-462d-9907-994406c07f60") -AllowOptOut $true -AgentAlertTime 30 -OverflowThreshold 50 -OverflowAction DisconnectWithBusy -TimeoutThreshold 1200 -TimeoutAction Disconnect

Nun muss dem Call Queue noch der Resource Account zugewiesen werden

Das geht mit folgenden Befehlen

######################################################################

#Assign ResourceAccount to Callqueue

######################################################################

#get application id and call queue id

$applicationInstanceId = (Get-CsOnlineUser "CallQueueDemo02@icewolf.ch")[-1].ObjectId

$callQueueId = (Get-CsCallQueue -NameFilter "CallQueueDemo02").Identity

 

#make the connection

New-CsOnlineApplicationInstanceAssociation -Identities @($applicationInstanceId) -ConfigurationId $callQueueId -ConfigurationType CallQueue

Wie man sieht hat das geklappt

Auto Attendant

Der Callflow per PowerShell anzulegen, war recht einfach. Der Auto Attendant ist da um einiges komplexer. Ich muss zugeben, dass ich hier einige Stunden an den korrekten Befehlen gebrütet habe.

Es braucht zwei CallFlows (BusinessHours / AfterHours) mit Ansagen oder AudioFiles.

#Upload Audio File Import-CsOnlineAudioFile

$content = Get-Content "E:\Temp\AutoAttendantDemo02.mp3" -Encoding byte -ReadCount 0

$GreetingAudioFile = Import-CsOnlineAudioFile -ApplicationId "HuntGroup" -FileName "AutoAttendantDemo02.mp3" -Content $content

$GreetingAudioFile

Hier wird der Default Call Flow angelegt

######################################################################

#Default Call Flow

######################################################################

New-CsAutoAttendantCallFlow

https://docs.microsoft.com/en-us/powershell/module/skype/new-csautoattendantcallflow?view=skype-ps

 

$callableEntityId = (Find-CsOnlineApplicationInstance -SearchQuery "CallQueueDemo02") | Select-Object -Property Id

$CallTarget= New-CsAutoAttendantCallableEntity -Identity $callableEntityId.id -Type ApplicationEndpoint

$menuOption = New-CsAutoAttendantMenuOption -Action TransferCallToTarget -DtmfResponse Automatic -CallTarget $CallTarget

 

$AAMenu = New-CsAutoAttendantMenu -Name "Default Menu" -MenuOptions @($menuOption) -DirectorySearchMethod None

 

$WelcomePrompt = New-CsAutoAttendantPrompt -AudioFilePrompt $GreetingAudioFile

$DefaultCallFlow = New-CsAutoAttendantCallFlow -Name "AutoAttendantDemo02 Default call flow" -Menu $AAMenu -Greetings @($WelcomePrompt)

Nun braucht es einen Zeitplan für die Office Hours, bzw. wann einen Zeitplan für die AfterHours

######################################################################

#After Hours Call Flow

######################################################################

 

#TimeRange

New-CsOnlineTimeRange

https://docs.microsoft.com/en-us/powershell/module/skype/new-csonlinetimerange?view=skype-ps

 

$trMorning = New-CsOnlineTimeRange -Start 08:00 -End 12:00

$trAfternoon = New-CsOnlineTimeRange -Start 13:00 -End 17:00

 

#Business Hours

New-CsOnlineSchedule

https://docs.microsoft.com/en-us/powershell/module/skype/new-csonlineschedule?view=skype-ps

 

$AfterHoursShedule = New-CsOnlineSchedule -Name "BusinessHours" -WeeklyRecurrentSchedule -MondayHours @($trMorning,$trAfternoon) -TuesdayHours @($trMorning,$trAfternoon) -WednesdayHours @($trMorning,$trAfternoon) -ThursdayHours @($trMorning,$trAfternoon) -FridayHours @($trMorning,$trAfternoon) -Complement

Nun lade ich das AudioFile für die Ansage ausserhalb der Bürozeiten hoch

#Upload Audio File Import-CsOnlineAudioFile

$content = Get-Content "E:\Temp\AutoAttendantDemo02OOF.mp3" -Encoding byte -ReadCount 0

$GreetingAudioFileOOF = Import-CsOnlineAudioFile -ApplicationId "HuntGroup" -FileName "AutoAttendantDemo02OOF.mp3" -Content $content

$GreetingAudioFileOOF

$OOFPrompt = New-CsAutoAttendantPrompt -AudioFilePrompt $GreetingAudioFileOOF

Nun wird der AfterHoursCall Flow zusammengebastelt

#Menu

$menuOption = New-CsAutoAttendantMenuOption -Action DisconnectCall -DtmfResponse Automatic

$afterHoursMenu = New-CsAutoAttendantMenu -Name "After Hours Call Flow" -MenuOptions @($menuOption) -DirectorySearchMethod None

 

$afterHoursCallFlow = New-CsAutoAttendantCallFlow -Name "AutoAttendantDemo02 After hours call flow" -Menu $afterHoursMenu -Greetings @($OOFPrompt)

 

#CallHandlingAssociation

New-CsAutoAttendantCallHandlingAssociation

https://docs.microsoft.com/en-us/powershell/module/skype/new-csautoattendantcallhandlingassociation?view=skype-ps

 

$AfterHoursSheduleCallHandlingAssociation = New-CsAutoAttendantCallHandlingAssociation -Type AfterHours -ScheduleId $AfterHoursShedule.Id -CallFlowId $afterHoursCallFlow.Id

Die TimeZones kann man sich mit folgendem Befehl anzeigen

#TimeZone

Get-CsAutoAttendantSupportedTimeZone

https://docs.microsoft.com/en-us/powershell/module/skype/get-csautoattendantsupportedtimezone?view=skype-ps

Nun sind alle benötigten Objekte erstellt und ich kann den eigentlichen AutoAttendant anlegen

#Auto Attendant

New-CsAutoAttendant

https://docs.microsoft.com/en-us/powershell/module/skype/new-csautoattendant?view=skype-ps

 

$aaName = "AutoAttendantDemo02"

$language = "de-DE"

$TimeZone = "W. Europe Standard Time"

$CallQueueId = (Get-CsOnlineUser -Identity "CallQueueDemo02@icewolf.ch").ObjectId

 

New-CsAutoAttendant -Name $aaName -LanguageId $language -CallFlows @($afterHoursCallFlow) -TimeZoneId $TimeZone -DefaultCallFlow $DefaultCallFlow -CallHandlingAssociations @($AfterHoursSheduleCallHandlingAssociation)

Nun muss der ResourceAccount mit dem Auto Attendant verknüpft werden

######################################################################

#Assign ResourceAccount to AutoAttendant

######################################################################

#get application id and call queue id

$applicationInstanceId = (Get-CsOnlineUser "AutoAttendantDemo02@icewolf.ch")[-1].ObjectId

$AutoAttendantID = (Get-CsAutoAttendant -NameFilter "AutoAttendantDemo02").Identity

 

#make the connection

New-CsOnlineApplicationInstanceAssociation -Identities @($applicationInstanceId) -ConfigurationId $AutoAttendantID -ConfigurationType AutoAttendant

Mit dem folgenden Befehl werden die Auto Attendants angezeigt

# Show Auto Attendant

Get-CsAutoAttendant

Und das hier wurde mit dem Code angelegt

Grüsse
Andres Bohren