J12Setup - V1.1.2


1) Introduction.


J12Setup est un petit programme d'installation écrit en PowerShell. A la base, j'ai écris des programmes d'installations spécifiques pour chacun de mes logiciels en fonction de mes besoins. J12Setup regroupe maintenant l'ensemble de mes fonctions dans un seul programme.

J12Setup se compose de 3 parties :
- Setup.exe (ou Setup.ps1) : Programme d'installation.
- Uninstall.exe (ou Uninstall.ps1) : Programme de désinstallation.
- Setup.xml : Fichier de configuration (Optionnel pour la version .ps1).

J12Setup contient les fonctions suivantes :
- Setup : Copie des fichiers.
- Setup : Copie des dossiers.
- Setup : Ajoute de droit sur un dossier (version basique).
- Setup : Ajoute de clés de registre.
- Setup : Créer un raccourci sur le bureau.
- Uninstall : Suppression des fichiers.
- Uninstall : Suppression des dossiers.
- Uninstall : Suppression des clés de registre.
- Uninstall : Supprimer le raccourci sur le bureau.

De plus J12Setup gère la création du répertoire d'installation du programme (ex:J12Starter) et celui du groupe de programmes (ex:J12-Services). Il vérifie les droits pour l'installation, et affiche les erreurs éventuelles.


2) Sources.


J12Setup-112.zip contient les fichiers suivants :
- Setup.exe : Programme d'installation.
- Setup.ps1 : Source Powershell du programme d'installation.
- Uninstall.exe : Programme de désinstallation.
- Uninstall.ps1 : Source Powershell du programme de désinstallation.
- Setup.xml : Exemple de fichier xml.


3) Exemple de fonctionnement.


Nous allons voir ici les fenêtres qui s'affiche lors de l'installation d'un programme :

Photo - Screen
J12Setup peut-être configuré pour installer plusieurs programmes.
Cette fenêtre permet de sélectionner le programme à installer.

Photo - Screen
Cette fenêtre permet de sélectionner le répertoire d'installation.

Photo - Screen
Cette fenêtre affiche le message final de succès ou l'erreur rencontré.


Fenêtre lors de la désinstallation :

Photo - Screen
J12Setup peut-être configurer pour installer plusieurs programmes.
Cette fenêtre permet donc de sélectionner le programme à désinstaller.

Photo - Screen
Cette fenêtre affiche le message final de succès ou l'erreur rencontré.


A noter : Il n'y a pas de barre de progression prévu dans ce programme. La raison est simple, les programmes que j'ai développé comporte peu de fichiers et s'installe donc instantanément. Dans mon cas la barre de progression n'a donc pas d'intérêt. J'ajouterai ça peut-être plus tard ... ou pas :b.


4) Configuration XML.


Le fichier de configuration "setup.xml" est prioritaire sur la configuration interne. Il doit se trouver dans le même dossier que le Setup et le Uninstall. Bien sûr c'est le même fichier .xml qui sert pour l'installation et pour la désinstallation.

<?xml version="1.0" standalone="yes"?>
<Install>
  <Titre>J12-Starter</Titre>
  ...
</Install>


<Install> Notre configuration est délimité par cette balise.
<Titre> Permet de spécifier un titre qui sera converti en image, puis affiché sur la volet gauche de la fenêtre. Attention y a pas beaucoup de place alors faite court.

<?xml version="1.0" standalone="yes"?>
<Install>
  <Titre>J12-Starter</Titre>
  <Option>
    ...
  </Option>
  <Option>
    ...
  </Option>

</Install>


<Option> La première page de J12Setup affichera autant de choix de programme à installer qu'il y a de balise <Option>. Ceci permet de proposer à l'utilisateur de choisir entre plusieurs programmes. Par exemple, Eco7 est composé de deux programmes, un programme principale et une console distante.

