Inside Lync Picture Settings

Hallo zusammen,

Wie man in Lync die Photo Settings kontrolliert habe ich ja bereits im Artikel http://blog.icewolf.ch/archive/2012/12/05/lync-picture-settings.aspx erklärt.

Der User "boa" hat bereits im AD ein Foto hinterlegt.

Die Einstellungen sind in der Client Policy gesetzt.

Get-CsClientPolicy | fl identity, AddressBookAvailability

Im Lync Share gibt es *.photo Dateien

Schaut man sich die *.photo Dateien im Hex Editor an, so entdeckt man einen JFIF Header, es ist also eine JPEG Datei.

Der Filename leitet sich aus der AD Object GUID ab.

Ändert man die Dateiendung von *.photo auf *.jpg so kann man die Datei mit einem Bildbearbeitungsprogramm öffnen.

Lync speichert also die AD Photos als JPG Dateien im Lync Share ab.

Das Photo kann man über die interne Adressbuch URL auch abrufen. https://icesrv06.corp.icewolf.ch/abs/handler/acd2ee0a121e488ca953d704a858adfc.photo

Versucht man eine URL aus dem Internet einzugeben, welche auf ein Bild verweist, das grösser als die eingestellten 30 KB ist, erhält man eine Fehlermeldung.

Ein Bild welches kleiner als die 30 KB ist funktioniert prima

Das neue Bild wird dann unverzüglich angezeigt.

Wo wird die URL zum Bild gespeichert? Mit diesem Anliegen habe ich angefangen die RTC Datenbank zu durchsuchen.

Die AD Object GUID ist auch in der Datenbank.

use rtc
GO
/*ADDN*/
SELECT * FROM dbo.AdDn WHERE AdDn like '%boa%'

Die SIP Accounts sind in der Tabelle "Resource"

/*Resource*/
SELECT * FROM rtc.dbo.Resource

Im Internet habe ich herausgefunden, dass die Daten in der Tabelle "PublishedStaticInstance" gespeichert sein sollen. Es gibt zeimlich viele Datensätze und die Spalte DATA ist ein Bytearray welches eigentlich XML enthält.

/*PublishedStaticInstance RAW*/
SELECT LastPubTime, CategoryId, ContainerNum, InstanceNum, Version, Data
FROM rtc.dbo.PublishedStaticInstance WHERE PublisherId = 2

Das Query gibt aber immer noch 64 Datensätze aus - aber wir benötigen die vom Typ "ContactCard" also "CategoryId = 2"

/*PublishedStaticInstance XML*/
SELECT LastPubTime, CategoryId, ContainerNum, InstanceNum, Version,
convert(varchar(4000),convert(varbinary(4000),Data)) as XML
FROM rtc.dbo.PublishedStaticInstance WHERE PublisherId = 2

Nun lasse ich mir die Daten nach der Spalte "LastPubTime" ordnen. Das gibt dann nur noch fünf Datensätze.

/*PublishedStaticInstance XML ContactCard*/
SELECT LastPubTime, CategoryId, ContainerNum, InstanceNum, Version,
convert(varchar(4000),convert(varbinary(4000),Data)) as XML
FROM rtc.dbo.PublishedStaticInstance WHERE PublisherId = 2
AND CategoryId = 2 ORDER BY LastPubTime

Ich habe mir die Datensätze einzeln angeschaut und mich für den "ContainerNum = 100" entschieden.

SELECT RES.ResourceId ,RES.UserAtHost , PSI.LastPubTime, PSI.CategoryId, PSI.ContainerNum, PSI.InstanceNum, Version,
convert(varchar(4000),convert(varbinary(4000),Data)) as XML
FROM rtc.dbo.PublishedStaticInstance AS PSI
INNER JOIN Resource AS RES ON (PSI.PublisherId  = RES.ResourceId)
WHERE RES.UserAtHost = 'boa@icewolf.ch'
AND CategoryId = 2 AND ContainerNum = 100 AND InstanceNum = 6

So sieht dann das XML aus der Spalte "Data" aus.
Man sieht einen Hash und die URL.

Der Hashwert ist der MD5 Hash der *.photo Datei (oder halt des Bildes aus dem Active Directory)
Ich habe den MD5 Hash mit dem Tool md5sum ermittelt.

Grüsse
Andres Bohren