Lync CAL Kontrolle

Microsoft lizenziert Lync pro Server, pro Client und pro Funktionsumfang. Da in der Regel nur wenige Server installiert werden und viel mehr Clients und CALs eine gehörige Position in der Kostenrechnung ausmachen, wird man schon genau abwägen, welche Funktion ein Anwender tatsächlich braucht. Schließlich hängen da schon ein paar Euros dran.

CAL Lizenz Übersicht

Abgesehen von Server und den Windows Clients, ist die "Client Access License" für den Anwender der entscheidenden Faktor. Hier kenn Lync drei Lizenzen:

  • Standard CAL
    Diese Lizenz benötigt jeder Anwender oder Device.
  • Enterprise CAL
    Diese Lizenz ist additiv zur Standard-CAL zu erwerben, wenn der Anwender Konferenzen abhalten möchte.
  • Plus CAL
    Diese Lizenz ist additiv zur Standard-CAL zu erwerben, wenn der Anwender "Telefonie" nutzen will, d.h. den Übergang zum Festnetz mit allen verbundenen Funktionen.

Microsoft hat zu den drei Lizenzen unterschiedliche Seiten. Letztlich müssen Sie für jedes Feature prüfen, welche Lizenz neben der Standard-CAL als Basis zusätzlich erforderlich ist:

Standard CAL Enterprise CAL Plus CAL
  • Präsenzanzeige
    Eigene, Fremde, in Office
  • Kontaktmanagement und Karten
  • PC2PC IM und MultiParty IM
  • PC2PC Audio und Video
  • Federation mit Partnern, PIC, Skype
  • Meeting mit 3 oder mehr Leuten starten
  • Meeting mit Audio/Video
  • Meeting mit PSTN DialIn/DialOut
  • Application Sharing (1:1 oder 1:n)
  • Whiteboard (1:1 oder 1:n)
  • Telefonkonferenzen mit Audio
  • Lync als TelefonieClient
  • Remote Call Control (Lync mit PBX)
  • Routing Regel, Dialplan etc
  • E911
  • Stellvertreter
  • Responsegroup
  • Lync Phone:"Better Together" Funktion
  • Telefonieren über Gateway mit PSTN Usern

Da mit den Lizenzen natürlich auch Kosten verbunden sind, liegt der Wunsch nahe nur die erforderliche Nutzung zu lizenzieren. Damit wird es dann natürlich auch notwendig, diese Nutzung entsprechend zu konfigurieren und zu kontrollieren.

Funktionen konfigurieren

Die Nutzung einer CAL hängt nicht von der Installation einer Software oder das Eintragen eines Lizenzschlüssels ab, sondern ist rein durch Konfiguration umzusetzen. Die Anwender, die z.B. keine "Plus-CAL" haben, dürfen eben auch nicht für "Enterprise Voice" oder "RemoteCallControl" aktiviert werden. Etwas kniffliger ist es schon bei der Einstellung der Konferenzen, denn es müssen drei Einstellungen durchgeführt werden

Konferenz Policy

New-CsConferencingPolicy `
   -Identity "NoConf" `
   -AllowIPAudio $false `
   -AllowIPVideo $false `
   -AllowUserToScheduleMeetingsWithAppSharing $false `
   -AllowAnonymousParticipantsInMeetings:$False `
   -AllowPolls:$false ` 
   -EnableAppDesktopSharing None `
   -EnableDialinConferencing $false `
   -EnableDataCollaboration $false `
   -Description "Policy fuer Verbot von EnterpriseCAL"

Meeting Einstellung

Das ist aber noch nicht alles, denn per Default kann jeder Anwender in einem Meeting auch als Konferenzleiter auftreten. Auch dies kann über eine Konfiguration angepasst werden.

