Attaquons nous maintenant au vif du sujet, l’intégration de l'objet MFCOM.
Pour cela, PowerShell dispose de la commande New-Object –COM qui comme son nom l’indique instancie des objets Com.
L'exemple suivant va nous montrer comment instancier l'objet et afficher le nom de la ferme Citrix:
$farm = new-Object -com "MetaframeCOM.MetaframeFarm"
$farm.Initialize(1)
$farm.FarmName

Poussons un peu plus loin et faisons la liste des connections en pré formatant le résultat:
$farm = new-Object -com "MetaframeCOM.MetaframeFarm"
$farm.Initialize(1)
$farm.FarmName
$farm.sessions | Format-Table UserName,AppName,SessionID

Maintenant, nous allons intégrer des conditions afin de mieux filtrer nos requêtes.
Par exemple, nous voulons la liste des clients dont la résolution des de 1024*768 :
$farm = new-Object -com "MetaframeCOM.MetaframeFarm"
$farm.Initialize(1)
$farm.FarmName
$farm.sessions | Where-Object { $_.ClientHRes -eq 1024 } |
Format-Table UserName,ClientHRes

Si l’inverse est demandé, tout est possible :
$farm = new-Object -com "MetaframeCOM.MetaframeFarm"
$farm.Initialize(1)
$farm.FarmName
$farm.sessions | Where-Object { $_.ClientHRes -ne 1024 } |
Format-Table UserName,ClientHRes

Nous allons maintenant insérer une interaction entre le script et l’utilisateur :
$farm = new-Object -com "MetaframeCOM.MetaframeFarm"
$farm.Initialize(1)
$farm.FarmName
$hres = Read-Host "Entrez une résolution horizontale"
$farm.sessions | Where-Object { $_.ClientHRes -eq $hres } |
Format-Table UserName,ClientHRes

Voila, une première étape sur MFCOM + PowerShell est effectuée, nous allons maintenant nous tourner vers les Xenapp Commands Technology preview (CTP2) de Citrix !
Afin de mieux exploiter ce toolkit, voici comment récupérer la liste complète des fonctions :
PS W:\> Get-Command -PSSnapin Citrix* | sort Noun, Verb | select name
Pour avoir plus d’info, il est possible d’énumérer un court résumé de la fonction ainsi que des exemples :
PS W:\> get-help Get-XAFarm

PS W:\> get-help Disconnect-xasession –examples

Nous voila avec les bases, nous allons maintenant voir comment imbriquer plusieurs cmdlets.
Afin de comparer CTP2 & PowerShell + MFCOM, les mêmes scripts seront repris.
Récupérer le nom de la ferme Citrix :
PS W:\> Get-XAFarm
Lister les sessions :
PS W:\> Get-XASession | Format-Table AccountName,BrowserName,SessionID

Lister les utilisateurs dont la résolution est égale à 1024*768 :
Et la … c’est le drame ! Il est en effet pour l’instant impossible de récupérer certaines valeurs de session même en forçant la commande avec le switch –Full si l’on ne spécifie pas un serveur cible.
Commande logiquement attendue :
PS W:\> Get-XASession –Full
Commande renvoyant la variable complète :
PS W:\> Get-XASession -ServerName XENAPP1 –Full
Le but de PowerShell étant d’automatiser les taches, il est logique de tester :
PS W:\> Get-XAServer | Get-XASession -ServerName $_.ServerName –Full
Ce qui nous renvoi un joli message :

Après recherche sur le forum Citrix, il est en effet impossible de faire un Pipe entre 2 commandes Get-, il est actuellement disponible que pour un passage de Get- a Set- ( limité à un seul Pipe), Ceci devrait être corrigé dans les prochaines versions.
Il nous faut donc revenir aux méthodes plus traditionnelles :
$servers = get-xaserver
foreach ($server in $servers)
{
Write-host "Server: " $server.ServerName -fore yellow -nonewline
Get-XASession -ServerName $server.ServerName –Full | where
{$_.HorizontalResolution -eq '1024'} | format-table AccountName,HorizontalResolution
}

La grande force des CTP est de pouvoir reproduire chaque action des différentes consoles de gestion Citrix et ceci de manière automatique.
Pour les besoins de ce tutorial, j’ai délibérément changé la résolution et le fenêtrage de certaines applications, nous allons maintenant essayer de tout harmoniser :

Resserrons l’étau sur nos petits moutons noirs …
Get-XAApplication |Where-Object { $_.WindowType -ne "100%" -or
$_.ColorDepth -ne "TrueColor" } | Format-Table DisplayName,WindowType,ColorDepth

N’oubliez pas le switch –WhatIf, il permet de simuler une commande sans en faire les changements !
Puis Harmonisons !
$apps = Get-XAApplication | Where-Object { $_.WindowType -ne "100%" -or $_.ColorDepth -ne "TrueColor" }
foreach($BrowserName in $apps )
{
Set-XAApplication -whatif -BrowserName $BrowserName -WindowType "100%" -ColorDepth "TrueColor"
}
Enlevons le whatif, puis vérifions le résultat du script :

Nous voyons ici les possibilités d’automatisation sur une ferme de plus grande échelle et ceci avec un minimum de connaissance en scripting.
Il faudra attendre la version finale du produit pour pouvoir s’exprimer sur les réels bénéfices des cmdlets Citrix, celles-ci étant encore incomplètes et surtout point important, ne supportant pas le multifarm. Les scripts utilisent la ferme auquel est rattaché le serveur d’exécution, il est par contre possible d’exécuter un script à distance.
Nous pouvons néanmoins concéder une simplicité d’utilisation accrue grâce au worklow orienté « task ». Une nouvelle voie est ouverte pour les administrateurs Citrix et je dois admettre être impatient de pouvoir utiliser ces outils en version finale.
Il n’est pas recommandé d’utiliser ces outils dans un environnement de production, tout du moins pour une première utilisation, je recommande fortement de tester les scripts sur une ferme de test, plusieurs bugs ayant déjà été recensés. La démarche la plus raisonnable serait de commencer par convertir les scripts MFCOM vers des scripts PS/MFCOM (le sdk étant beaucoup plus stable à l’heure actuelle).
Note pour les développeurs .NET, les CTP ne pourront être utilisées sous .Net que par le biais d’un RunSpace (ce qui équivaut à simuler une session PowerShell).