<?xml version="1.0" standalone="yes"?>
<Install>
  <Titre>J12-Starter</Titre>
  <Option>
    <Nom>J12-Starter V1.3.7</Nom>
    <Exe>J12Starter.exe</Exe>
    <Root>
      <Dossier>J12-Services</Dossier>
      <Dossier>J12Starter</Dossier>
      <Registre>J12-Services</Registre>
      <Registre>J12Starter</Registre>
    </Root>
    ...
  </Option>
</Install>


<Nom> Nom de l'option qui s'affichera dans la première page (Ex : J12Starter V1.3.7).
<Exe> Nom de l'exécutable qui doit être présent dans le dossier source. Si ce fichier n'existe pas dans la source, le programme affichera "Cette option n'est pas disponible".
<Root> Regroupe les balises correspondants aux dossiers et registres d'installation par défaut.
Cette balise contient deux types de balises :
    <Dossier> Nom du dossier d'installation par défaut.
    <Registre> Nom de la clé de registre utilisée pour l'installation.

La première occurrence de la balise <Dossier> présente dans <Root> sera utilisée pour créer un répertoire sous "%ProgramFiles%". La seconde occurrence de la balise <Dossier> sera utilisée pour créer un répertoire sous "%ProgramFiles%\Nom du 1er dossier". Les deux occurrences formeront le chemin complet d'installation par défaut "%ProgramFiles%\Nom du 1er dossier\Nom du 2eme dossier". La seconde balise <Dossier> peut être omise. Dans ce cas le chemin d'installation par défaut sera simplement "%ProgramFiles%\Nom du 1er dossier".

La première occurrence de la balise <Registre> dans <Root> sera utilisée pour créer une clé sous "HKCU\Software". La seconde occurrence de la balise <Registre> sera utilisée pour créer une clé sous "HKCU\Software\Nom de la 1ere clé". Les deux occurrences formeront le chemin complet d'installation dans le registre "HKCU\Software\Nom de la 1ere clé\Nom de la 2eme clé". La seconde balise <Registre> peut être omise. Dans ce cas le chemin d'installation dans le registre sera simplement "HKCU\Software\Nom de la 1ere clé".

<?xml version="1.0" standalone="yes"?>
<Install>
  <Titre>J12-Starter</Titre>
  <Option>
    <Nom>J12-Starter V1.3.7</Nom>
    <Exe>J12Starter.exe</Exe>
    <Root>
      <Dossier>J12-Services</Dossier>
      <Dossier>J12Starter</Dossier>
      <Registre>J12-Services</Registre>
      <Registre>J12Starter</Registre>
    </Root>

    <Fichier> <Nom>J12Starter0.txt</Nom> <Ecraser>1</Ecraser> </Fichier>
    ...
    <Dossier> <Nom>Toto</Nom> <Ecraser>1</Ecraser> </Dossier>
    ...
    <Acl> <Dossier>Toto</Dossier> <Groupe>GUS</Groupe> <Droit>M</Droit> </Acl>
    ...
    <Registre> <Nom>Toto</Nom> <Valeur>1</Valeur> <Type>Dword</Type> <Ecraser>1</Ecraser> </Registre>
    ...
  </Option>
</Install>


<Fichier> Définit un fichier source à copier sur la destination.
Cette balise doit contenir les 2 balises suivantes :
    <Nom> Nom du fichier à copier.
    <Ecraser> Indique si le fichier de destination doit être écrasé (1) ou non (0).

<Dossier> Définit un dossier source à copier sur la destination. Les fichiers présent dans le dossier source seront également copiés.
Cette balise doit contenir les 2 balises suivantes :
    <Nom> Nom du dossier à copier.
    <Ecraser> Indique si le dossier de destination doit être écrasé (1) ou non (0).

<Acl> : Définit un droit pour un dossier présent à la destination.
Cette balise doit contenir les 3 balises suivantes :
    <Dossier> Nom du dossier ou nous allons ajouter un droit.
    <Group> Trigramme du groupes à ajouter :
        GAS Groupe Administrateurs.
        GUP Groupe Utilisateurs avec Pouvoir.
        GUA Groupe Utilisateurs Authentifiés.
        GUS Groupe Utilisateurs.
        TLM Tout Le Monde.
    <Droit> Les droits sont prédéfinit comme suite :
        R ou Read Donne le droit de lire dans le dossier.
        M ou Modify Donne le droit de lire et d'écrire et de supprimer dans le dossier.
        F ou FullControl Donne tout les droits dans le dossier.

