Jetzt testen

Fehlerbehebung bei CITRIX Virtual Apps und Desktops mit PowerShell

Inhaltsverzeichnis

Post Featured Image

Wenn ich Citrix Virtual Apps and Desktops (CVAD)-Umgebungen von Kunden kontrolliere oder anderweitig damit arbeite, verwende ich oft die PowerShell-Konsole und -Scripte, um die notwendigen Informationen abzurufen und Aktionen auszuführen. Meiner Erfahrung nach geht es so einfacher und schneller, als wenn ich die unterschiedlichen Citrix- oder Microsoft-Konsolen für die verschiedenen Vorgänge nutze. In diesem Beitrag zeige ich Ihnen einige der Befehle und Parameter, die ich dafür nutze.

Das Schöne an PowerShell ist: sobald Sie wissen, wie Sie mit einem Objekttyp, der von einer PowerShell-Funktion oder einem Cmdlet zurückgegeben wird, filtern, sortieren, anzeigen usw. können Sie dieses Wissen verwenden, um mit praktisch jedem anderen Cmdlet von jedem anderen Anbieter zu arbeiten – die manchmal steile Lernkurve lohnt sich!

 

Voraussetzungen

In einer CVAD-Umgebung benötigen wir die CVAD PowerShell-Cmdlets, die bei der Installation von Citrix Studio installiert werden.  Die msi-Installationsdateien für diese Cmdlets sind außerdem separat auf der CVAD-Installations-ISO vorhanden, sodass sie auf Wunsch auch ohne Studio installiert werden können.

Normalerweise installiere ich die Cmdlets auf einer „Jump Box“ und nicht direkt auf einem Delivery Controller, da dies Ressourcen- und Stabilitätsprobleme mit sich bringen kann („Ups, ich habe den falschen Rechner neu gestartet“, hat natürlich noch kein Admin gesagt).

Der einfachste Weg, die benötigten Cmdlets zu erhalten, ist, einfach alles zu laden. Ich würde jedoch vor allem im Rahmen eines Scripts empfehlen, nur die Module hinzuzufügen, die Sie tatsächlich benötigen (über Get-Command können Sie herausfinden, in welchem Modul sich ein bestimmtes Cmdlet befindet).  In 1912 LTSR und höher führen wir Folgendes aus:

Import-Module -Name Citrix*
(oder kurz ipmo Citrix*, wobei „ipmo“ das Alias für „Import-Module“ ist).

Für frühere Versionen, in denen keine Module verfügbar waren, führen wir Folgendes aus

Add-PSSnapin -Name Citrix*
(kurz: asnp Citrix*, wobei „asnp“ das Alias für „Add-PSSnapin“ ist)

Beachten Sie, dass Sie bei Verwendung der Citrix Cloud das Remote PowerShell SDK verwenden müssen und nicht Studio oder die MSIs aus der CVAD-ISO.

Eine weitere Sache, die Sie beachten, müssen wenn Sie das Ganze nicht auf einem Delivery Controller ausführen – wovon ich abrate – ist, dass Sie -AdminAddress an die CVAD-Cmdlets zusammen mit dem Namen/der Adresse eines Delivery Controllers übergeben müssen.

Wenn Sie Citrix Cloud verwenden, muss das Argument für -AdminAddress ein On-Premises-Cloud-Connector sein. Ich bin mir sicher, dass ich irgendwo in der Citrix-Dokumentation gelesen habe, dass Sie es nur einmal angeben müssen, aber ich hatte Probleme damit, also gebe ich es für jedes aufgerufene CVAD-Cmdlet an, wenn auch normalerweise über eine Hashtabelle mit der PowerShell-„Splatting“-Funktion. So kann ich es an einer Stelle ändern oder einen zusätzlichen allgemeinen Parameter hinzufügen, wenn ich es ändern muss.

