Lync Adressbuch

ähnlich zu Outlook nutzt auch ein Lync Client ein "Adressbuch". Sicher kann der Communicator auch per MAPI oder EWS auf Kontakte im Exchange Postfach zugreifen und mit Lync 2013 und Exchange 2013 werden diese Informationen in dem "Universal Contact Store" abgelegt.

Aber für Firmenkontakte ist dies natürlich keine komplette Lösung. Eine Firma wird zumindest alle Lync-Anwender auch im Active Directory pflegen. Nur soll ein Lync Client nun per LDAP den Domänencontroller fragen und wie soll das aus dem Internet funktionieren oder gar in der Office 365 Cloud. Und wie schnell kann ein DC wohl eine Rufnummer zu einem Namen auflösen ?. Zudem müsste die Rufnummer im Active Directory sich dann auch von der Schreibeweise her passen. Nein, so kann Lync nicht funktionieren und so funktioniert auch Outlook mit Exchange nicht. Beide Produkte nutzen ein eigenes Adressbuch, welches der Server im Hintergrund zusammenstellt und dem Client zum Download anbietet. Parallel kann der Client natürlich auch noch z.B. Outlook lokal befragen.

Das Bild beschreibt die Funktionsweise bei Lync 2013. Der ABServer holt sich die Daten aus der RTC-Datenbank in die AB-Datenbank. Bei Lync 2010 war der Prozess etwas anders. Hier hat der ABServer die Daten wohl direkt per LDAP aus dem AD extrahiert und in die Datenbank RTCAB bzw. RTCAB1 wechselseitig importiert. Wenn der Import erfolgreich war, wurden die Daten dann in Dateien extrahiert und die aktiv genutzte RTCAB-Datenbank umgeschaltet.

User Replicator

Dieser Prozess läuft alle Minute und schaut nach geänderten Objekten im Active Directory, die er in die RTC-Datenbank übertragen kann. Die Konfiguration können Sie sehr einfach auslesen.

PS C:\> Get-CsUserReplicatorConfiguration

Identity                  : Global
ADDomainNamingContextList : {}
ReplicationCycleInterval  : 00:01:00

Hier können Sie auch die AD-Partitionen beschränken, wenn Sie nur einen Teil der Domänen auslesen wollen. Wichtig ist aber hier das Intervall, welches per Default auf 1 Minute steht.

“More often than not, the automatic synch between the User database and Active Directory will keep the information in the User database up to date. However, it is possible that a problem might occur that prevents this automatic synchronization from taking place. In a case such as that, you can use the Update-CsUserDatabase cmdlet to force the User database to refresh its contents by re-reading all of the User information stored in Active Directory.
Quelle: Update-CsUserDatabase  http://technet.microsoft.com/en-us/library/gg398682.aspx

ABServer

Dieser Prozess holt sich dann die Daten aus der Quell (RTC-DB bei Lync 2013,  AD bei Lync 2010) und generiert daraus die Adressbuchdateien. Auch diesen Zeitplan können Sie auslesen und ändern:

PS C:\> Get-CsAddressBookConfiguration

Identity                   : Global
RunTimeOfDay               : 1:30 AM
KeepDuration               : 30
SynchronizePollingInterval : 00:05:00
MaxDeltaFileSizePercentage : 20 
useNormalizationRules      : True
IgnoreGenericRules         : False
EnableFileGeneration       : True
MaxFileShareThreadCount    : 300

Jede Nacht um 01:30 Ortszeit werden also die Adressen in die Adressbuchdateien erstellt. Der Übertrag der Daten aus der RTC-Datenbank in die RTCAB erfolgt aber alle 5 Minuten

Beide Versionen extrahieren dann aber die Datenbanken in den LyncShare, so dass die Lync WebServices diese Daten bereit stellen können. Der Client auf der rechten Seite kann also zum einen das Adressbuch nutzen, welches er vom Lync Server regelmäßig herunter lädt und zum anderen ein lokal vorhandenes Outlook. Zudem kann der Client per WebQuery natürlich beim Lync Server Informationen beziehen. Zuletzt gibt es natürlich auch noch über SIP die Informationen von "Kontakten". Insgesamt liefert Lync daher folgende Quellen

