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.

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
HybridOnlineDisabledUserNeedsProvisioning
DirSyncSfBUserNeedsProvisioning

Die Replikation von Änderungen aus dem Teams-Forest in das BVD ist noch nicht erfolgt.

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.

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

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.

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.

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