Ein weiterer potenzieller Fallstrick könnte sein, dass die Citrix-Cmdlets standardmäßig nur 250 Datensätze zurückgeben. Wenn Sie also in einer großen Umgebung arbeiten, in Bezug auf Anwender, VDAs, Bereitstellungsgruppen usw., müssen Sie möglicherweise -MaxRecordCount einsetzen und eine ausreichend große Zahl eingeben, wie unten in Abbildung 1 gezeigt (denken Sie daran, dass Sie auch hier per Tabulator vervollständigen können, also geben Sie -max ein und drücken Sie die Tabulatortaste).

Screenshot: Enhancing the scope of the command with -MaxRecordCount

Abb. 1: Mit -MaxRecordCount können Sie mehr als die standardmäßigen 250 Datensätze zurückgeben lassen

Noch ein Hinweis: In einigen der Beispiele verwende ich eine Variable vom Typ String namens „ddc“, die ich als einen der Delivery Controller festgelegt habe, damit ich dessen Namen in den Screenshots nicht preisgebe.


Informationen abrufen

Im folgenden Abschnitt finden Sie einige abfragen, die für die Fehlerbehebung in CVAD hilfreich sein können, wobei Sie beachten sollten, dass die meisten mit Get-Broker beginnen. Um zu sehen, welche Cmdlets verfügbar sind, können Sie Folgendes ausführen

Get-Command Get-Broker*
Führen Sie die obige Abfrage über Out-GridView (alias ogv) aus, um die Ausgabe in einer praktischen, filterbaren und sortierbaren Tabelle anzuzeigen.

Alternativ können Sie Get-Broker eingeben und entweder die Tabulatortaste drücken, um die Liste der Befehle zu durchlaufen, oder die Tastenkombination Strg+Leertaste drücken, um eine mit dem Cursor auswählbare Liste anzuzeigen, wie sie in Abbildung 2 zu sehen ist.

Screenshot: List of available cmdlets in the Citrix Module

Fig. 2: Get-Broker brings up a cursor selectable list of all available cmdlets

Sie können auch das Get-Help mit den optionalen Parametern ShowWindow oder -OnLine verwenden, um weitere Details und Beispiele für die Verwendung anzuzeigen.

 

A1. Wie viele Sitzungen gibt es insgesamt, einschließlich verbundener und nicht verbundener Sitzungen?

Get-BrokerSession -AdminAddress $ddc -MaxRecordCount 10000 | measure | select count

 

A2. Wie sieht die Aufschlüsselung von aktiven und nicht verbundenen Sitzungen aus?

Get-BrokerSession @commonCVADparameters | Group-Object -Property SessionState

Screenshot of the command used to display a breakdown of active versus disconnected sessions

Fig. 3: Output of the Command described above

The “Connected” state is where there is a logon in progress.

 

Der Zustand „Verbunden“ bedeutet, dass eine Anmeldung stattfindet.

A3. Welche verbundenen Sitzungen waren länger als 30 Minuten im Leerlauf?

$activeSessions = Get-BrokerSession @commonCVADparameters -SessionState Active

$activeSessions|where IdleDuration -gt "00:30:00" | select machinename,username,client*,starttime,idle* | Out-GridView

Beachten Sie, dass wir hier alle aktiven Sitzungen, also nicht getrennte, abrufen und in einer Variablen speichern. Auf diese Weise können wir eine Analyse dieser Daten durchführen, ohne sie wiederholt abrufen zu müssen, obwohl der Nachteil ist, dass die Daten nicht automatisch aktualisiert werden.

Beachten Sie auch, dass wir im Cmdlet selbst filtern (-SessionState), wo möglich, und nicht über die Pipeline durch Where-Object (Alias where oder ?), da dies schneller geht, als wenn Where-Object die gesamte Ergebnismenge abzurufen und erst dann zu filtern.
Das Ergebnis dieser Abfrage sehen Sie in Abbildung 4:

Screenshot: A list of all active sessions

Abb. 4: Mit dem oben beschriebenen Befehl wird eine Liste mit allen aktiven Sitzungen angezeigt

 

A4. Wann und wo hat sich der Anwender billybob angemeldet?

Get-BrokerSession -UserName guyrleechbillybob @commonCVADparameters | select machinename,client*,DesktopGroupNam
Screenshot: Login information of a certain user