Quelle Felder RNL

Lync Benutzer

Telephone, Fax, Mobile, IPPhone (Wird als OtherPhone) angezeigt

Ja

AD-Kontakt und Benutzer ohne Lync

Telephone, Fax, Mobile
Feld msRTCSIP-Line muss nicht mehr gefüllt sein

Ja

SIP-Federation

Abhängig was der Gegenüber sendet

Nein

Outlook Kontakte

Outlook Felder

Ja

Skill Search

Keine

Nein

Leider gibt es aber keine weitere Schnittstelle, mit der z.B. zentral ein anderes Adressbuch (z.B. eine Telefonbuch-CD, eine Kundendatenbank o.ä. direkt angesprochen werden kann. Wer solche Daten integrieren will, muss auf dem Client sich selbst eine Anwendung schreiben oder die Daten z.B. als AD-Kontakte von Lync einbinden lassen.

Auch die "Skill Search" des Lync Clients hilf nur bei der Vorwärtssuche in den "Sharepoint MySites" nach möglichen Ansprechpartnern.

Lync Kontaktkarte

Die Kontaktkarte von Lync 2010 und Lync 2013 sehen ziemlich ähnlich sein. Leider ist die Liste nicht "komplett" sichtbar, d.h. nur wenn Sie bei einem Kontakt wirklich ALLE Felder gepflegt haben, dann sehen Sie auch alle Felder in der Kontaktkarte. Felder ohne Daten werden nicht als leer angezeigt sondern einfach komplett ausgeblendet.

Lync 2010 Lync2013

Sie sehen hier die Informationen im Lync Adressbuch von meinem eigenen Account mit Lync 2010 und Lync 2013. Lync 2013 blendet zusätzlich aber noch das Feld "Firma" mit ein.

Lync Adressbuch Generierung

ähnlich wie das Exchange Offline Adressbuch generiert auch der Lync Server in der Regel einmal am Tag ein "Adressbuch", zu dem er Daten aus dem Active Directory ausliest, Nummern normalisiert und diese dann zum Download bereit stellt. Der Prozess wird von einem Frontend im Pool ausgeführt und kann per PowerShell beeinflusst werden.

PS C:\> Get-CsAddressBookConfiguration
 
Identity                   : Global 
RunTimeOfDay               : 1:30 AM 
KeepDuration               : 30 
SynchronizePollingInterval : 00:00:30 
MaxDeltaFileSizePercentage : 20 
useNormalizationRules      : True 
IgnoreGenericRules         : False 
EnableFileGeneration       : True

Idealerweise sind Rufnummern im Active Directory natürlich gleich in der E.164-Schreibweise gespeichert. Aber selbst wenn dies nicht der Fall ist, kann Lync diese Rufnummern vielleicht normalisieren. Die "eingebaute" Normalisierung ist natürlich auf die US-Schreibweise abgestellt und passt nicht immer für europäische Schreibweisen. Entsprechend ist eine Textdatei anzupassen:

\\server\LyncShare\1-WebServices-1\ABFiles\Company_Phone_Number_Normalization_Rules.txt

Achtung: Die Normalisierungsregeln in dieser Datei kommen auch bei Lync Clients zur Anwendung, die per Remote Call Control arbeiten. Siehe auch Rufnummern.

Auf dem Lync Server sollte es eine "SAMPLE_Company_Phone_Number_Normalization_Rules.txt" geben, die Sie als Vorlage nutzen und anpassen können. Diese "Normalisierung" hat nichts mit dem Lync Dialplan zu tun. Damit die Änderungen sofort aktiv werden, ist ein "Update-CsAddressBook” auf der Lync PowerShell der passende Weg, damit die Änderungen im Active Directory über die "Company_Phone_Number_Normalization_Rules.txt" in die Datenbank RTCAB/RTCAB1 abgelegt und basierend darauf die Adressbuch-Dateien auf dem Lync Share zum Zugriff über die Lync Webdienste erstellt werden.

Lync AB im Eventlog

Im Windows Eventlog auf dem Frontend Server, der gerade den Adressbuch-Service ausführt, finden Sie dann entsprechende Einträge

Log Name:      Lync Server
Source:        LS User Replicator
Date:          28.06.2013 18:37:36
Event ID:      30028
Task Category: (1009)
Level:         Information
Keywords:      Classic User:          N/A
Computer:      lync2013.msxfaq.net
Description:
Address book (AB) entries are populated successfully during uR initial cycle für domain netatwork.de
 (DN: DC=netatwork,DC=de).

Number of objects examined :
734
Number of objects included :
0
Number of group objects excluded since they do not have a valid email attribute:
297
Number of objects excluded since they have "hide from AB" attribute set to 'TRUE':
70
Number of objects excluded since they have "exclude from AB" attribute:
0
Number of objects excluded since they do not have any of the required attributes:
281
Number of objects excluded since they do not have "include to AB" attribute:
0

The source of the replication is AddressBookReplication.

Manuelles Update

Wen Sie viele Änderungen (oder Korrekturen) im Active Directory vorgenommen haben oder die Normalisierungsregeln für das Adressbuch erweitert haben, dann können Sie auch sehr einfach das Adressbuch manuell erzeugen

  1. "Update-CSUserdatabase" und auf Event ID 30024 warten
    Dieser Befehl triggert die Replikation aus dem AD in die SQL-Datenbank an
  2. "Update-CSAddressbook" und auf Event ID 30028 warten
    Damit wird aus den Daten der SQL-Datenbank das Offline Addressbuch erzeugt und im LyncShare abgelegt.
  3. Lync 2013: DFS-Replikation abwarten
    Wenn Sie den LyncShare seit Lync 2013 auf einem Server per DFS-Replikation hochverfügbar gemacht haben, dann sollten Sie dessen Replikation abwarten, was aber in der Regel innerhalb von Minuten erfolgt ist
  4. Lync Client: Löschen der "GalContacts.db" und "GalContacts.db.idx"
    Bei Lync 2013 liegen diese in "C:\Users\<samaccountname>\AppData\Local\Microsoft\Office\15.0\Lync\sip_<sipadresse>@<sipdomain>"
    Es kann etwas dauern, bis der Lync Client das Adressbuch herunter lädt.

So sollten sie Änderungen im Backend sehr schnell auf dem Testclient sehen können.

ABS-Dateien

Wenn Sie in den Share schauen, dann finden Sie hier einige Dateien:

Au den ersten Blick erscheint dies verwirrend aber mit ein wenig Hintergrundinformationen können Sie sehr gut die Funktionsweise erkennen. Die Dateinamen sind nämlich sehr beschreiben, wenn Sie ein paar Informationen haben. Der ABSERVER generiert nämlich immer 1 "volle Adressbuchdatei" und dann 2x 29 Differenzdateien. Diese Dateien bleiben bist zu 30 Tage erhalten, so dass insgesamt ca. 30* (1+29+29) = 1770 Dateien enthalten.

Sollte eine Differenzdatei eine konfigurierbare Schwelle (Get-CsAddressBookConfiguration: Default ist MaxDeltaFileSizePercentage : 20 ) überschreiten, wird immer eine "Full"-Datei generiert.

Der erste Buchstabe und die Erweiterung spezifizieren die Zielgruppe:

  • F*.LSABS = Full Address Book
  • *.LABS = umfangreiche Adressbuchdateien
  • *.DABS = in der Größe reduzierte Dateien für Devices, die mit knappem Speicher auskommen müssen
  • C*.* = Delta Updates für Clients
  • D*.* = Delta Updates für Devices

Die Devices haben eine eigene Datei, da sie vermutlich weniger Inhalt haben. Auf einem Lync Telefon werden Sie nicht die komplette "Kontaktkarte" benötigen und dort ist Speicher ja auch kostbar.

Auch die Dateinamen sind schnell erklärt, da es sich um die Anzahl an Tagen seit dem 1. Jan 2001 handelt. Sie können diesen Wert also recht einfach selbst erreichnen.

[String]::Format("{0:x}", [int]((get-date) - (get-date 01.01.2001)).totaldays-1)

Da die Zählung der Tage mit "0" beginnt, muss von dem Ergebnis der Datumsrechnung noch 1 abgezogen werden. Und auch dann kann die Datei noch um eine stelle "verrutscht" sein, da die Generierung in der Nacht erfolgt. Bei Sommerzeit in Deutschland sind 01:30 nach UTC doch wieder 23:30 des Vortages.

Nach dem Schema weiss aber dann auch der Client genau, welche Datei er nun abrufen muss, um ausgehend von seinem letzten Stand mit einem Update die aktuellste Version zu erhalten.

Bereitstellung per Datei für IIS

Die Dateien liegen im LyncShare aber werden über den IIS in beiden Webs freigegeben und darüber von den Client abgerufen

Sie sind also sowohl von innen "Internal Web Site" direkt als auch von Extern über einen Reverse Proxy zu erreichen. Ein Client muss also per HTTPS mit der richtigen URL den Service ansprechen. Es erfolgt kein direkter Zugriff per SIP oder SMB auf diese Daten.

Kontrolle im Eventlog

Die Arbeit des Lync Adressbuch Dienst können Sie im Eventlog relativ einfach kontrollieren.

Information 12/6/2011 8:23:49 AM LS Address Book and Distribution List Expansion Web Service 62020 (1024)
Information 12/6/2011 8:22:45 AM LS Address Book Server 21004 (1008)
Information 12/6/2011 8:22:45 AM LS Address Book Server 21056 (1008)
Information 12/6/2011 8:22:45 AM LS Address Book Server 21010 (1008)
Information 12/6/2011 8:22:45 AM LS Address Book Server 21005 (1008)

Log Name: Lync Server


Source: LS Address Book and Distribution List Expansion Web Service
Event ID: 62020
Task Category: (1024)
Level: Information
Keywords: Classic
Description: 
Address Book web service backend data partition = RtcAb1

Log Name: Lync Server
Source: LS Address Book Server
Event ID: 21004
Task Category: (1008)
Level: Information
Keywords: Classic
Description: 
Next synchronization pass will start at:

Source: LS Address Book Server
Event ID: 21056
Task Category: (1008)
Level: Information
Keywords: Classic
Description:
Synchronization Pass Summary.

Sync pass completed with 56 contacts processed
Number of separate AD partitions: 1
Number of valid contacts: 56
Number of empty contacts: 0
Number of invalid contacts: 0
Number of cached photos deleted: 0
Number of stale OC files deleted: 0
Number of OC full files written: 1 with 56 total contacts
Number of OC delta files written: 12 with a total of 12 new/updated contacts and 0 deleted contacts.
Number of OC bytes written: 25,643 compressed to 13,855 bytes on disk.
Number of stale device files deleted: 0
Number of device full files written: 1 with 6 total contacts
Number of device delta files written: 56 with a total of 6 new/updated contacts and 0 deleted contacts.
Number of device bytes written: 12,714 compressed to 7,960 bytes on disk.


Source: LS Address Book Server
Event ID: 21010
Task Category: (1008)
Level: Information
Keywords: Classic
Description:
Synchronization pass completed successfully

Address Book web service backend data partition = RtcAb1


Source: LS Address Book Server
Event ID: 21005
Task Category: (1008)
Level: Information
Keywords: Classic
Description: 
Synchronization pass started.

Fehlersuche

Da Eventlog sollte auch der erste Anlaufpunkt für die Suche nach "fehlenden Einträgen" sein.

Log Name:      Lync Server
Source:        LS Address Book Server
Event ID:      21034
Task Category: (1008)
Level:         Warning
Keywords:      Classic
Description:
One or more phone numbers failed to normalize.

4 total numbers failed to normalize.  They are listed in the text file:
'\\lync2013.msxfaq.net\LyncShare\1-WebServices-26\ABFiles\00000000
-0000-0000-0000-000000000000\00000000-0000-0000-0000-000000000000\Invalid_AD_Phone_Numbers.txt'
Cause: One or more phone number attributes in Active Directory contained text
 that could not be normalized.  Normalization rules are contained in the optional
 Company_Phone_Number_Normalization_Rules.txt file located in the output location
 or in the generic rules built into Address Book Server.
Refer to the documentation für a description of the built-in generic normalization rules. 
Use the ABServer -dumpRules command to see all the rules that Address Book Server 
  is currently configured with.
Resolution:
  Either create a Company_Phone_Number_Normalization_Rules.txt file in the output location 
  and make sure it covers all cases found in your Active Directory deployment or fix 
  the invalid phone number(s) in the Active Directory record(s).

In der genannten Date finden sich dann auch die Fehler beim Import

Unmatched number: User: 'b3805040-390b-4080-a0e0-3d5e122b0cd3' 
   AD Attribute: 'homePhone'  Number: '#Privat1' 
unmatched number: User: 'e1098608-cc10-487a-8a1b-b974f01e5128'  
  AD Attribute: 'mobile'  Number: '017012345678757' 
unmatched number: User: '08f3d291-546c-4b71-89db-b31fc4b50484' 
  AD Attribute: 'mobile'  Number: '716' 
unmatched number: User: '08f3d291-546c-4b71-89db-b31fc4b50484' 
  AD Attribute: 'homePhone'  Number: '416'

Hier sind vier gängige Fehlerbilder zu sehen. Einmal stand im Feld ein String "#Privat1" drin, während die anderen Nummern nicht "normalisierbar" sind.

Debug-CsAddressBookReplication

Mit Lync 2013 gibt es aber auch ein neues Commandlet, welches nicht den kompletten Prozess der Adressbuchgenerierung analysiert, aber z.B. eine Kontrolle eines Eintrags erlaubt. Ein einfacher Aufruf ohne Parameter liefert erst mal die allgemeinen Übersichtsdaten

PS  c:\> debug-csaddressbookreplication

Pool Fqdn                          : pool.msxfaq.net
Replication State                  : NotTested
Task Owner Fqdn                    : fe1.msxfaq.net
Backup Fqdn                        :
Server Heartbeats                  : {Microsoft.Rtc.SyntheticTransactions.Activ
                                     ities.Database.AbServerHeartbeat, Microsof
                                     t.Rtc.SyntheticTransactions.Activities.Dat
                                     abase.AbServerHeartbeat, Microsoft.Rtc.Syn
                                     theticTransactions.Activities.Database.AbS
                                     erverHeartbeat, Microsoft.Rtc.SyntheticTra
                                     nsactions.Activities.Database.AbServerHear
                                     tbeat}
Indexed Object Count               : 3144
Objects not indexed that should be : 0
Abandoned objects                  : 0
Normalization Failure Count        : Not checked
Normalization Failures             :

Schon dieser einfache Test liefert z.B. einen ersten Eindruck über die Anzahl der Elemente und fehlerhafte Objekte. Hier sieht man aber auch, welcher Frontend im Pool für die Generierung des AB zuständig ist.

Debug-CsAddressBookReplication `
   -PoolFqdn pool.msxfaq.net `
   -User sip:User1@msxfaq.net

Über den Parameter "-User" kann man sogar eine SIP-URI eines Anwenders angeben und dann genau ermitteln, z.B. welche Rufnummern aus dem AD in das Lync Adressbuch übernommen wurden.

Kontrolle mit Snooper

Ein zweiter Weg ist die Kontrolle mittels Snooper, welcher über eine Debug-Session noch genauer in die Datenstrukturen schauen kann und quasi jeden einzelnen Zugriff auf die AD-Objekte und SQL-Daten aufführen kann

So tief geht man aber erst, wenn die Informationen im Eventlog nicht ausreichend sind.

Blick in die Tabellen

Auf der Seite Lync Tabellen habe ich schon einige Tabellen von Lync angezeigt. Die Adressbuchtabelle liegt in der Instanz "RTC" der Datenbank, also nicht in der RTCLOCAL oder LYNCLOCAL.

Sie können mit dem SQL Enterprise Studio relativ gefahrlos in die einzelnen Tabellen reinschauen und sogar die Adressbuchmitglieder wieder erkennen. Allerdings sollten Sie hier nichts dran ändern. Die Werte sind ehr nur "flüchtig", d.h. beim nächsten Import werden die Daten wieder anhand des Active Directory überschrieben und danach als Dateien in den LyncShare exportiert. Diese Datenbank ist also eher ein "Staging-Bereich".

Error 21054 mit Lync 2013

Seit Lync 2013 können Sie in einigen Umgebungen einen regelmäßig auftretenden Fehler finden:

Log Name:      Lync Server
Source:        LS Address Book Server
Event ID:      21054
Task Category: (1008)
Level:         Error
Keywords:      Classic User:          N/A
Description: Users are not indexed in the database that should be.
 
Expected indexed User count: 0
Actual indexed User count: 4129
Cause: User replication issue.
Resolution:
Run Update-CsAddressBook to synchronize all accounts.

Klar dass der "Update-CSAddressBook" auch nicht weiter hilft und tatsächlich sind auch alle Benutzer sauber repliziert und das AB generiert worden nur der Lync Server meint es müssten "0" sein. Sie sollten den Erfolg im Eventlog und mit folgendem Commandlet prüfen:

PS C:\Users\svc-mail01szd> Debug-csAddressBookReplication -Poolfqdn lyncpool1.msxfaq.de
 
Pool Fqdn                          : lyncpool1.msxfaq.de
Replication State                  : NotTested
Task Owner Fqdn                    : lyncpool1.msxfaq.de
Backup Fqdn                        :
Server Heartbeats                  : {Microsoft.Rtc.SyntheticTransactions.Activities.Database.AbServerHeartbeat}
Indexed Object Count               : 4129
Objects not indexed that should be : 0
Abandoned objects                  : 0
Normalization Failure Count        : Not checked
Normalization Failures             :

Diese Ausgaben sollte zeigen, dass die Benutzer korrekt erstellt wurden und es keine Objekte gibt, die nicht indexiert oder "Abandoned" sind. Microsoft selbst schreibt in den Release Notes zu Lync 2013 zu diesem Fehler:

Address Book Server error event 20154 is generated once daily für each Lync 2013 pool (3195918)
Issue:

If the cmdlet reports that there are no unindexed or abandoned objects, the error event 20154 can be safely ignored.
Additionally, the Key Health Indicator (KHI) "Address Book Users Correctly Indexed" should be turned off in System Center Operations Manager.

Quelle: Release Notes für Lync Server 2013 http://technet.microsoft.com/en-us/library/jj205120.aspx

Lync Client

Der Communicator auf dem Client bekommt diese Adressbuchdateien aber auch nicht "sofort" sondern erst im Rahmen es üblichen Downloads. Und das kann wie bei Outlook etwas dauert. Es gibt einen Trick, wie Sie den Download schneller erzwingen können. Der Eintrag ist eine Gruppenrichtlinie, aber kann auch manuell per RegEdit erfolgen. Es gibt zwei Einträge, je Version des Clients:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_User\Software\Policies\Microsoft\Communicator]
"GALDownloadInitialDelay"=dword:00000000

