Lync Server API - MSPL
Die wohl interessanteste aber auch heikelste Schnittstelle an einem Lync-Server ist die direkte Injektion einer Programme in die SIP-Verarbeitung. Im Gegensatz zu UCMA oder der Lync Client API wird hier direkt auf dem Server gearbeitet. Wird die eigene Erweiterung sogar als "critical" eingestuft und läuft nicht, dann ist der komplette SIP-Stack des Frontend-Servers nicht funktionsfähig. Wer schon mit Exchange gearbeitet hat, wird sich hier an die "OnArrival"-Events erinnert fühlen.
Warnung:
Diese Seite dient zur Information über die
Schnittstelle und deren Möglichkeiten als solche
aber darf nicht als "How-To" verstanden werden.
Ein falsches Zeichen kann sehr einfach den
kompletten Lync-Server außer Funktion setzen.
Wer damit Erfahrungen sammeln will, sollte dazu
eine komplett abgeschirmte TestUmgebung nutzen.
Wer aber das Risiko eingeht, wird mit der umfangreichsten Möglichkeit belohnt, die SIP-Meldungen auszuwerten oder sogar zu verändern. Allerdings muss er wissen, wo und über welchen Server die SIP-Meldungen laufen und das Skript bzw. Programm natürlich auf allen Servern ausführen lassen, auf denen solche Meldungen durchlaufen können. Das Skript bekommt die Meldungen noch ehe Sie durch die Lync Routing oder Normalisierung gelaufen sind. Da aber auch diese Lync-Programme selbst als MSPL-Skript geschrieben sind, können Sie über Priorität ein Reihenfolge hier alles durcheinander würfeln.
Die aktuell installierten Module pro Server können Sie recht einfach ermitteln.
Get-CsServerApplication `
-Filter "service:*poolname* `
| ft
Priority,Name,Enabled,Critical,Scriptname
Sie sehen also hier genau, in welcher Reihenfolge die entsprechenden Skripte abgearbeitet werden. Sie sehen aber auch, dass das Feld "Skriptname" leer ist. Sie können das auszuführende MSPL-Skript nämlich hier fix hinterlegen oder über Managed-Code im Betrieb einbinden. Die Priorität ist natürlich auch wichtig um die richtigen Daten zu erhalten. Wer eine normierte E164-Nummer erwartet, darf sich nicht zu früh einhängen. Wer sich aber zu spät einhängt, wird das ein oder andere Paket vielleicht gar nicht mehr sehen.
Einsatzbereiche
Sie wissen nun, dass solch ein Skript die SIP-Meldung lesen, verändern oder sogar mit einer andere Meldung beantworten kann. Damit haben Sie alle drei Optionen zur Wahl:
- Betrachten
Sie können die Meldungen einfach nur "ReadOnly" betrachten und ihre Schlüsse draus ziehen, z.B. Statistiken erstellen, Fehlermeldungen protokollieren oder auch die Inhalte abspeichern. Wer mag kann also sich schon seinen "Archivserver für Arm" oder "Monitoring Server für Anfänger" erstellen. Wer z.B. nur alle Verbindungen als "Einzelverbindungsnachweis" als CSV-Datei braucht, könnte mit wenig Aufwand dies realisieren. - Verändern
Interessant ist natürlich auch die Veränderung von eingehenden Paketen. Sie könnten an jede Meldung einen Disclaimer addieren oder zu einem eingehenden Ruf zu Rufnummer aus einer anderen Datenquelle (ERP, CRM) den Namen holen. Theoretisch könnte auch die Zieladresse abhängig vom Anrufer verändert werden. Globale "Blocklisten" für unerwünschte Anrufer wären so denkbar. Ebenso zentrale "Weiterleitungen" oder das Einfügen eine "AppID", damit auf dem Client der Lync Client die passende Erweiterung "nachholt" - Verwerfen
Ein SIP-Paket sollte man nie einfach "löschen". Aber sie können es natürlich mit einer eigenen Antwort quittieren und das ursprüngliche Ziel gar nicht informieren. Das wär z.B. der "Busy-Fall", d.h. ein Skript blockiert einen Zweitanruf.
Beachten Sie dabei aber immer, dass SIP keine SMTP ist. SIP ist "Echtzeit" und wenn eine Aktion ein paar Sekunden dauert, dann wird dieser Timeout schnell zu anderen Problemen führen. Die Zeit bis ein Server auf eine Meldung mit einer Antwort reagiert, sollte keinesfalls 10 Sekunden überschreiten, da dann sendende Systeme vielleicht einen Alternativweg suchen.
Ideen und Beispiele zu MSPL-Lösungen
Vielleicht wird der Einsatzbereich von MSPL etwas deutlicher, wenn ich ein paar Beispiele aufführe, was eine Serverapplikation mit einem SIP-Paket und einer Entscheidungslogik alles machen kann. Die ein oder andere Idee wird vielleicht zukünftig von einer Lösung umgesetzt. Daher ist das eine Tabelle.
Idee | Status |
---|---|
Error-Logger |
|
Poor mans QoE Collector |
|
CallDataRecord |
|
Callback on Fail |
|
Absender verbergen |
|
Busy on Busy |
|
OfflineIM |
|
SIP-Address |
|
Testbot |
|
RewriteCaller und AnonymCall |
|
Corporate
Adressbuch
Resolution |
|
Unterschiedliche
Ringtöne
|
|
Secondary
SIPAddress |
|
Das sind nur ein paar Beispiele.
Auch SIP-Meldungen an ungültige Adressen (User@server.irgndwas.com) kommen im Lync erst mal an. Wenn ihr Skript als "früh" genug einsortiert ist, können Sie solche Meldungen auch verarbeiten, ehe das interne Lync Routing diese verwirft.
SIP-Routing/Rewriting passiert immer auf dem Registrar, d.h. die SIP-Meldungen werden auf dem werden Registrar gleich "richtig" normalisiert und an den Ziel-Registrar zur Zustellung geleitet. Das muss man beachten, wenn ein Client die Meldung an seinem Homeserver oder einer SBA einstellt und man beim Mediation Server dann auf die Normalisierung hofft.pro
Skript oder Managed Code oder Server Application Module
Wer eine Lösung basierend auf MSPL schreiben will, muss sich überlegen, wie er als "TrustedApplication" sich im Lync Server integrieren will. Ich kenne drei Zugänge:
- MSPL-Skript
Ein einfaches Skript ist für erste Gehversuche nutzbar, da es passende Beispielcodes bei Microsoft in der MSDN gibt und man nichts anderes braucht als Notepad. Allerdings ist die Funktion natürlich beschränkt auf die wenigen von MSPL bereitgestellten Methoden. Auch ist ein Debugging nicht einfach. - MSPL-Skript mit ManagedAPI
Besser und Leistungsfähiger ist die Nutzung der ManagedAPI. Über ManagedCode können Sie auf alle Funktionen von Windows zugreifen. Das Skript ist im wesentlichen nur ein Rumpf, mit dem die gewünschten SIP-Meldungen abgefangen und an eine DLL übergeben werden. - Server Application Module
Bei der Analyse des Lync Dialog Listeners habe ich das erste mal eine Applikation gesehen, die ohne Skript auskommt und dennoch an die die Lync Dialoge kommt. Eine Beschreibung der API habe ich nicht gefunden aber auch diese Applikation muss vorab als CsTrustedApplication registriert werden.
Hier ein paar weiterführende Links.
Skript Only
Eine als Skript erstellte Logik ist eine Textdatei mit der Endung ".am", die bei der Registrierung der CsTrustedApplication mit angegeben wird.
- Writing a Message Filter
Script
http://msdn.microsoft.com/en-us/library/dd129957(v=office.13).aspx
Allerdings sind Sie bei einer "Script only" Lösung auch auf die Funktionen beschränkt, die die Script-Umgebung bereit stellt. Und die ist bei MSPL alles andere als umfangreich. Sie können nach extern gerade mal eine Textdatei einlesen und ins Eventlog schreiben schreiben. Eine Skriptversion ist also auf die Veränderung von SIP-Anfragen anhand einiger in der Anfrage selbst vorhandenen Kriterien beschränkt.
- MSPL Built-in Functions
http://msdn.microsoft.com/en-us/library/dd185855(v=office.13).aspx - MSPL Built-in Classes
http://msdn.microsoft.com/en-us/library/dd146876(v=office.13).aspx
Managed Code
Interessanter ist da schon die Arbeit mit "Managed Code". Das Skript ist dann nur noch für die Einbindung da und enthält im wesentlichen die Funktion "Dispatch"
- MSPL Function: Dispatch
http://msdn.microsoft.com/en-us/library/dd146563(v=office.13).aspx - Modifying SIP headers using
the Managed SIP Application API
http://blog.greenl.ee/2011/12/30/modifying-sip-headers-managed-sip-application-api/ - Haiko #144 CS server apps!
https://blogs.technet.com/b/csps/archive/2011/07/01/haiku144.aspx
In C# oder einer anderen Programmiersprache können Sie dann mit der SIP-Meldung sehr viel umfangreichere Aktionen ausüben und natürlich auch mit einem Debugger eleganter die Verarbeitung analysieren.
Machen Sie dies BITTE nicht mit dem produktiven System, denn der Debugger stoppt die Verarbeitung nachfolgender Meldungen.
Server Application Module
Hier habe ich
Skript einrichten
Ehe der Lync Server ein solches MSPL-Skript ausführt, muss dieses natürlich dort installiert werden. Wer mehrere FE-Server hat, muss das Skript natürlich auf allen Servern einrichten, die den Code auch ausführen sollen. Das ist nicht viel anders als ein Exchange Transportagent. Dabei hilft die PowerShell:
New-CsServerApplication
Wenn Sie eine "ScriptOnly" variante gewählt haben, dann müssen Sie hier natürlich noch den Pfad zum Skript hinterlegen und das Skript auch an den richtigen Platz legen.
Ich empfehle ihnen das Skript, wie alle anderen Skript in das Serververzeichnis zu lesen. Dann ist sichergestellt, dass der Server auch die Leserechte hat.
Hinweis2: Setzen Sie ein Skript nur dann auf "Kritisch", wenn Sie verhindern müssen, dass der Frontend-Dienst ohne Skript läuft. Das ist für die Lync-eigenen Komponenten und einen Virenscanner vielleicht sinnvoll, aber weniger für eine Auswerteapplikation. Da ist vielleicht die "Funktion" von Lync wichtiger.
Wenn Sie die "ManagedCode"-Variante nutzen, dann sollten Sie kein Skript angeben. Denn was hilft das Skript mit dem Dispatch, wenn das Programm nicht gestartet ist? Hier ist es am Programm beim Start das Skript in den Server einzubinden. Nach der Einrichtung des Skripts ist in der Regel ein Neustart des Frontend-Diensts erforderlich, um die Änderungen zu übernehmen.
- Get-CsServerApplication
http://technet.microsoft.com/de-de/library/gg425948.aspx -
New-CsServerApplication
http://technet.microsoft.com/de-de/library/gg398096.aspx -
Remove-CsServerApplication
http://technet.microsoft.com/de-de/library/gg398366.aspx -
Set-CsServerApplication
http://technet.microsoft.com/de-de/library/gg412850.aspx
Debugging und Monitoring
Skripte im "Herzen" eines Systems sind nicht immer einfach zu debuggen. Während der Entwicklungsphase sollte so etwas also "NIE" am Live-System erfolgen. Ich trennen das mal in drei Phasen auf:
- Einrichtung
Ob die Einrichtung erfolgreich war, sehen Sie schon beim Konfigurieren per PowerShell und wenn der Frontend wieder startet. Lync überprüft das Skript hier schon auf "Syntax" und lädt es gar nicht erst, wenn es einen Fehler erkennt. Das finden Sie recht einfach im Eventlog wieder - Überwachung
Wenn das Skript dann erfolgreich geladen wurde, dann möchte man natürlich auch sehen, dass es etwas tut. für den Anfang reichen da die Eventlog-Einträge und Debug-Ausgaben schon mal aus. Ich hoffe ihr Skript meldet nun nicht alle SIP-Meldungen sondern hat einen Filter in Form einer IF-Abfrage davor. Es reicht ja, wenn Sie nur ihre eigenen Meldungen filtern. - Fehlersuche
Wenn ihr Skript dann in die Wirkphase kommt und etwas verändert, dann wird es schon kniffliger. Mehr als ein paar "Debug-Ausgaben" gibt es bei einem Skript nicht, die man zudem noch selbst hineinschreiben muss. Und in interaktiver Debugger in Visual Studio verbietet sich auf dem produktiven System.
Ein guter Entwickler wird aber auch hier eine Wege finden und wird auf jeden Fall eine Fehlerbehandlung dergestalt einbauen, dass ein Code-Fehler im schlimmsten Fall das Paket unbearbeitet ziehen lässt.
- Installing and
troubleshooting MSPL scripts
http://blog.greenl.ee/2011/07/26/installing-troubleshooting-mspl-scripts/ - Deploying and
Troubleshooting Lync Server 2010
MSPL Applications
https://blogs.technet.microsoft.com/nexthop/2012/03/14/deploying-and-troubleshooting-lync-server-2010-mspl-applications/ - How to: Debug a Lync Server
SIP application
https://msdn.microsoft.com/en-us/library/office/dn439089.aspx
SimpleRoute für MSPL von Colima
Wer nicht gleich selbst mit Notepad oder Visual Studio loslegen will, kann vielleicht auch mit dem MSPL-Codegenerator von Colima erste erfolge verbuchen. Es gibt diesen als kostenfreie "Free" und als "Pro Version. Die Software orientiert sich schon am zukünftigen Metro-Design und erlaubt in der hier gezeigten "Free-Version" die Konfiguration einer Aktion abhängig von der Absenderadresse und dem Inhalt der Message.
Wenn Sie ihre "Regel" erstellt haben, dann speichern Sie diese einfach als AM-Datei ab. Diese müssen Sie dann natürlich auf den Lync Server bringen und dort registrieren. Aber auch hierbei werden Sie durch eine Beschreibung unterstützt.:
Insofern ist dies ganz einfach umzusetzen, wenn Sie mit den Lösungen zurecht kommen, die durch den Skript abgedeckt werden.
- Simpleroute für MSPL
http://www.colima.de/de/produkte/simpleroute_for_mspl.html - The Masses Can Now Make
Microsoft Lync MSPL Scripts Via
Free Tool from Colima
http://windowspbx.blogspot.de/2012/04/masses-can-now-make-microsoft-lync-mspl.html
Link zu MSPL-Code
Es gibt nicht allzu viele Codesamples und Projekte um MSPL. Vielleicht liegt es auch daran, dass die Entwicklung nicht ganz einfach und natürlich auch nicht ungefährlich ist. Eine falsches Komma und das Skript kann die komplette Lync Funktion stören. Daher sollten Sie auch die hier verlinkten Skripte erst einmal in einer TestUmgebung analysieren und mit Bedacht einsetzen. Viele "kleine Skripte" skalieren vielleicht nicht in größeren Umgebungen oder decken alle Fälle mit Director, Pool und Proxy ab.
- Lync MSPL “Busy Here” Script
Project
http://voipnorm.blogspot.de/2012/02/lync-mspl-busy-on-busy-script-project.html - Extending Lync Server
routing with MSPL
http://blog.greenl.ee/2011/07/08/extending-lync-server-routing-with-mspl-part-1/
http://blog.greenl.ee/tag/mspl/ - ng SIP requests in an MSPL
script
http://blog.greenl.ee/2012/01/17/forking-sip-requests-mspl-script/ - Rerouting requests to a UCMA
application with MSPL
http://blog.greenl.ee/2011/09/04/rerouting-requests-ucma-application-mspl/ - Lync Development by Michael
Greenlee
http://blog.greenl.ee/tag/mspl/ - Installing and
troubleshooting MSPL scripts
http://blog.greenl.ee/2011/07/26/installing-troubleshooting-mspl-scripts/ - http://blog.greenl.ee/2011/12/30/modifying-sip-headers-managed-sip-application-api/
-
Re-routing Incoming Lync Calls
to AutoAttendant using MSPL
Scripting
http://ucken.blogspot.de/2012/02/re-routing-incoming-calls-to.html
Weitere Links
Lync Server 2010 SDK Content
Notification Sample Walkthrough
http://gotuc.net/gotuc-blog/lync-server-2010-sdk-content-notification-sample-walkthrough
VIDEO: Installing and
configuring an MSPL script
http://blog.greenl.ee/2012/02/09/video-installing-configuring-mspl-script/
- Microsoft SIP Processing
Language
http://msdn.microsoft.com/en-us/library/dd146556(v=office.13).aspx - Writing a Message Filter
Script
http://msdn.microsoft.com/en-us/library/dd129957(v=office.13).aspx - MSPL Built-in Functions
http://msdn.microsoft.com/en-us/library/dd185855(v=office.13).aspx - MSPL Built-in Classes
http://msdn.microsoft.com/en-us/library/dd146876(v=office.13).aspx - MSPL Function: Dispatch
http://msdn.microsoft.com/en-us/library/dd146563(v=office.13).aspx - Blocking File Transfers to
Federated Users using Lync MSPL
Scripts
http://voipnorm.blogspot.com/2011/08/blocking-file-transfers-to-federated.html - Blocking Calls in Lync Based
on Caller ID
http://voipnorm.blogspot.com/2011/06/blocking-calls-in-lync-based-on-caller.html - Route International calls to
an alternative Workflow (MSPL)
http://www.lynclog.com/2011/03/route-international-calls-to.html - Distinctive ring tone with
OCS
http://www.lynclog.com/2010/02/distinctive-ring-tone-with-ocs.html - How to: Create an MSPL
script
http://msdn.microsoft.com/en-us/library/lync/hh347210.aspx - http://voipnorm.blogspot.com/2011/08/blocking-file-transfers-to-federated.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+VoipnormsUnifiedCommunicationsBlog+%28VoIPNorm%27s+Unified+Communications+Blog%29
- Installing and troubleshooting MSPL scripts
http://blog.greenl.ee/2011/07/26/installing-troubleshooting-mspl-scripts/ - http://blog.greenl.ee/category/mspl/
- New-CsServerApplication
http://technet.microsoft.com/en-us/library/gg398096.aspx - MSPL: View Microsoft SIP
Processing Language (MSPL)
Server Applications
http://technet.microsoft.com/en-us/library/gg182575.aspx - MSPL: Blocking File
Transfers to Federated Users using Lync MSPL Scripts
http://voipnorm.blogspot.com/2011/08/blocking-file-transfers-to-federated.html - MSPL: Enable or Disable a
Microsoft SIP Processing
Language (MSPL) Server
Application
http://technet.microsoft.com/en-us/library/gg182573.aspx - MSPL: Route International
calls to an alternative Workflow
(MSPL)
http://www.lynclog.com/2011/03/route-international-calls-to.html - Protecting the Edge Server
Against DoS and Password Brute-Force
Attacks in Lync Server 2010
http://technet.microsoft.com/en-us/hh180551
Based on MSPL - Rewrite "P-Asserted-Identity"
with MSPL
http://social.msdn.microsoft.com/Forums/en-US/communicationsserversdk/thread/d50934db-3d93-49db-97d9-938d6d00f37c