Abb. 5: Mit dem oben beschriebenen Befehl erhalten Sie Informationen über die letzte Anmeldung eines bestimmten Anwenders

 

A5. Wie viele Rechner sind pro Auslieferungsgruppe registriert und nicht im Wartungsmodus?

Get-BrokerMachine -InMaintenanceMode $false -RegistrationState Registered @commonCVADparameters | group DesktopGroupName|select count,name|sort count

Screenshot: List of all CVAD Machines that are registered and not in maintenance mode, sorted by delivery group

Abb. 6: Liste aller CVAD-Rechner, die registriert und nicht im Wartungsmodus sind, sortiert nach Delivery Group

 

A6: Welche Maschinen haben die meisten Benutzersitzungen? Gibt es eine überlastete Maschine oder ist die Lastverteilung in Ordnung?

Get-BrokerMachine @commonCVADparameters | Sort SessionCount -Descending | select -first 10 machinename, sessioncount, DesktopGroupName, last* | Out-GridView

Screenshot of Citrix Studio, displaying a list of the maxhines with the most user sessions

Abb. 7: Liste der Maschinen mit den meisten Benutzersitzungen in Citrix Studio

 

A7. Liefergruppenstatistik anzeigen

Get-BrokerDesktopGroup | select Name,Desktop*,Enabled,InMaintenanceMode,Total* | ogv -PassThru

Screenshot of Delivery group statistics in Citrix Studio

Abb. 8: Delivery Group-Statistik in Citrix Studio

Beachten Sie die Verwendung von -PassThru zu Out-GridView, wodurch die ausgewählten Elemente in der Grid-Ansicht durch Drücken von „OK“ dort verfügbar gemacht werden, von wo aus das Cmdlet aufgerufen wurde.

Alternativ können sie über Set-ClipBoard (Alias scb) weitergegeben werden, sodass die Daten in Notepad, eine E-Mail, OneNote, Änderungskontrollnotizen usw. eingefügt werden können.

Screenshot: Delivery Group Statistics pasted into Notepad

Abb. 9: Sie können die Daten über Set-ClipBoard in Notepad einfügen


Aktionen ausführen

In den meisten Fällen können wir die Ergebnisse aus den vorherigen Abfragen über die Pipeline in Cmdlets einfügen, um Aktionen durchzuführen. Stellen Sie jedoch sicher, dass Sie die Auswirkungen der Aktion kennen, die Sie durchführen, und dass Sie sie nur auf ausgewählten Sitzungen/Benutzern, Maschinen usw. anwenden, anstatt z. B. alle 5000+ aktuellen Sitzungen abzumelden und nicht nur den einen Benutzer, der ein Problem hat!

Aktivieren des Wartungsmodus

Set-BrokerMachine -MachineName GUYRLEECH\GLXA19PVS41 -InMaintenanceMode $true
Man kann auch die Ergebnisse von Get-BrokerMachine in Set-BrokerMachine einspeisen.

Anwender benachrichtigen

Sie können sogar eine benutzerdefinierte Benachrichtigung über Send-BrokerSessionMessage erstellen, wie in Abbildung 10 zu sehen ist.

Get-BrokerSession -MachineName GUYRLEECH\GLXA19PVS41 @commonCVADparameters | Send-BrokerSessionMessage -Title "Message from Guy Leech" -MessageStyle Critical -Text "Please logoff & back on as an urgent reboot is required"
Screenshot: A custom popup notifiction created in PowerShell

Abb. 10: Eine in PowerShell erstellte benutzerdefinierte Popup-Benachrichtigung

Beachten Sie, dass die Anwender hierdurch weder aufgefordert werden noch eine Nachfrist erhalten, also stellen Sie sicher, dass sie die Abmeldung ihrer Sitzung erwarten!

Abmelden aller Sitzungen für einen bestimmten Anwender

Get-BrokerSession -UserName guyrleechbillybob @commonCVADparameters | Stop-BrokerSession

Wie oben, wird der Anwender weder aufgefordert, noch erhält er eine Karenzzeit.

Über den Autor: