ScriptRunner Blog
Fehlerbehebung bei CITRIX Virtual Apps und Desktops mit PowerShell
Inhaltsverzeichnis
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).
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.
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
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:
A4. Wann und wo hat sich der Anwender billybob angemeldet?
Get-BrokerSession -UserName guyrleechbillybob @commonCVADparameters | select machinename,client*,DesktopGroupNam
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
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
A7. Liefergruppenstatistik anzeigen
Get-BrokerDesktopGroup | select Name,Desktop*,Enabled,InMaintenanceMode,Total* | ogv -PassThru
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.
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"
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:
Berater, Software-Entwickler, Troubleshooter. Aktueller Citrix CTP, VMware vExpert, und Microsoft MVP. Erfinder von AppSense Application Manager. PowerShell-Süchtiger.