Client Version Filter

Lync Server sind per SIP erreichbar, leider nicht für jeden SIP-Client das Lync ein paar Besonderheiten und Erweiterungen nutzt, so dass ein klassisches SIP-Telefone nicht damit zurecht kommt. Aber auch unter der Liste von möglichen Clients gibt es welche, die ein Administrator nicht haben will. Das können Sicherheitsgründe sein, z.B.: weil alte Versionen bestimmte Einstellungen noch nicht unterstützen (z.B. Call Admission Control) oder andere Clients vielleicht "zu neu" oder einfach verboten sind.

Für diesen Einsatzzweck bieten sich die Client Version filter an, die schon OCS kannte auch in Lync weiter vorhandensind.

Clienttypen

Im Laufe der Zeit haben sich einige Clients angesammelt, die sich mit einem passenden "UserAgent"-Eintrag mit Versionsangabe beim Server melden. Der Lync Server prüft die Einstellung gegen ein Regel Regelwerk und lässt den Anwender dann entsprechend zu oder eben nicht.

Kürzel Software

LCC

Microsoft Office Communicator 2005 instant messaging client

RTC

Real-Time Communications instant messaging client

RTCC

Real-Time Communications and Collaboration client

UCCP

Unified Communications Client Platform client

OC

Office Communicator 2007 instant messaging client
OC Lync 2010 Communicator
OC Lync 2013 Communicator

WM

Windows Messenger instant messaging client

CWA

Microsoft Office Communicator Web Access instant messaging client

COMO

Microsoft Office Communicator Mobile instant messaging client

LMC

Office Live Meeting client

AOC

Attendee

CPE

Communicator Phone Edition

LiveMeetingAddIn

LiveMeetingAddIn

Seit LCS 2003 haben sich also eine Menge von Clients entwickelt, die alle theoretisch auftreten können. Nicht alle unterstützen aber die Funktionen jeder Server Version korrekt und einige können sogar schaden, z. B. die Buddy-Liste unbrauchbar machen.

Client Policy

Per Default installieren OCS einen Client Version Filter und Lync eine Client Version Policy. Im Gegensatz zur globalen Wirkung der OCS Einstellung sind die Policies von Lync Global aber auch pro Site und user anwendbar.

Mit der Anwendung der Client Version Policy auf den einzelnen Benutzer können Sie sowohl die generelle Funktion ihrer Filter an einem Test-Account prüfen als auch die Benutzung bestimmter Client für Konten unterbinden.

Hier einmal die "Default" für einen OCS 2007 R2 Server, wenn jemand diese noch haben sollte:

In dem Dialog werden sowohl die Filter als auch das Default-Verhalten konfiguriert.

Etwas anders sieht es in Lync aus. Hier können Sie verschiedene Policies definieren. Neben der "global"-Policy können Sie weitere Richtlinien auf die Site, den Pool oder für die Anwendung auf Benutzer einrichten. Die Default für eine Lync 2013 Policy sehen Sie hier:

Die gleichen Einstellungen können Sie natürlich per PowerShell ermitteln.

PS C:\> (Get-CsClientVersionPolicy global).rules | ft useragent,majorversion,Min
orversion,buildnumber,qfenumber,compareop,action -AutoSize userAgent MajorVersion MinorVersion BuildNumber QfeNumber CompareOp Action
--------- ------------ ------------ ----------- --------- --------- ------
RTC                  1            2                             LEQ  Block
WM                   5                                          LEQ  Block
OC                   2            0 6362        97              LSS  Block
OC                   2         9999 9999        9999            LEQ  Allow
OC                   3            5 6907        83              LEQ  Block
uCCP                 2            0 5999                        LEQ  Block
CPE                  2            0 6021                        LEQ  Block
OCPhone              1            0 196                         LEQ  Block
AOC                  4                                          LSS  Block

Wenn Sie sich die Liste genau anschauen, dann finden Sie hier kein "Allow" für O>C Clients die neuer sind. Die Einstellung, wie diese Regeln per Default wirken, werden an einer anderen Stelle gemacht.

Unter der "Client Version Configuration" können Sie global oder pro Site einstellen, ob überhaupt kontrolliert wird und welche "Default Action" ansteht, wenn die Regel keine Aussage trifft.

Auch diese Einstellung kann per PowerShell ermittelt und auch gesetzt werden

PS C:\> Get-CsClientVersionConfiguration

Identity      : Global
DefaultAction : Allow
DefaultURL    :
Enabled       : True

Clients ermitteln

In OCS 2007 konnte man noch einfach per GUI oder WMI ermitteln, welche Clients und user gerade angemeldet sind. In Lync gibt es aktuell kein Commandlet dazu und auch eine WMI-Abfrage läuft ins leere. Die Lync Performance Counter liefern auch nicht mehr Daten. Da bleibt dann letztlich nur der Blick in die SQL-Datenbank selbst.

