PRTG und Teamviewer

Mit der Firma TeamViewer dürften die meisten Administratoren schon einmal etwas zu tun gehabt haben. Wenn Sie als Dienstleister aber aktiv Teamviewer nutzen, dann ist es schon interessant, wie viele Lizenzen sie nutzen, denn dies ist durchaus ein Kostenfaktor. Entsprechend wollten wie mit PRTG die aktuelle Nutzung protokollieren und sichtbar machen. Dabei gab es auch eine kleine Überraschung bezüglich der Zählweise von Teamviewer.

Die Vorarbeiten, Programmierung und Umsetzung wurde durch Rene Haus bei Net at Work geleistet.

Teamviewer API

Zuerst stellt sich die Frage, wie ein Skript an die Informationen kommt. TeamViewer bietet eine eigene API (https://dl.tvcdn.de/integrate/TeamViewer_API_Documentation.pdf), welche über HTTP angesprochen werden kann. Als Authentifizierung kommt ein OAUTH-Token zum Einsatz, welches ein Administrator vorab erstellen muss. Das Token kann sowohl für Nutzer als auch Organisationsebene angelegt werden. Für den hier betrachteten Fall benötigen wir ein Organisations-Token mit dem Recht, alle Verbindungsprotokolle zu lesen.

Der Administrator startet dazu die TeamViewer-Management Konsole und verwaltet die Firma:

Unter Apps klicken Sie auf "Skript-Token erstellen" und legen ihr Skript an. Gewähren Sie dem Skript das Recht „Verbindungsprotokolle lesen“ und notieren Sie sich das Token.

Das Token läuft nie ab. Behandeln Sie es einfach wie eine Kombination aus Benutzername + Kennwort mit 28 Stellen, welches nur die Nutzung der API mit den gewährten Rechten erlaubt aber keinen Zugang zur Webseite o.ä. ermöglicht.

Die Information über die Verbindungen erhalten wir unter der URL /api/v1/reports/connections interessant.


Quelle:  https://dl.tvcdn.de/integrate/TeamViewer_API_Documentation.pdf  Punkt 4.6.1)

Mit folgendem kurzen Beispiel können dann die Sessions der letzten 24h abgerufen werden.

$user_token = "Hier das Token eintragen"
$Header = @{ 'Authorization' = "Bearer $user_token"}
$startdate = get-date (get-date).AddDays(-1) -UFormat '+%Y-%m-%dT%H:%M:%SZ'

$request = Invoke-RestMethod `
   -Uri "https://webapi.teamviewer.com/api/v1/reports/connections?from_date=$($startdate)" `
   -Method GET `
   -Headers $header

Zurück kommt dann eine JSON-Struktur, die aus einer Auflistung von Records besteht, die ebenso einfach abzufragen ist

$request.records.Count
5

$request.records[0]

id            : 12345678-1234-1234-1234-1234567890ab
userid        : u12345678
username      : MSXFAQ
deviceid      : 876543210
start_date    : 2019-11-08T16:03:03Z
end_date      : 2019-11-08T16:08:55Z
fee           : 0,00
currency      : None
billing_state : Bill

Eine noch aktive laufende Session hat kein Ende-Datum. Eine Tabelle bekommen Sie dann einfach mit

$request.records `
| where {$_.end_date -eq $null} `
| ft username,start_date,end_date

username     start_date           end_date
--------     ----------           --------
MSXFAQ       2019-11-08T17:03:03Z        
MSXFAQ       2019-11-08T15:17:50Z        

Hier habe ich anscheinend zwei Sitzungen offen.

PRTG Sensor

Es gibt von PRTG schon einen PRTG JSON-Sensor, aber ich habe noch nicht rausgefunden, wie ich damit die JSON-Datei filtern und die Einträge zählen kann. Daher kommt aktuell noch ein PowerShell-Script zum Einsatz, welches von einer PRTG Probe regelmäßig gestartet wird und die Daten als PRTG - Custom Sensor zurück gibt. Der Beispielcode von oben wird durch folgende Zeilen erweitert.

$value = ($request.records `
                     | Where-Object {($_.end_date -eq $null) `
                                     -and ((get-date $_.start_date ) -gt (get-date).AddHours(-1))}`
                     | Group-Object username `
          ).count

write-host "<prtg>"
   write-host "<result>"
      write-host "<channel>Active Sessions</channel>"
      write-host "<value>$(($request.records | where end_date -eq $null | select username, start_date, End_date).count)</value>"
   write-host "</result>"
   write-host "<result>"
      write-host "<channel>Channels in use</channel>"
      write-host "<value>$($value)</value>"
   write-host "</result>"
   write-host "<text>Last Run : $(get-date)</text>"
write-host "</prtg>"

Die so an PRTG übergebene XML-Struktur wird in PRGT dann einfach angezeigt.

Das ist nur ein Auszug. Über den Tag oder Wochen sind die Daten noch interessanter.

Channel <> Session

Wenn Sie das Bild genauer anschauen, dann sehen Sie aber, dass hier einmal "Active Sessions" und "Channels in use" ausgewiesen werden. Bei der Überprüfung der Werte ist meinem Kollegen aufgefallen, dass in der Management-Oberfläche von TeamViewer weniger "belegte Lizenzen" angezeigt werden, als in den aktiven Sitzungen zu sehen sind:

Eine Bestätigung von Teamviewer haben wir dazu nicht eingeholt aber es hat den Anschein, dass nur Verbindungen gezählt werden, die kürzer als 1 Stunde aktiv sind. Alle schon länger bestehenden Verbindungen werden nicht mehr als aktive Lizenz gezählt. Allerdings ist es nur eine theoretische Lücke, über die sie mehr Verbindungen parallel bestehen lassen können als Lizenzen vorhanden sind. Die meisten Fernwartung-Sitzungen sind ja doch kürzer und werden damit richtig gezählt. Ich tippe eher darauf, dass Teamviewer früher vielleicht Probleme beim Zählen hatte, wenn Verbindungen nicht korrekt abgebaut worden sind.

Das bedeutet aber auch, dass ich im Sensor gar nicht den kompletten Tag abrufen müsste, sondern für eine echte Lizenzzählung nur die letzten 60 Minuten benötigt. Allerdings sehe ich dann auch keine "Langläufer"-Sitzungen mehr.

Im Umkehrschluss hat aber ein Benutzer immer nur eine Lizenz belegt, auch wenn er sich zu mehreren Gegenstellen gleichzeitig verbindet. Damit die Lizenz dann nicht zählt, müsste der Anwender immer alle Sitzungen über eine Stunde nutzen. Das ist im realen Einsatz eher unwahrscheinlich. Andere Anbieter berechnen hier ungünstiger, indem Sie "pro Verbindungsminute" abrechnen.

Weiterentwicklung

Aktuell funktioniert der Server so ganz ordentlich aber aus der Tabelle mit den Benutzern und Sitzungen könnte man natürlich durchaus noch weitere Informationen extrahieren. So wären die "Sitzungsminuten" durchaus ein interessanter Ansatz um die Auslastung des Supports über den Tag zu ermitteln. Vorsichtig sollten Sie aber damit sein, wenn Sie anfangen die Daten pro Benutzer aufzuschlüsseln. Technisch wäre es ein Leichtes, die Supporter zu erfassen, wann er wie viele Sessions geöffnet hat. Das ist aber, wie die Präsenz bei Skype, nur eine bedingte Aussagekraft. Nicht jeder Support-Aktion setzt auch eine Fernwartung ein.

Weitere Links