BVD - Business Voice Directory
Auf verschiedenen Folien von Microsoft taucht im Zusammenhang mit Teams Telefonie auch die Abkürzung BVD auf. Dahinter verbirgt sich das "Business Voice Directory". Ich versuche etwas Licht in das System zu bringen, mit dem SfBOnline und Teams anscheinend Eingehende Anrufe auf eine "Nummer" zu einem Ziel zuordnen. Der Name "Business Voice Directory" wird von Microsoft selbst sehr selten genutzt aber einige Fundstellen gibt es schon, z.B.
Use the Get-CsOnlineDirectoryTenant cmdlet
to retrieve a tenant and associated
parameters from the Business Voice
Directory.
Quelle: Get-CsOnlineDirectoryTenant
https://docs.microsoft.com/en-us/powershell/module/skype/get-csonlinedirectorytenant?view=skype-ps
Daher verwende ich den Begriff einfach mal weiter.
Zum Verständnis der Seite kann auch die Seite Azure AD - Ein Verzeichnisdienst, oder zwei oder mehr helfen.
Aufgabe: Voice-Routing u.a.
Bei der Telefonie muss es schnell gehen. Das war schon bei Skype for Business so und daher gab es schon On-Premises einen User Replicator, die Daten aus dem "langsamen" Active Directory in die SQL-Datenbank der Lync/Skype Server übertragen hat. Eine Suche nach einer Rufnummer geht lokal einfach schneller als von einem Domain Controller abhängig zu sein.
In der Cloud sind die Anforderungen noch deutlich höher, denn hier sind viel mehr Anrufe pro Zeiteinheit zu erwarten. Sowohl über die Microsoft Dialpläne als auch über Direct Routing kommen sehr viele SIP-Anfragen sehr schnell bei der Plattform an und Teams muss sehr schnell entscheiden, wie mit dem Anruf zu verfahren ist. Dies dürfte nicht nur Anwender sondern jeden Endpunkt mit einer Rufnummer betreffen. Ich denke hier an:
- Verschiedenen Konfigurationen
Direct Routing, DialPlan, Hybrid, etc. - Call Routing
Endpunkte, Rufweiterleitungen, BusyOnBusy, Stellvertreter, VoiceMail - Konferenzen
Auch die Einwahl in eine Audio-Konferenz wird über dieses System gesteuert, so dass die Audio-Daten bei der zugewiesenen MCU auflaufen. - Emergency Calling
Bei Notrufen kommt dem BVD die Rolle zu, temporär für diese Client alle Rufumleitungen abzuschalten, damit ein Rückruf der Einsatzzentrale ankommen kann. - RNL - Reverse Number Resolution
Das BVD dient weiterhin zu einer Nummer einen Namen zu finden
Das ganze System muss weltweit verfügbar sein und da klar ist, dass Skype for Business Online und Teams nicht auf Dauer parallel betrieben werden würde, musste für das Voice-Routing eine neue Plattform her.
Replikation und Quelle
Welches System Microsoft hier im Hintergrund genau wie aufgebaut hat, ist nicht öffentlich. Es ist aber klar, dass nur die Teilnehmer per Telefon erreicht werden können, deren Rufnummer in der Routing-Plattform bekannt sind. Dazu müssen wir also wissen, wie und welche Rufnummern dort landen. Eine Aussage ist dazu besonders hervorzuheben:
Nur für Objekte mit einer Phone System Lizenz landet die LineURI in BVD.
Das bedeutet aber auch, dass alle Benutzer eine entsprechende Phone-Lizenz haben müssen. Früher mussten sogar für Telefone und Call Queues entsprechende Lizenzen gesondert gekauft und über Ressource-Konten zugewiesen werden.
Nun gibt es natürlich auch mehrere Felder, die einen Telefonnummer enthalten können. In Verbindung mit ADSync und Hybrid Mode werden einige Basisdaten eines Benutzers im lokalen Active Directory gepflegt und in das Azure AD repliziert. Aber auch in der Cloud gibt es nicht nur einen Forest sondern Ein Verzeichnisdienst, oder zwei oder mehr. Microsoft pflegt für Teams wie auch für Exchange und andere Produkte unterschiedliche Verzeichnisdienste. Sie können sich ja mal den Inhalt des Felds "DistinguishedName" bei Get-MSOLUser, Get-AzureADObject, Get-CSOnlineUser und anderen Commandlets anschauen.
Ich habe hier einfach mal zu einem Benutzer alles mit "*Phone*" und "*LineURI*" ausgeben lassen. Sie sehen einige Rufnummern.
PS C:\> get-csonlineuser user1@uclabor.de | fl *phone*,*lineuri*,interpr*,voicepolicy HomePhone : +49(5257)9xxxxx IPPhone : MobilePhone : +49 (160)9xxxxxx OtherTelephone : {} Phone : +49 5251 304 xxx IPPBXSoftPhoneRoutingEnabled : False TeamsIPPhonePolicy : IPPhonePolicy : OnPremLineURI : tel:+495251304613 OnPremLineURIManuallySet : True LineURI : tel:+495251304613 InterpretedUserType : HybridOnlineSfBUser VoicePolicy : HybridVoice
Für die Skype for Business Online und Teams-Welt ist aber nur das Feld "LineURI" von Bedeutung. nur dieses Feld wird in das BVD für die Zustellung von Anrufen genutzt. Womit sich aber die Frage stellt, welche Datentopf hier nun "autoritativ ist. Ausschlaggebend ist hier die Voice Policy:
Voice Policy | Phone System Lizenz | Auswirkung |
---|---|---|
Business Voice |
Zugewiesen |
Diese Benutzer bekommt seine Rufnummern von Microsoft und daher ist die Konfiguration der Microsoft Dialplänen und dessen Rufnummernzuweisung maßgeblich. Einträge von On-Premises werden ignoriert |
HybridVoice |
Zugewiesen |
Diese Anwender bekommen Rufnummern durch Direct Routing. Die Rufnummer wird aus dem Feld "OnPremLineURI" gezogen. |
Business Voice |
Nicht zugewiesen |
Telefonnummer wird ignoriert. Keine Funktion |
HybridVoice |
Nicht zugewiesen |
Telefonnummer wird ignoriert. Keine Funktion |
Ein weiteres Feld in dem Zuge ist OnPremLineURIManuallySet und dessen Bedeutung
OnPremLineURIManuallySet | Bedeutung |
---|---|
False (Default) |
Das Feld "LineURI" in AzureAD und SfBAD werden durch das lokale AD und mit ADSync auch im AzureAD und SfB-AD verwaltet. |
True |
Sie haben als Administrator den Wert "LineURI" manuell per SfBOnline-PowerShell gesetzt und den Sync aus dem AzureAD und damit auch dem lokalen AD ausgesetzt. |
Vielleicht haben Sie in der Ausgabe auch das Feld InterpretedUserType gesehen. Dies ist ein guter Indikator, ob die Änderungen schon in das BVD übertragen wurden
Inhalt "InterpretedUserType" | Bedeutung |
---|---|
HybridOnlineSfBUser |
Die Rufnummer des Benutzers wurde in das BVD übertragen und kann genutzt werden |
HybridOnlineSfBUserNeedsProvisioning |
Die Replikation von Änderungen aus dem Teams-Forest in das BVD ist noch nicht erfolgt. |
Eine umfangreichere Erklärung zum Feld finden Sie auf der gesonderten Seite InterpretedUserType.
Bei einer Umgebung mit Skype for Business Hybrid stellt sich das dann wie folgt dar:
Das Bild ist schier noch nicht vollständig. Übrigens gibt es pro Benutzer auch einen Zeitstempel, wann das Objekt das letzte mal synchronisiert und dann ans BVD weiter repliziert wurde:
PS C:\> (Get-CsOnlineUser -Identity msxfaqdevu1@msxfaq.net) | fl *time* LastSyncTimeStamp : 14.01.2023 23:33:31 SoftDeletionTimestamp : LastProvisionTimeStamps : {[UserAuthoredProps, 2023-01-14T23:33:12.2502096+00:00]} LastPublishTimeStamps : {[ProvisionedPlanPublishAuthoredProps, 2023-01-12T21:13:42.7979022+00:00], [UpdateBvdUserProcessor, 2023-01-14T23:33:13.5332678+00:00], [UserEventDistributionProcessor, 2023-01-14T23:33:12.6408622+00:00], [PublishUserCloudAttributesProcessor, 2023-01-14T23:33:13.9446296+00:00]...} PS C:\> (Get-CsOnlineUser -Identity msxfaqdevu1@msxfaq.net).LastPublishTimeStamps Key Value --- ----- ProvisionedPlanPublishAuthoredProps 2023-01-12T21:13:42.7979022+00:00 UpdateBvdUserProcessor 2023-01-14T23:33:13.5332678+00:00 UserEventDistributionProcessor 2023-01-14T23:33:12.6408622+00:00 PublishUserCloudAttributesProcessor 2023-01-14T23:33:13.9446296+00:00 PublishProvisionedPlanProcessor 2023-01-12T21:13:42.9854166+00:00
Der Wert für "UpdateBvdUserProcessor" zeigt an, wann lokale Änderungen das letzte Mal ans BVD gesendet wurden.
Aktuell kann ich es weder bestätigen noch dementieren, ob meine Rufnummern aus meinen Outlook Kontakten und AzureAD-Kontakte für die RNL Funktion (Reverse Number Lookup) auch ins BVD repliziert werden. Ich könnte es mir aber vorstellen, weil nur so auch Namen angezeigt werden, wenn der Client keine Verbindung zu Outlook o.ä. hat.
- Set-CsOnlineVoiceUser
https://docs.microsoft.com/en-us/powershell/module/skype/Set-CsOnlineVoiceUser?redirectedfrom=MSDN&view=skype-ps
Erlaubt das Setzen einer Rufnummer beim Benutzer
BVD auslesen
Wenn Microsoft aber in einem gesonderten Verzeichnis die Rufnummern des Tenant verwaltet, dann möchte ich zumindest diese Information lesen können. Laut Dokumentation gibt es sogar ein Commandlet dazu, welches die Rufnummern anzeigt. Bei mir ist aber das Feld "Numbers" nicht vorhanden.
PS C:\> Get-CsOnlineDirectoryTenant | fl * PSComputerName : admin2a.online.lync.com PSShowComputerName : False Id : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx AnnouncementsDisabled : False NameRecordingDisabled : False ServiceNumberCount : 3 SubscriberNumberCount : 21 DefaultPoolFqdn : DefaultBridge : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Bridges : {Id = [xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx], Name = [Conference Bridge], DefaultServiceNumber = [], IsDefaultBridge = [True], IsShared = [False], Region = [NOAM]} Domains : {} Pools : {sippoolblu2a05.infra.lync.com} TnmAccountId : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
- Get-CsOnlineDirectoryTenant
https://docs.microsoft.com/en-us/powershell/module/skype/get-csonlinedirectorytenant?view=skype-ps
Use the Get-CsOnlineDirectoryTenant cmdlet to retrieve a tenant and associated parameters from the Business Voice Directory.
Aber mittlerweile gibt es ein zweites Commandlet "Get-CsOnlineTelephoneNumber", welches die Daten liefert.
Get-CsOnlineTelephoneNumber ist mittlerweile "Depreciated". Nutzen Sie besser Get-CsPhoneNumberAssignment. Siehe auch Teams Rufnummern
Jeder Datensatz hat folgende Properties:
PS C:\> Get-CsOnlineTelephoneNumber RunspaceId : eb6f1570-9888-4015-b3a6-a1b2337ab227 ActivationState : Activated BridgeNumber : CallingProfile : 892ab3c9-05eb-45db-a32d-52d32f3b5601 CityCode : EMEA-DE-ALL-NW_HLHOF FriendlyName : Id : 495257xxxxxxx InventoryType : Subscriber Location : O365Region : NOAM SourceType : Tnm TargetType : user Tenant : TenantId : UserId : IsManagedByServiceDesk : True PortInOrderStatus :
Eine Ausgabe als Tabelle macht natürlich mehr Sinn.
PS C:\> Get-CsOnlineTelephoneNumber | ft id,inventorttype,sourcetype,targettype,o365region,citycode,Activationstate Id inventorttype SourceType TargetType O365Region CityCode ActivationState -- ------------- ---------- ---------- ---------- -------- --------------- 1425xxxxxxx Tnm user NOAM NOAM-US-WA-SE Activated 1425xxxxxxx Tnm user NOAM NOAM-US-WA-SE Activated 1425xxxxxxx Tnm NOAM NOAM-US-WA-SE Activated 1425xxxxxxx Tnm NOAM NOAM-US-WA-SE Activated 1832xxxxxxx Tnm caa NOAM NOAM-US-TX-HO Activated 3317xxxxxxx Tnm user NOAM EMEA-FR-ALL-75_PA AssignmentFailed 3336xxxxxxx Tnm ucap NOAM EMEA-FR-ALL-AGM_ST Activated 3336xxxxxxx Tnm ucap NOAM EMEA-FR-ALL-AGM_ST Activated 495257xxxxxxx Tnm NOAM EMEA-DE-ALL-NW_HLHOF Activated 495257xxxxxxx Tnm user NOAM EMEA-DE-ALL-NW_HLHOF Activated 495257xxxxxxx Tnm NOAM EMEA-DE-ALL-NW_HLHOF Activated 495257xxxxxxx Tnm user NOAM EMEA-DE-ALL-NW_HLHOF Activated 495257xxxxxxx Tnm user NOAM EMEA-DE-ALL-NW_HLHOF Activated
Ich habe die Rufnummern hier natürlich unkenntlich gemacht. Sie sehen aber, dass die Nummer im E-164-Format ohne führendes "+" gespeichert sind. Hierbei handelt es sich durchgängig um "Microsoft Calling Plan" Nummern und der City-Code dürfte den Gateway-Standort beschreiben. Sie sehen auch die Region des Tenant und dass eine Nummer nicht zugewiesen werden konnte.
Allerdings kann ich über den Weg nicht
erkennen, welche Direct Routing-Rufnummern zugewiesen sind.
Vielleicht gibt es irgendwann doch auch mal einen Weg das
BVD eines Tenant komplett zu lesen.
- Get-CsOnlineTelephoneNumber
https://docs.microsoft.com/en-us/powershell/module/skype/get-csonlinetelephonenumber?view=skype-ps
Inkonsistenzen
Die Funktion des BVD ist nur so gut wie enthaltenen Daten. Sie können als Admin aber die Daten im BVD nicht selbst pflegen, sondern ein Prozess in der Cloud überträgt die Daten. Und nicht jeder Prozess ist fehlerfrei.
Wir haben das Problem, dass wir eine
Nummer von einer Applikation auf einen Benutzer umziehen
wollen und Teams immer 404 meldet. Das erste Mal ist dies durch
eine Doppelzuweisung Applikation User aufgetreten. Das wird wohl
nicht geprüft. Der Fehler liegt im Sync des BVD und wurde
über ein MSTicket manuell korrigiert.
Quelle: Teams Chat
Es gibt natürlich keine öffentliche Liste der bekannten Bug. Manchmal braucht es dann eine Support-Ticket, um solche Fehler zu finden und lösen zu lassen.
- How to: Assign a Direct Routing Number
to an Auto Attendant or Call Queue in
Microsoft Teams Phone System
https://ucstatus.com/2019/05/14/how-to-assign-a-direct-routing-number-to-an-auto-attendant-or-call-queue-in-microsoft-teams-phone-system/
Offen
In dem BVD hinterlegt Microsoft nicht nur die Rufnummern sondern auch, wie mit Anrufen verfahren werden soll. So gibt es im Bereich "Emergency-Calling" die Funktion, dass nach einem ausgehenden Ruf zu einer Notrufzentrale alle eingehenden Anrufe auch immer durchgestellt werden. Alle Umleitungen, Weiterleitungen oder DND-Einstellungen werden temporär für 2 Stunden außer Kraft gesetzt. Diese und andere Einstellungen konnte ich noch nicht finden.
Auch gibt es kein Gegenstück in Form von Set-CsOnlineTelephoneNumber um z.B. eine Weiterleitung einzutragen, wie dies mit SEFAUtil bei Skype for Business möglich war.
Weitere Links
- User Replicator
- SEFAUtil
- InterpretedUserType
- Teams Rufnummern
- Get-CsOnlineDirectoryTenant
https://docs.microsoft.com/en-us/powershell/module/skype/get-csonlinedirectorytenant?view=skype-ps
Use the Get-CsOnlineDirectoryTenant cmdlet to retrieve a tenant and associated parameters from the Business Voice Directory. - Get-CsOnlineTelephoneNumber
https://docs.microsoft.com/en-us/powershell/module/skype/get-csonlinetelephonenumber?view=skype-ps