Interroger la base InstallManager avec Powershell

Sur une ferme XenApp 4.5 2003, nous avons eu besoin de récupérer les informations d’installation d’Install Manager, plus précisément nous voulions savoir sur quels serveurs certains packs ne s’étaient pas installés. Nous pouvions bien sur passer par l’interface graphique de la CMC, mais avec plusieurs tâches d’installations effectuées sur de très nombreux serveurs avec des doublons, la GUI s’est avérée peu exploitable.

Nous nous sommes donc tournés vers Powershell, mais, pas de cmdlets pour IM sur les serveurs 2003… Il a bien fallu se rendre à l’évidence, nous allions devoir utiliser les objets COM via Powershell.

Powershell et COM

Notre première interrogation fut de savoir comment récupérer tous les objets COM XenApp accessible depuis Powershell. Nous allons donc utiliser le oneliner de Keith Hill’s

gci HKLM:\Software\Classes -ea 0| ? {$_.PSChildName -match '^\w+\.\w+$' -and (gp "$($_.PSPath)\CLSID" -ea 0)} | ft PSChildName

Nous allons légèrement le modifier pour ne lister que les objets commençants par MetaFrame

gci HKLM:\Software\Classes -ea 0| ? {$_.PSChildName -match '^MetaFrame\w+\.\w+$' -and (gp "$($_.PSPath)\CLSID" -ea 0)} | ft PSChildName

PSChildName
-----------
MetaFrameCOM.MetaFrameAccountAuthority
MetaFrameCOM.MetaFrameAdministrator
MetaFrameCOM.MetaFrameAIE
MetaFrameCOM.MetaFrameAIERoot
MetaFrameCOM.MetaFrameAIERule
MetaFrameCOM.MetaFrameAIERules
MetaFrameCOM.MetaFrameAIESrvBinding
MetaFrameCOM.MetaFrameApplication
MetaFrameCOM.MetaFrameAppliedPolicy
MetaFrameCOM.MetaFrameAppPackage
MetaFrameCOM.MetaFrameAppPackages
MetaFrameCOM.MetaFrameAppSrvBinding
MetaFrameCOM.MetaFrameAppSrvBindings
MetaFrameCOM.MetaFrameClientPrinter
MetaFrameCOM.MetaFrameConfigLogging
MetaFrameCOM.MetaFrameCredential
MetaFrameCOM.MetaFrameFarm
MetaFrameCOM.MetaFrameFile
MetaFrameCOM.MetaFrameFileType
MetaFrameCOM.MetaFrameFileTypes
MetaFrameCOM.MetaFrameFolder
MetaFrameCOM.MetaFrameFolders
MetaFrameCOM.MetaFrameGroup
MetaFrameCOM.MetaFrameIcon
MetaFrameCOM.MetaFrameID
MetaFrameCOM.MetaFrameIMApp
MetaFrameCOM.MetaFrameIMConfig
MetaFrameCOM.MetaFrameIMJob
MetaFrameCOM.MetaFrameIMPackage
MetaFrameCOM.MetaFrameIMPackages
MetaFrameCOM.MetaFrameIPRange
MetaFrameCOM.MetaFrameLicense
MetaFrameCOM.MetaFrameLicenseNumber
MetaFrameCOM.MetaFrameLicenseSet
MetaFrameCOM.MetaFrameLMRule
MetaFrameCOM.MetaFrameLMRules
MetaFrameCOM.MetaFrameLoadEvaluator
MetaFrameCOM.MetaFrameMe
MetaFrameCOM.MetaFrameMultiString
MetaFrameCOM.MetaFrameMyAccount
MetaFrameCOM.MetaFrameMyAccounts
MetaFrameCOM.MetaFrameMyServer
MetaFrameCOM.MetaFrameMyServers
MetaFrameCOM.MetaFramePkgSrvBinding
MetaFrameCOM.MetaFramePkgSrvBindings
MetaFrameCOM.MetaFramePolicy
MetaFrameCOM.MetaFramePolicyFilter
MetaFrameCOM.MetaFramePrinter
MetaFrameCOM.MetaFramePrinterDriver
MetaFrameCOM.MetaFramePrinterDriverMapping
MetaFrameCOM.MetaFramePrinterDrivers
MetaFrameCOM.MetaFramePrinters
MetaFrameCOM.MetaFramePrivileges
MetaFrameCOM.MetaFrameProcess
MetaFrameCOM.MetaFrameServer
MetaFrameCOM.MetaFrameServerGroup
MetaFrameCOM.MetaFrameSession
MetaFrameCOM.MetaFrameSmartCardSetting
MetaFrameCOM.MetaFrameSpeedBrowse
MetaFrameCOM.MetaFrameStreaming
MetaFrameCOM.MetaFrameTime
MetaFrameCOM.MetaFrameUser
MetaFrameCOM.MetaFrameVCPolicy
MetaFrameCOM.MetaFrameVIPRange
MetaFrameCOM.MetaFrameVirtualChannel
MetaFrameCOM.MetaFrameZone

Les objets MetaFrameCOM.MetaFrameIMApp, MetaFrameCOM.MetaFrameIMConfig, MetaFrameCOM.MetaFrameIMJob, MetaFrameCOM.MetaFrameIMPackage et MetaFrameCOM.MetaFrameIMPackages nous paraissent intéressant!

Le dernier prérequis avant d’interroger la base IM est de savoir instancier un objet COM avec powershell, sans surprise nous le faisons avec le cmdlet new-object.

$farm = New-Object -Com MetaFrameCOM.MetaFrameFarm   

Interroger IM

L’objet MetaFrameCOM.MetaFrameIMConfig contient toutes les informations qui nous intéressent. En effet, la collection Jobs contient toutes les taches effectuées. Malheureusement les informations contenu la collection Servers dans un Job parait difficilement exploitables.

$IMSetting.Jobs | % { $_.Servers }

                                    Package                                      Server                                   JobStatus
                                    -------                                      ------                                   ---------
                        5428245162090523254                         1825365275508219860                                           0
                        5428245162090523254                         9150470069426331476                                           0
                        5428245162090523254                         4319233569164634904                                           0
                        5428245162090523254                         5766577899410827928                                           0

La valeur du champs Server de la collection est en fait l’ID64 des serveurs Citrix. Pour l’exploiter, nous allons créer un objet MetaFrameId avec cette information, et ensuite, utiliser cette ID pour initialiser un objet serveur

$_.Servers | % {
            $server = new-object -com MetaFrameCOM.MetaFrameServer
            $mfID = new-object -com MetaframeCom.MetaFrameID
            # Création d'un objet MetaFrameId avec l'ID64 du serveur
            $mfID.ID64 = $_.server
            # Initialisation de l'objet Server avec le MetaFrameId
            $server.initbyServerID($mfID)
}

Mettre le tout ensemble

Nous allons utiliser un objet ArrayList, avant de profiter de la méthode “Remove”. En fait, nous allons remplir le tableau avec tous les serveurs de la ferme et retirer au fur et à mesure ceux qui ont réussi l’installation (JobStatus 0 ou 8).

Leave a Reply to Virtuaprod Cancel reply

Your email address will not be published. Required fields are marked *