{"id":3374,"date":"2022-01-24T16:30:46","date_gmt":"2022-01-24T15:30:46","guid":{"rendered":"https:\/\/www.mariotti.de\/?p=3374"},"modified":"2022-01-24T16:30:46","modified_gmt":"2022-01-24T15:30:46","slug":"citrix-configuration-logging-abfragen-via-powershell-statt-citrix-studio","status":"publish","type":"post","link":"https:\/\/dev.mariotti.de\/?p=3374","title":{"rendered":"Citrix Configuration Logging Abfragen via PowerShell statt Citrix Studio"},"content":{"rendered":"<p>Die Citrix Studio Konsole ist bzgl. der Abfrage der Eintr\u00e4ge aus der Configuration Logging Datenbank leider relativ limitiert, man kann das Suchergebnis lediglich auf eine bestimmte Anzahl von Tage<br \/>\neinschr\u00e4nken, und es gibt eine Freitextsuche die jedoch nur im oberen Fenster mit der Zusammenfassung suchen kann, jedoch keine Treffer liefert auf Suchw\u00f6rter die im unteren Detail Fenster vorkommen. Dies ist vor allem dann \u00e4rgerlich, wenn man Aktionen gegen viele Maschinen durchf\u00fchrt hat, und hierf\u00fcr nur eine zusammenfassender Eintrag ins obere Log geschrieben wurde, und man nach den Maschinennamen nicht suche kann, das dieser als Detail\u00a0 im Log versteckt. Die Problematik ist von Citrix auch in folgendem KB Artikel beschrieben: <a href=\"https:\/\/support.citrix.com\/article\/CTX138132\" target=\"_blank\" rel=\"noopener\">https:\/\/support.citrix.com\/article\/CTX138132<\/a><\/p>\n<p>Wer andere Abfragen machen will also jene die via Citrix Studio m\u00f6glich sind kann dies mittels PowerShell machen. Die Befehle hierzu lauten Get-LogHighLevelOperation und Get-LogLowLevelOperation, wobei der erstgenannte Befehl f\u00fcr die Eintr\u00e4ge der Zusammenfassung (oberes Fenster im Studio) und der zweite Befehl f\u00fcr die Details (unteres Fenster)<\/p>\n<p>Diese und weiter Befehle zum Configuration Logging sind im SDK unter folgender URL beschrieben:<br \/>\n<a href=\"https:\/\/developer-docs.citrix.com\/projects\/citrix-virtual-apps-desktops-sdk\/en\/1808\/ConfigurationLogging\/about_LogConfigurationLoggingSnapin\/\" target=\"_blank\" rel=\"noopener\">https:\/\/developer-docs.citrix.com\/projects\/citrix-virtual-apps-desktops-sdk\/en\/1808\/ConfigurationLogging\/about_LogConfigurationLoggingSnapin\/<\/a><\/p>\n<p>Wichtig zu wissen ist, dass beide Befehle einen &#8222;-Filter&#8220; Parameter unterst\u00fctzen, der auch genutzt werden sollte um die Abfragen effektiv zu machen. Eine Abfrage ohne -Filter Parameter und sp\u00e4teres filtern mittels z.B. Where-Object empfiehlt sich nicht, da ineffektiv vor allem bei gr\u00f6\u00dferer Datenmenge. Sollte man mehr wie 256 Eintr\u00e4ge als Ergebnis erwarten muss man auch den Parameter -MaxRecordCount mit einem entsprechenden Wert nutzen.<\/p>\n<p>Nun genug der Vorworte, hier nur ein paar PowerShell Beispiele f\u00fcr entsprechende Abfragen:<\/p>\n<pre><code class=\"language-powershell\">\n# Alle Eintr\u00e4ge des High &amp; Low Level Log einer bestimmten Zeitspanne auflisten:\nGet-LogHighLevelOperation -Filter{ StartTime -ge \"2022-01-01 00:00:00\" -and EndTime -le \"2022-12-31 23:59:59\"} | Sort-Object StartTime | Format-Table StartTime,User,Text\nGet-LogLowLevelOperation -Filter{ StartTime -ge \"2022-01-01 00:00:00\" -and EndTime -le \"2022-12-31 23:59:59\"} | Sort-Object StartTime | Format-Table StartTime,User,Text\n\n# Alle Eintr\u00e4ge des High &amp; Low Level Log die von einem bestimmten Benutzer durchgef\u00fchrt wurden auflisten:\nGet-LogHighLevelOperation -User \"MeinBenutzer\" | Sort-Object StartTime | Format-Table StartTime,User,Text\nGet-LogLowLevelOperation -User \"MeinBenutzer\" | Sort-Object StartTime | Format-Table StartTime,User,Text\n\n# Textfeld aller Low Level Eintr\u00e4ge nach einem Suchwort wie z.B. einem Rechnernamen durchsuchen, als Suchwort kann ein beliebiger Text verwendet werden, wie Machinenname, Benutzername, Aktionen wie Maintenance Mode, etc.\nGet-LogHighLevelOperation -Filter { Text -like \"*MeinSuchwort*\"} | Sort-Object StartTime | Format-Table StartTime,User,Text\nGet-LogLowLevelOperation -Filter { Text -like \"*MeinSuchwort*\"} | Sort-Object StartTime | Format-Table StartTime,User,Text\n\n# Abfrage des High Level Log mit Suchwort und aber einer Startzeit, danach zugeh\u00f6rigem Low Level Log Eintrag mit weiteren Details abfragen und ausgeben:\n$HighLevelResults = Get-LogHighLevelOperation -Filter { StartTime -ge \"2022-01-01 00:00:00\" -and Text -like \"*MeinSuchwort*\"} \nforeach ($HighLevelResult in $HighLevelResults)\n{\n    Write-host $HighLevelResult.StartTime $HighLevelResult.User $HighLevelResult.Text -ForegroundColor Yellow\n    $Details = (Get-LogLowLevelOperation -HighLevelOperationId $HighLevelResult.Id).Details\n    foreach ($Detail in $Details)\n    {\n        Write-host $Detail.StartTime $HighLevelResult.User $Detail.Text -ForegroundColor DarkYellow    \n    }\n}\n\n# Beispielhafter Configuration Logging Export als CSV Datei\nExport-LogReportCsv -OutputFile \"C:\\temp\\Resport.csv\" -StartDateRange \"2022-01-01 00:00\"\n\n# Beispielhafter Configuration Logging Export als HTML Report, wobei die Summary.Html das High Level und die Details.Html das Low Level darstellt.\nExport-LogReportHtml -OutputDirectory \"c:\\temp\" -StartDateRange \"2022-01-01 00:00\"\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Die Citrix Studio Konsole ist bzgl. der Abfrage der Eintr\u00e4ge aus der Configuration Logging Datenbank leider relativ limitiert, ich zeige Alternative M\u00f6glichkeiten mittels PowerShell und dem Get-LogHighLevelOperation und Get-LogLowLevelOperation Cmdlet<\/p>\n","protected":false},"author":2,"featured_media":2347,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35,34,37],"tags":[],"class_list":["post-3374","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-citrix","category-it","category-powershell"],"_links":{"self":[{"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=\/wp\/v2\/posts\/3374","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3374"}],"version-history":[{"count":0,"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=\/wp\/v2\/posts\/3374\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=\/wp\/v2\/media\/2347"}],"wp:attachment":[{"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}