[HKEY_CURRENT_User\Software\Wow6432Node\Policies\Microsoft\Communicator]
"GALDownloadInitialDelay"=dword:00000000

[HKEY_CURRENT_User\Software\Wow6432Node\Policies\Microsoft\Office\15.0\Lync]
"GALDownloadInitialDelay"=dword:00000000

[HKEY_CURRENT_User\Software\Policies\Microsoft\Office\15.0\Lync ]
"GALDownloadInitialDelay"=dword:00000000

[HKEY_CURRENT_User\Software\Wow6432Node\Policies\Microsoft\Office\16.0\Lync]
"GALDownloadInitialDelay"=dword:00000000

[HKEY_CURRENT_User\Software\Policies\Microsoft\Office\16.0\Lync ]
"GALDownloadInitialDelay"=dword:00000000

Bedenken Sie aber, dass dies eine Lastspitze erzeugen kann, wenn morgens viele Clients zur gleichen Zeit sich anmelden. Zudem sind die Werte unter "/Policies", d.h. zum Schreiben muss der Anwender Administrator sein. Besser ist es daher die Werte per Gruppenrichtlinien zu setzen.

Um den Download zu forcieren, sollten Sie den Lync Client beenden und dann die Dateien des Adressbuchs beim Benutzer löschen. Achtung: Diese zwei Zeilen löschen alle Adressbuchdaten in allen lokalen SIP-Profilen des Benutzers.

del "%LOCALAPPDATA%\Microsoft\Office\15.0\Lync\abs*.cache" /s
del "%LOCALAPPDATA%\Microsoft\Office\15.0\Lync\gal*.*" /s

Weitere Links