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
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
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.
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
$AfterHoursSheduleCallHandlingAssociation = New-CsAutoAttendantCallHandlingAssociation -Type AfterHours -ScheduleId $AfterHoursShedule.Id -CallFlowId $afterHoursCallFlow.Id
Die TimeZones kann man sich mit folgendem Befehl anzeigen
#TimeZone
Get-CsAutoAttendantSupportedTimeZone
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