Hinweis
Der direkte "lesende" Blick in die Datenbank ist unkritisch, solange sie wirklich nicht schreiben. Allerdings "sieht" man so nur die Clients, die aktuell angemeldet sind und hat damit kein vollständiges "Inventory". Zudem muss man die Datenbanken aus der RTCLOCAL-Instanz der Frontend Server abfragen.

USE rtcdyn
SELECT COUNT(*) as Occurrences,
CAST(rtcdyn.dbo.RegistrarEndpoint.ClientApp as varchar(100)) as 'Client Version'
from rtcdyn.dbo.RegistrarEndpoint
WHERE IsServerSource = 0
group by CAST(rtcdyn.dbo.RegistrarEndpoint.ClientApp as varchar(100))
order by CAST(rtcdyn.dbo.RegistrarEndpoint.ClientApp as varchar(100))

Diese Abfrage liefert die Versionen der Endpunkte und die Anzahl des Auftretens.

write-host "Reading SIP-Versions from SQL"
[string]$SQLConnection = "Server=NAWLYNC001\RTCLOCAL;Integrated Security=True"

[string]$SQLQuery = "USE rtcdyn
SELECT COUNT(*) as Occurrences,
CAST(rtcdyn.dbo.RegistrarEndpoint.ClientApp as varchar(100)) as 'Client Version'
from rtcdyn.dbo.RegistrarEndpoint
WHERE IsServerSource = 0
group by CAST(rtcdyn.dbo.RegistrarEndpoint.ClientApp as varchar(100))
order by CAST(rtcdyn.dbo.RegistrarEndpoint.ClientApp as varchar(100))"

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter ($SQLQuery,$SQLConnection)
$DataSet = New-Object System.Data.DataSet
$result = $SqlAdapter.Fill($DataSet)
if ($result -eq 0) {
   write-error "Keine SQL-Daten erhalten"
}
else {
   write-host " erhaltene Zeilen: $result"
   $DataSet.Tables[0] | ft -autosize
}

# Ausgabe
Occurrences Client Version
----------- --------------
          3 CPE/4.0.7577.4387 OCPhone/4.0.7577.4387 (Microsoft Lync Phone Edition)
          2 uCCAPI/15.0.4517.1004 OC/15.0.4517.1004 (Microsoft Lync)
          2 uCCAPI/15.0.4517.1504 OC/15.0.4517.1504 (Microsoft Lync)

Wer nun noch wissen möchte, welche SIP-Adresse sich dahinter verbirgt, kann folgende Anfrage nutzen:

SELECT rtc.dbo.Resource.UserAtHost as 'SIP Address', 
   CAST(rtcdyn.dbo.RegistrarEndpoint.ClientApp as varchar(100)) as 'Client Version'
FROM rtcdyn.dbo.RegistrarEndpoint
INNER JOIN rtc.dbo.Resource
ON rtcdyn.dbo.RegistrarEndpoint.OwnerId = rtc.dbo.Resource.ResourceId
WHERE IsServerSource = 0

Als PowerShell -Skript ist dies dann

write-host "Reading SIP-User from SQL"
[string]$SQLConnection = "Server=NAWLYNC001\RTCLOCAL;Integrated Security=True"

[string]$SQLQuery = "SELECT rtc.dbo.Resource.UserAtHost as 'SIP Address', CAST(rtcdyn.dbo.RegistrarEndpoint.ClientApp as varchar(100)) as 'Client Version'
FROM rtcdyn.dbo.RegistrarEndpoint
INNER JOIN rtc.dbo.Resource
ON rtcdyn.dbo.RegistrarEndpoint.OwnerId = rtc.dbo.Resource.ResourceId
WHERE IsServerSource = 0"

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter ($SQLQuery,$SQLConnection)
$DataSet = New-Object System.Data.DataSet
$result = $SqlAdapter.Fill($DataSet)
if ($result -eq 0) {
   write-error "Keine SQL-Daten erhalten"
}
else {
   write-host " erhaltene Zeilen: $result"
   $DataSet.Tables[0] | ft -autosize
}

# Ausgabe zeigt aber nur einen Endpunkt pro Benutzer

SIP Address       Client Version
-----------       --------------
user1@msxfaq.net  uCCAPI/15.0.4517.1504 OC/15.0.4517.1504 (Microsoft Lync)
user2@msxfaq.net  CPE/4.0.7577.4387 OCPhone/4.0.7577.4387 (Microsoft Lync Phone Edition)
user3@msxfaq.net  uCCAPI/15.0.4517.1004 OC/15.0.4517.1004 (Microsoft Lync)
user4@msxfaq.net  uCCAPI/15.0.4517.1504 OC/15.0.4517.1504 (Microsoft Lync)
user5@msxfaq.net  CPE/4.0.7577.4387 OCPhone/4.0.7577.4387 (Microsoft Lync Phone Edition)

Die Abfragen sind natürlich je Frontend Server erforderlich, um eine komplette Liste zu erhalten

Weitere Links