Citrix, DocuSnap und die Monitor Service API

Citrix Monitoring Service API / OData

Einer meiner sehr geschätzten Kollegen beschäftigt sich derzeit mit DocuSnap zur Inventarisierung und Dokumentation unser Citrix- bzw. Kundenumgebungen.

Nach ein wenig Recherche fiel auf, dass der Hersteller den Wunsch einer Citrix-Implementierung in seine DocuSnap Software bereits auf der Feature Request Liste hat. Eine Umsetzung scheint es noch nicht zu geben. 🙁 Da wir sehr begnügsame Menschen sind, war ein erster Plan täglich eine Auswertung zu generieren, die uns die Zugreifenden Geräte (ClientName), deren IP-Adressen (ClientAddress), die dazugehörigen Citrix Receiver / Workspace App Versionen (ClientVersion) sowie das darunterliegende Betriebssystem (ClientPlatform) ermittelt.

Ein erster Ansatz war mit „Get-BrokerSession“ gefunden. Damit bekommen wir allerdings nur den Ist-Stand und müssten die Daten über den Tag sammeln und wären uns nie sicher, ob jede Session erfasst wurde -> Die Überlegungen gingen weiter… Der nächste Ansatz zielte auf die ohnehin vorhandene Citrix Monitoring Datenbank. – Treffer! Also größtenteils.

Während weiterer Recherche zum Thema „Monitoring Database“ stießen wir auf die „Monitor Service OData API“ bzw. deren Implementierung seitens Citrix. Der Artikel beschreibt relativ gut und ausführlich, was Citrix sich zu dieser Schnittstelle gedacht hat und wie sie in zwei Parts eingerichtet wird. Vorweg: Der Part I wurde in den ersten Tests noch nicht umgesetzt und wird nachgereicht. Daher Part II:

## Einmalig zur Einrichtung auf einem beliebigen Delivery Controller ausführen
# Citrix SnapIn Laden
Add-PSSnapin Citrix*

$serviceGroup = Get-ConfigRegisteredServiceInstance -ServiceType Monitor | Select -First 1 ServiceGroupUid
Remove-ConfigServiceGroup -ServiceGroupUid $serviceGroup.ServiceGroupUid
## Einmalig zur Einrichtung auf allen Delivery Controllern ausführen
# Citrix SnapIn Laden
Add-PSSnapin Citrix*

Start-Process -FilePath $($env:ProgramFiles + "\Citrix\Monitor\Service\Citrix.Monitor.Exe") -ArgumentList "-CONFIGUREFIREWALL -ODataPort 449 -RequireODataSsl" -Wait
Get-MonitorServiceInstance | Register-ConfigServiceInstance
Get-ConfigRegisteredServiceInstance -ServiceType Config | Reset-MonitorServiceGroupMembership

An dieser Stelle ist die OData Schnittstelle bzw. die Citrix Monitor Service API einsatzbereit und kann mittels Aufruf im Browser getestet werden: „http://<Delivery Controller>/Citrix/Monitor/OData/v4/Data/Catalogs“

Eine Übersicht der möglichen Data Sets findet sich auf der oben verlinkten Seite bzw. auch hier: https://developer-docs.citrix.com/projects/monitor-service-odata-api/en/latest/#appendix

Die ersten Tests zum täglichen Auslesen der Daten mittels PowerShell verliefen ganz gut. Dafür wurde die „Logik“ in PowerShell gebaut und sämtliche Daten per OData Schnittstelle abgefragt und in PowerShell zusammensortiert. Das funktionierte, war aber eher langsam. Beim Einlesen in „OData“ fand sich die OData-Dokumentation und es stellte sich heraus, dass OData ähnlich SQL befragt werden kann. Da wir uns, wie oben erwähnt, vorerst auf die Verbindungen konzentrieren benötigen wir das „Connections“ Data Set:

http://<Delivery Controller>/Citrix/Monitor/OData/v4/Data/Connections

Represents an initial connection or reconnect for a session

https://developer-docs.citrix.com/projects/monitor-service-odata-api/en/latest/#appendix

Im PowerShell Script benötigen wir dann nur noch:

## Daten der OData Api laden und verarbeiten
<#
Referenz aus https://developer-docs.citrix.com/projects/monitor-service-odata-api/en/latest/#appendix
#>
$QueryDate = (Get-Date).AddDays(-1)
$ODataQuery = $("http://" + $env:COMPUTERNAME + "/Citrix/Monitor/OData/v4/Data/Connections?`$filter=Protocol ne 'RDP' and day(EstablishmentDate) eq " + $QueryDate.Day + " and month(EstablishmentDate) eq " + $QueryDate.Month + "&`$select=ClientName,ClientAddress,ClientVersion,ClientPlatform")
$ODataOutput = Invoke-RestMethod -Uri $ODataQuery -UseDefaultCredentials | Select-Object -ExpandProperty Value
$ODataOutput | Sort-Object ClientName -Unique | Export-Csv C:\install\DOCU-Citrix.csv -Encoding UTF8 -NoTypeInformation -Force

Was ist passiert?

  • Das gestrige Datum wird ermittelt
  • Die OData Abfrage wird dynamisch erstellt
    • Das Script läuft auf einem Delivery Controller, daher verwenden wir den Computernamen ($env:COMPUTERNAME)
    • In OData wird über ‚Protocol‘ auf nicht RDP ($filter=Protocol ne ‚RDP‘) gefiltert, um die RDP-Admin-Sitzungen auszuschließen
    • Ebenfalls (and) wird auf den gestrigen Tag per ‚EstablishmentDate‘ (day(EstablishmentDate) eq $QueryDate.Day) und Monat (month(EstablishmentDate) eq $QueryDate.Month) gefiltert
    • Da uns nur wenige Eigenschaften interessieren, wählen wir diese aus ($select=ClientName,ClientAddress,ClientVersion,ClientPlatform)
    • Die Dollar Zeichen ($) müssen in einem String in PowerShell mittels Backquote (`) maskiert werden!
  • Die Invoke-RestMethod bekommt die Abfrage Uri sowie die Credentials des ausführenden Users und schreibt das Ergebnis in eine Variable
  • Die Variable wird mittels „Export-CSV“ ins Dateisystem geschrieben

Die gesuchte Lösung noch nicht gefunden oder benötigen Sie Hilfe bei anderen Themen aus meinem Blog? Nehmen Sie gerne Kontakt mit mir bzw. meinem Unternehmen Jan Mischo IT auf. Ich freue mich auf Ihre Anfrage: https://janmischo.it/kontakt/


+49 2801 7004300

info@janmischo.it


Beitrag veröffentlicht

in

, , , ,

von

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.