Set-CsMeetingConfiguration `
   -DesignateAsPresenter:None

Leider kann man diese Option nur Global, pro Site oder pro Pool aber nicht pro Benutzer setzen. Insofern betrifft diese Einstellung auch die Personen, die Konferenzen nutzen dürften. Normal ist "Company", d.h. jeder firmeninterne Teilnehmer an einer Konferenz ist zugleich auch Konferenzleiter. Das Umstellen auf "None" bedeutet, dass der Einladende der Leiter ist aber er kann andere natürlich hochstufen. Aber wenn der Organisator nicht dabei ist, dann kann das Meeting nicht stattfinden.

Wichtig:
Wenn jemand "Konferenzleiter" wird, dann braucht er natürlich eine Enterprise CAL, auch wenn er nicht der Einladende war.

Outlook Einstellung

Per Default installiert Lync auch das Outlook AddIn, damit Anwender ein Meeting im Outlook Kalender planen können. Wenn ein Benutzer natürlich keine Meetings starten darf, dann führt das Addin eher zu Fragen und Verwirrung. Es sollte idealerweise gar nicht installiert werden. Das ist aber unschön, wenn so zwei Office/Lync-Installationspakete zu erstellen sind. Sie können das Add-on aberr auch per Gruppenrichtlinien deaktivieren. Das hier der hier angeratene Weg. Die folgende "REG-Datei" deaktiviert das Outlook Konferenz Plug-in.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_User\Software\Microsoft\Office\Outlook\Addins\UCAddin.UCAddin.1\}
"LoadBehavior"=dword:00000002

[HKEY_CURRENT_User\Software\Microsoft\Office\Outlook\Addins\UCAddin.LyncAddin.1]
"LoadBehavior"=dword:00000002

Diese Einstellungen können Sie natürlich auch als ADMX-Datei knvertiert einsetzen oder einfach als "Generischen Reg-Key" setzen lassen

Es ist generell eine gute Idee solche Zuweisungen von Berechtigungen über Gruppenmitgliedschaften zu steuern. Über Gruppen lassen sich einfach die Gruppenrichtlinien filtern. Die Zuweisung der Konferenz-Policy muss aber ein anderer Dienst übernehmen.

CAL-Bedarf per "Get-CSUser" auswerten

Wenn Sie über Richtlinien die Berechtigungen für bestimmte Funktionen korrekt konfiguriert haben, dann können Sie diese Einstellungen natürlich auch mit Get-CSUser auslesen. Das Commandlet liefert z.B. die Werte

PS C:\Users\user1> Get-CsUser -ResultSize 1 | gm

   TypeName: Microsoft.Rtc.Management.ADConnect.Schema.OCSADUser

Name                                        MemberType
----                                        ----------
ConferencingPolicy                          Property
DisplayName                                 Property
Enabled                                     Property
EnterpriseVoiceEnabled                      Property
LineServerURI                               Property
LineURI                                     Property
Name                                        Property
PrivateLine                                 Property
RemoteCallControlTelephonyEnabled           Property
SipAddress                                  Property

Interessant sind hier natürlich die Properties "EnterpriseVoiceEnabled" und "RemoteCallControlTelephonyEnabled" für die PlusCAL und die ConferencingPolicy für die Enterprise-CAL

write-host " Anzahl der User, die eine Standard CAL brauchen"
(get-csUser).count

write-host " Anzahl der User, die eine Plus-CAL brauchen"
(Get-CsUser -Filter {(EnterpriseVoiceEnabled -eq $true) -or (RemoteCallControlTelephonyEnabled -eq $true)}).count

write-host " Anzahl der User, die eine Enterprise-CAL brauchen"
(Get-CsUser -Filter {(ConferencingPolicy -ne "NoConf")}.count

Gerade die letzte Abfrage funktioniert natürlich nur, wenn Sie auch ein passende Richtlinie "NoConf" haben, die beim Benutzer die Nutzung von Funktionen unterbindet, für die eine Enterprise CAL erforderlich wäre.

CAL-Bedarf per Monitoring Server auswerten

Neben der Auswertung über die konfigurierten und zugewiesenen Policies können Sie mit dem Lync Monitoring Server natürlich auch in Erfahrung bringen, welcher Benutzer welche Funktion tatsächlich verwendet hat. Dabei bleibt aber eine Unschärfe, da die Auswertung nur die vergangene Nutzung ausgibt aber nicht, ob der Anwender die Funktion nutzen könnte.

# Auslesen der aktuellen Monitoring Datenbank
Get-CsService -MonitoringDatabase

Identity             : MonitoringDatabase:sql1.msxfaq.de
SqlInstanceName      : lync
DependentServiceList : {Registrar:lync1.msxfaq.de}
ServiceId            : 1-MonitoringStore-1
SiteId               : Site:Paderborn
PoolFqdn             : lync1.msxfaq.de
Version              : 6
Role                 : MonitoringDatabase

Die Abfrage der CDR-Datenbank gibt es das Commandlet "Get-CsClientAccessLicense".

Die Anwendung von "Get-CsClientAccessLicense" ist etwas seltsam, da man keine Liste bekommt, welcher Anwender welche Lizenz hat, sondern man muss jede Lizenzform einzelne abfragen und selbst zusammenbringen.

Fragt man den Status der Datenbank ab, dann kommen folgende Wert zurück.

   TypeName: Microsoft.Rtc.Server.Cdr.ClientAccessLicense

Name               MemberType Definition
----               ---------- ----------
Date               Property   System.Nullable[datetime] Date {get;}
DisplayDate        Property   string DisplayDate {get;}
IpAddress          Property   string IpAddress {get;}
LicenseDisplayName Property   string LicenseDisplayName {get;} UserUri            Property   string UserUri {get;}

Für einen ersten Schuss reicht also das Aufführen des gleichen Befehls mit drei Parametern.

Get-CsClientAccessLicense `
   -MonitoringDatabase "nawsql002.netatwork.de\lync" `
   -LicenseName "Standard" `
   -LicenseBasedType "UserBased" `
   -StartDate (Get-Date).AddDays(-1) | ft -AutoSize UserUri                    IpAddress      LicenseName Date
-------                    ---------      ----------- ----
frank.carius@msxfaq.de     192.168.103.60 Standard
Get-CsClientAccessLicense `
   -MonitoringDatabase "nawsql002.netatwork.de\lync" `
   -LicenseName "Enterprise" `
   -LicenseBasedType "UserBased" `
   -StartDate (Get-Date).AddDays(-1) | ft -AutoSize UserUri                      IpAddress      LicenseName Date
-------                      ---------      ----------- ----
frank.carius@netatwork.de    84.245.158.167 Enterprise
Get-CsClientAccessLicense `
   -MonitoringDatabase "nawsql002.netatwork.de\lync" `
   -LicenseName "Plus" `
   -LicenseBasedType "UserBased" `
   -StartDate (Get-Date).AddDays(-1) | fl UserUri, LicenseName,Date -AutoSize UserUri                                          LicenseName
-------                                          -----------
+1123456789@netatwork.de;User=phone
+4952468700971@netatwork.de;User=phone
frank.carius@netatwork.de

Bei der Abfrage der PLUS-Lizenzen erscheinen natürlich auch "externe" Adressen. Um eine genaue Zählung vorzunehmen, sollte man mit Lync User ermitteln und dann die Lizenzen dazu zuordnen.

Get-LyncCALStatus: Monitoring auswerten

So eine Lösung ist in PowerShell schnell zusammen gestellt, zumindest wenn man eine "Per User" Lizenz" hat. Bei einer Lizenzierung per "Device-CAL" eignet sich das Skript nicht.

Zuerst sucht es mit CSUser die Lync Anwender und mit Get-CsService -MonitoringDatabase die SQL-Datenbanken, die dann dreimal mit Get-CsClientAccessLicense abgeklappert werden. Die gefundenen Werte werden zusammen gefasst und dann ausgegeben.

Das Script zählt keine "Common Area Phones", da die keine Lync User sind. Es zählt auch nur die "Lync Client CAL" und keine Server-Lizenzen, Windows Core CALs oder SQL-CALs beim Enterprise Pool, die natürlich auch für Common Area Phones erforderlich sind.

Das Skript nutzt einfach die Lync Commandlets, welche in der Monitoring-Datenbank für jeden Anwender ermitteln, welche Funktionen dieser in der Vergangenheit genutzt hat. Per Default nutzt da Skript 30 Tage, was sie aber anpassen können

get-lynccalstatus.1.0.ps1

Durch den Einsatz von Lync Commandlets müssen Sie das Skript natürlich in einer Lync PowerShell aufrufen. Wundern Sie sich nicht, dass in dem Skript noch zusätzlicher Code rund um "ReportWeb" zu finden ist. Dazu später mehr.

Das Script liefert die Ausgabe sowohl auf der Konsole aus, als auch als Pipeline. Mit einem angehängten "OUT-FILE" können Sie die Daten einfach in eine Datei schreiben lassen.

Weitere Links