<Registre> : Définit une clé ou donnée à enregistrer dans le registre.
Cette balise doit contenir les 4 balises suivantes :
    <Nom> Nom de la donnée ou de la clé à enregistrer dans le registre.
    <Valeur> Valeur de la donnée (Ignoré si c'est une clé).
    <Type> Les types de données sont les suivants :
        Dword Valeur numérique.
        String Chaine de caractères.
        Binary Valeur binaire (0 ou 1).
        Cle Indique que l'on souhaite créer une nouvelle clé de registre.
    <Ecraser> Indique si la destination doit être écrasé (1) ou non (0).

Les balises <Fichier>, <Dossier>, <Acl>, <Registre> sont répétables autant de fois qu'il y a d'élément à mettre en place. Nous pouvons écrire par exemple :
<Fichier> <Nom>MonFichier1.txt</Nom> <Ecraser>1</Ecraser> </Fichier>
<Fichier> <Nom>MonFichier2.txt</Nom> <Ecraser>0</Ecraser> </Fichier>
<Fichier> <Nom>MonFichier4.txt</Nom> <Ecraser>1</Ecraser> </Fichier>

La balise <Ecraser> est prévu à la base pour conserver la configuration et les données utilisateurs qui sont présent dans le dossier d'installation. Lors de l'installation, les fichiers existant sur la destination ne seront pas remplacé si <Ecraser> est à 0. Lors de la désinstallation, le comportement sera identique, et les éléments ou <Ecraser> est à 0 ne seront pas supprimés. Gardez bien à l'esprit que c'est à vous de bien définir les éléments à conserver et ceux à écraser/supprimer.


5) Configuration interne (.ps1 uniquement).


Une fois n'est pas coutume, J12Setup contient les versions .exe et .ps1. Si vous utilisez le version .exe, vous n'aurez pas d'autre choix que d'utiliser la configuration via le fichier .xml. Par contre, si vous utilisez la version .ps1, il est possible de configurer les options directement dans le script Powershell. Garder bien à l'esprit que si le fichier setup.xml est présent, il est prioritaire sur la configuration interne.

Voici comment se présente la configuration interne dans les scripts setup.ps1 et uninstall.ps1 (les commentaires en moins ^^).

#------------------------------------------------------------------------------------------------------#
# ZONE DE CHARGEMENT MANUEL
#------------------------------------------------------------------------------------------------------#
$Titre = "Titre"

$global:Opts += ,@("MonProgramme V1.0.0","MonExe1.exe","Dossier1","Dossier2","Cle1","Cle2")
$global:Opts += ,@("MonProgramme V2.0.0","MonExe2.exe","Dossier3","Dossier4","Cle3","Cle4")
$global:Fich += ,@(1,"MonFichier1.txt",1)
$global:Fich += ,@(2,"MonFichier2.txt",1)

$global:Doss += ,@(1,"MonDossier1",1)
$global:Doss += ,@(2,"MonDossier2",1)

$global:Regs += ,@(1,"MaDonnee1","1","DWord",1)
$global:Regs += ,@(2,"MaDonnee2","2","DWord",1)

$global:Acls += ,@(1,"MonDossier1","GUS","M")
$global:Acls += ,@(2,"MonDossier2","GAS","F")

#------------------------------------------------------------------------------------------------------#
# FIN ZONE DE CHARGEMENT MANUEL
#------------------------------------------------------------------------------------------------------#


Dans cet exemple, nous installons 2 programmes. Le premier s'appel "MonProgramme V1.0.0" et le second "MonProgramme V2.0.0". Commençons par la première ligne.

$global:Opts += ,@("MonProgramme V1.0.0","MonExe2.exe","Dossier3","Dossier4","Cle3","Cle4")

