Inventaire des installations

L’ensemble des serveurs d’un silo applicatif XenApp doivent être dans le même état, aussi bien en terme de configuration que d’installation. Malheureusement ils arrivent que l’installation des applications ne soit pas automatisable. Ainsi, suivant la taille de la ferme, il fort probable qu’il y aura des oublis sur un ou plusieurs serveurs… De plus, il peut arriver que les admins lors d’un dépannage installent quelques outils et oublient de les retirer. Sans oublier, les intervenants des projets, qui sous besoin de faire une validation grandeur nature, installent des morceaux de logiciels sur quelques serveurs. Nous pouvons donc estimer que le silo applicatif n’est pas aussi homogène que nous l’espérions!

Récuperer la listes des logiciels installé sur un serveur

Win32_Product

Dans un premier temps, l’objet WMI de Win32_Product nous parait très intéressant ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa394378(v=vs.85).aspx) et contient toutes les informations dont nous avons besoin.Malheureusement, il est optionnel pour Windows 2003 et donc non disponible sur ce silo applicatif (http://msdn.microsoft.com/en-us/library/windows/desktop/aa392726(v=vs.85).aspx#windows_installer_provider ). Vu que le but n’est pas d’ajouter d’autres logiciels sur le silo , nous allons chercher un autre moyen de récupérer ces information.

Le registre

Nous allons donc utiliser le registre Microsoft. En effet, les informations d’installation des paquets “windows installer” sont mémorisé dans la ruche HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall. Ainsi,nous pouvons donc utiliser l’objet microsoft.win32.registrykey ( http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1 ) pour parcourir et récupérer les informations depuis le registre.


$computername = "ServeurDistant"
$uninstallkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
#Ouverture de la ruche sur le serveur distant
$reg=[microsoft.win32.registrykey]::OpenRemoteBaseKey('LocalMachine',$computername)
$subkeys=$reg.OpenSubKey($UninstallKey)

#Récupération des noms des sous clés
$subkeys=$regkey.GetSubKeyNames()
foreach($key in $subkeys){

        $thisKey=$UninstallKey+"\\"+$key
        $thisSubKey=$reg.OpenSubKey($thisKey)
	#On affiche la valeur de la clé DisplayName de la ruche.
	$thisSubKey.GetValue("DisplayName")
}

Des tableaux et des Hashtables

Pour nous aider à présenter l’inventaire de façon compréhensible pour un humains, nous allons utiliser une hashtable avec comme nom de clé : le nom des serveurs, et comme valeur : le tableau des logiciels installés récupéré via le registre.

Les tableaux

Nous allons juste nous concenter sur les opérateurs dont nous aurons besoin pour les tableaux

Déclaration d’un tableau vide $list_soft

$list_soft = @()

Ajout d’un élément à la fin d’un tableau

$list_soft += $element

Vérification de la présence d’un élement dans un tableau

if( $list_soft -contains $element ){
//Do something
}

Vérification de l’absence d’un élement dans un tableau

if( $list_soft -notcontains $element ){
//Do something
}

Fusion d’un tableau en une chaine de caractère avec les valeurs séparé par “;”

$strCVS= $list_soft -Join ';'
}

Les hashtables

Definition d’une Hashtable vide

$hash=@{}

Ajout d’une clé à la hashtable

$hash.add($key, $val)

Récupérer l’ensemble des clés d’une hashtable

$hash.Keys

Accéder au contenu de la clé MaCle d’une hashtable

$hash.MaCle

Mettons le tout ensemble

$hash = @{}
$list_soft = @()

get-XAserver | % {
    echo "Working on : " $_.ServerName
    $computername= $_.ServerName

    $array = @()
    $UninstallKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
    $reg=[microsoft.win32.registrykey]::OpenRemoteBaseKey('LocalMachine',$computername)
    $regkey=$reg.OpenSubKey($UninstallKey)

    $subkeys=$regkey.GetSubKeyNames()
    foreach($key in $subkeys){

        $thisKey=$UninstallKey+"\\"+$key

        $thisSubKey=$reg.OpenSubKey($thisKey)

        if( $list_soft -notcontains $thisSubKey.GetValue("DisplayName") ){
            $list_soft += $thisSubKey.GetValue("DisplayName")
        }
        $val = $thisSubKey.GetValue("DisplayName")
        if( $val){
            $array += $val
        }
    }
    $hash.add($_.Servername,$array)
}

$strCVS =";"
$strCVS+= $list_soft -Join ';'
$finalTab = @($strCVS)

$hash.Keys | %{

    $a = @($_)

    $tmp = $hash.$_

    $list_soft | %{
        if( $tmp -contains $_ ){
            $a+="X"
        }else{
            $a+=" "
        }
    }
    $finalTab+= $a -join ";"
}
$str =  $finalTab -join "`n"
Set-content -Path ".\state_install.csv" $str

Leave a Reply

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