Celle-ci correspond aux balises <Nom>, <Exe> et <Root> du fichier .xml. Si je fais le parallèle avec le fichier xml j'obtiendrais cela :
= ,@(<Nom>,<Exe>,<Root><Dossier>,<Root><Dossier>,<Root><Registre>,<Root><Registre>)

Nous retrouvons donc dans le tableau $global:Opts le Nom du programme tel qu'il sera afficher dans la première fenêtre d'installation, puis le nom de l'exécutable à tester pour s'assurer que l'option est bien disponible dans les sources, le premier dossier et le second dossier qui permettent de construire le chemin d'installation par défaut, et la première clé et la seconde clé de registre qui permettent de construire le chemin des stockages des données dans le registre.

$global:Opts += ,@("MonProgramme V1.0.0","MonExe1.exe","Dossier1","Dossier2","Cle1","Cle2")
$global:Opts += ,@("MonProgramme V2.0.0","MonExe2.exe","Dossier3","Dossier4","Cle3","Cle4")


Notez bien que $global:Opts est doublé. La première ligne définit les éléments de bases de mon premier programme et la seconde définit les éléments de bases de mon second programme. Notez que la premier ligne correspondra par la suite à notre index 1, et la seconde à notre index 2.

$global:Fich += ,@(1,"MonFichier1.txt",1)

Celle-ci correspond à la balise <Fichier> du fichier .xml. Si je fais le parallèle avec le fichier xml j'obtiendrais :
= ,@(1,<Fichier><Nom>,<Fichier><Ecraser>)

Bas et le 1 c'est quoi ? Vous l'avez déjà devinez !? En effet, c'est mon index. Ici le 1 correspond à la première ligne de mon tableau $global:Opts. Ceci permet de dire que tout les fichiers déclaré dans le tableau $global:Fich qui commence par 1 doivent être traitées lors de l'installation de "MonProgramme V1.0.0". Dans l'exemple ci dessus, il n'y a qu'un seul fichier pour mon premier programme. Mais s'il y en avait eu plusieurs, j'aurais écrit :
$global:Fich += ,@(1,"MonFichier1.txt",1)
$global:Fich += ,@(1,"MonFichier3.txt",1)

$global:Fich += ,@(1,"MonFichier4.txt",1)

Pour le reste c'est le même principe. Les dossiers :

$global:Doss += ,@(1,"MonDossier1",1)

Celle-ci correspond à la balise <Dossier> du fichier .xml. Si je fais le parallèle avec le fichier xml j'obtiendrais :
= ,@(1,<Dossier><Nom>,<Dossier><Ecraser>)

Le registre :

$global:Regs += ,@(1,"MaDonnee1","1","DWord",1)

Celle-ci correspond à la balise <Registre> du fichier .xml. Si je fais le parallèle avec le fichier xml j'obtiendrais :
= ,@(1,<Registre><Nom>,<Registre><Valeur>,<Registre><Type>,<Registre><Ecraser>)

Les droits :

$global:Acls += ,@(1,"MonDossier1","GUS","M")

Celle-ci correspond à la balise <Acl> du fichier .xml. Si je fais le parallèle avec le fichier xml j'obtiendrais :
= ,@(1,<Acl><Dossier>,<Acl><Group>,<Acl><Group>,<Acl><Droit>)


Dans le fonctionnement de J12Setup, La configuration interne est définit dans la zone de chargement manuel comme nous venons de le voir. Mais, si le programme détecte un fichier setup.xml, les tableaux que nous venons de voir seront remis à zéro et rechargé avec les données contenues dans le fichier setup.xml. 


6) Journal de bord.


30.04.2021    J12Setup v1.1.2 - Correction de bug de marge qui apparait suivant le thème utilisé.
31.05.2016    J12Setup v1.1.1 - Correction de bug.
28.05.2016    J12Setup v1.1.0 - Amélioration divers.
20.04.2016    J12Setup v1.0.0 - Première version.