Introduction batch: Exemple de script de sauvegarde compressée Introduction Objectifs Cette note de synthèse a pour but, de présenter et d'initier à la programmation batch, tout en se penchant sur l'étude d'un script réalisé en entreprise. Ce langage connu de nom, que j'ai pu apprendre et palper durant mon stage, a su me plaire tant par sa simplicité et que par sa robustesse. Ce fut pour moi, comme un bond dans le passé, du temps de l'informatique à ses débuts. C'est cela, qui m'a poussé à en faire le sujet de ma note de synthèse, plutôt que de choisir mon autre projet de stage de réalisation de pages web dynamiques. Coup de coeur envers les nombreuses facéties de cet ancien langage. La sauvegarde chez les Entreprises Dans chaque entreprise, la sauvegarde des données est essentielle voire capitale pour sa survie. Ainsi, la sauvegarde est un problème, mais surtout un problème de poids qu'il nous faut traiter. Durant mon stage, je fus confronter à ce problème et mon objet de stage fut de pouvoir élaborer un script permettant de sauvegarder les données d'un utilisateur, tout en compressant ces dernières, afin d'en réduire l'espace utilisé sur le disque de stockage. User du batch pour la réalisation, c'est faite suite à une discussion avec ancien élève, aujourd'hui professeur, qui me dit « Pourquoi pas utiliser le batch ? ».
1. Apprendre ... toujours apprendre. 1.1. Introduction au DOS Le DOS (« Disk Operating System ») est un OS (Operating System => système d’exploitation). Comme tout système d’exploitation, c’est un programme permettant de fournir la base des services indispensables à la gestion d’une machine. Sa version la plus commercialisée est celle de Microsoft, MS-DOS, qui a vu le jour en 1981 lors de son utilisation sur un IBM PC. Celui-ci est constitué de trois fichiers vitaux qui sont Io.sys, Msdos.sys et Command.com.
La communication vers le système se fait à l’aide de commandes. Cette communication exige un vocabulaire et une syntaxe précise, afin que le DOS puisse interpréter et effectuer les tâches que l’utilisateur demande. COMMAND Exemple de commandes:
PARAMÈTRE
OPTIONS
Sous Windows 98
Sous Windows_NT
Cd
X
X
Dir
X
X
Del Copy Cls
X X X
X X X
Commandes
Color Format
X X
Help
X X
Path
X
X
Xcopy
X
X
Propriété Affiche et Modifie le répertoire courant. Liste les fichiers et répertoires et sous-répertoires. Supprime les fichiers. Copie des fichiers. Nettoie l'écran. Modifie les couleurs de la console. Formate un lecteur disque. Affiche des informations sur les commandes. Affiche le chemin d'accès des fichiers exécutables. Copie des fichiers et des répertoires.
**Windows_NT se trouve Windows 2000,XP,NT
Pour Windows 95/98, l'aide du dos se trouve dans le répertoire oldmsdos du dossier other. Pour exécuter une commande, il suffit de taper la commande à partir du terminal, puis d'appuyer sur "ENTRÉE". Accéder à MS-DOS ou à l’émulateur DOS : Windows 98: Poste de Travail => exécuter => Taper : command Windows 2000, XP: Poste de Travail => exécuter => Taper : CMD. Pour sortir de la console DOS, taper : EXIT. 1.2. Qu'est ce que le batch ? Historiquement et par définition le Batch : « Fournée » , « Paquet »: Le terme vient du temps oú on programmait les ordinateurs avec des cartes perforées, qu'on donnait à l´administrateur par paquets en espérant que tout fonctionne bien. Traitement par lots. C'est un fichier contenant un ensemble de commandes qui seront traitées automatiquement comme si elles étaient entrées au clavier par l'utilisateur, les unes après les autres. Contraire exact de l'intéractivité. C'est un fichier ASCII (texte non mis en forme) contenant une ou plusieurs commandes du système d'exploitation. Le nom de fichier d'un programme de commandes possède une extension .cmd ou .bat pour Windows ou .sh pour linux. Lorsque vous tapez le nom de fichier á l'invite de commandes ou lorsqu'un programme de commandes est exécuté á partir d'un autre
programme, ces commandes sont traitées de manière séquentielle. Les programmes de commandes sont également appelés fichiers de commandes. L'intérêt des batch est donc d'automatiser des tâches répétitives effectuées sous DOS. 1.3. Le langage batch Un fichier Batch n'est rien de plus qu'un fichier texte contenant des commandes MS-DOS ; ainsi une connaissance DOS est requise pour effectuer une programmation batch. Pour que ces instructions soient compréhensibles, il nous faut user d’un vocabulaire adéquate et ordonné. Quelques commandes: ECHO: C'est une commande de sortie comme printf en langage C, mais aussi de désactivation. En effet, lors de l'exécution d'un batch toutes les commandes sont affichées. Afin de pallier à l'affichage de celles-ci, on rajoute un off. Ce qui donne: echo off . Grâce à cela, les commandes ne sont désormais plus visibles. Cependant, la commande echo off elle, l'est toujours. ...:oO ... Ainsi, l'astuce pour pouvoir la rendre invisible est de lui rajouter un @ qui va masquer la commande qui le suit. @ echo off REM: Cette commande nous permettra de faire des commentaires En programmation, les commentaires sont presques " vitaux ". Un code bien commenté facilite la lecture et le débuggage. PAUSE: Comme son nom l'indique, permet de " break " son programme, ce qui peut nous être utile afin de visualiser le résultat de notre travail ou intéressant pour un débuggage ligne par ligne. GOTO: Cet outil va permettre d'effectuer des sauts inconditionnels. Ainsi, possibilité de faire des boucles ou encore sauter de parties de programme qui ne nous intéressent pas. LABEL: C'est le nom de l'arrivée du saut. N.B: Éviter les labels de même nom. rem Petit exemple de boucle @ echo off rem Désactive l'affichage des commandes pour tout le script :encore rem Définition du label echo la programmation c'est fun ! rem Affichage du texte goto encore rem Boucle, saut vers le label spécifié
IF: Commande permettant d'introduire des conditions de le fichier batch. Elle nous fait réellement sentir que nous sommes programmeur, celui qui peut faire tout faire à son ordinateur. Son principe étant, si cette action se déroule comme nous le voulons, alors je passe à autre chose. Ainsi, un sentiment de contrôle sur le cours du programme. À notre IF, d'autres conditions peuvent se rajoutées: IF NOT, IF EXIST, IF NOT EXIST. CHOICE: Cette commande va nous permettre d'attendre un caractère saisi au clavier, comme un getchar en programmation C. Grâce à ce dernier, l'élaboration de petit menu devient possible, du même style que les menus en langage C avec des switch. N.B: La commande CHOICE n'existe pas dans les systèmes_NT. ELSE: Nouveauté présente que sur les OS_NT, elle représente un véritable bond en ce qui concerne la programmation batch. Nous permet ainsi, d'effectuer une action si la condition du IF n'est pas satisfaite. rem Exemple: @ echo off rem Désactive l'affichage des commandes pour tout le script. if exist e:dir rem si le lecteur e: existe, alors je liste l'ensemble de ses fichiers, répertoires, sousrépertoires. else exit rem Sinon je ferme la console. |: Se nomme « pipe », il s'agit d'un caractère de redirection Il va alors, rediriger la sortie d'une commande vers l'entrée d'une autre. Elle s'avère très utile pour mettre en place un système de réponse automatique. rem Exemple: @ echo off rem Désactive l'affichage des commandes pour tout le script. echo n|format e: /Q rem la sortie de echo "n" est redirigé à l'entrée de la commande format, ici on procèdera à une annulation de formatage automatique. Pour une meilleure compréhension de ces outils je vous invite à visualiser le petit exemple situé dans la troisième partie de cet article.
2. Environnement utilisateur en entreprise 2.1. Étude Bien qu’étant les fruits d’une même entreprise, victime du temps, les systèmes Windows 95, 98 n’ont pas les possibilités des systèmes Windows_NT (Windows NT, Windows 2000, Windows XP). Cela se remarque dès l’installation. Les OS_NT vous demandent de choisir entre un système de fichiers connu sous 98, le FAT 32 et un autre, le NT FS.
De ce fait, l’arrivée des systèmes NT a permis l’apparition d’un système de fichiers (ntfs) étant á la fois plus sécuritaire et meilleur gestionnaire de l’espace disque que son prédécesseur. Aussi, afin d’effectuer notre script, nous devons déjà prendre en compte tous ces paramètres. La démarche pour une sauvegarde compressée de données ne sera pas la même qu’il s’agisse d’environnement NT ou 98. Il faudra songer á assurer une certaine compatibilité. Sur les systèmes NT, la réalisation du script en fichier batch s’avérera plus simple. En effet, sur ses Operating System, un outil de compression est déjá disponible. Il suffira d’insérer dans notre code la commande compact afin d’effectuer une compression.
Les utilisateurs de Windows 98, eux, ne disposent pas de cet outil. Une aide d’un logiciel tierce de compression serait envisageable. Ainsi, il nous faut rechercher un logiciel efficace, exécutable sous dos au moyen d’une simple commande, de licence pas très onéreuse; les plus connus WinRar et PKZIP. 2.2. Synchronisation des postes clients et du serveur de sauvegarde Le principe de sauvegarde de données des utilisateurs fonctionne de la façon suivante : Les utilisateurs placent le plus souvent leur fichier, leur dossier dans leur répertoire « Mes Documents ». Aussi, sur leur demande, le script de sauvegarde compressée devra stocker ses données sur un disque de sauvegarde, présent sur un serveur distant. Pour se faire, afin d’être efficace et rapide il devra comparer les fichiers, selon leur date de dernière modification. Aussi, dans les systèmes Windows, une commande exécutable sous MS-DOS permet de le faire: XCOPY avec les bons attributs. Afin de permettre à cette commande un environnement de travail optimal, et ainsi éviter de nombreux bugs dans les phases de test, il serait préjudiciable de synchroniser l’heure du serveur avec celle des postes clients. EXEMPLE: L’étude d’un exemple concret, nous permettra de rendre plus imagé cette démarche. Notre parc informatique possède un serveur NT 4.0 sur lequel se trouve un disque de sauvegarde et des machines clientes fonctionnant sous Windows 2000 pro et XP pro. Pour accéder au disque de sauvegarde, nous userons de U:, et pour une machine cliente disons C:. Imaginons maintenant que l’heure de notre serveur possède, admettons 20 minutes de retard,
sur l’heure d’une des machines clientes. Supposons que les utilisateurs aient un droit de modification sur leurs fichiers directement sur le disque (U:) de sauvegarde. Nous sommes alors en face d’une situation « dangereuse ». Ainsi, ces heureux utilisateurs ou groupes utilisateurs de cette machine risquent d'avoir quelques mauvaises surprises au niveau de la sauvegarde (pleures et grincements de dents sont au rdv :o( ). Disons que l’utilisateur avec pouvoir sauvegarde ses documents, contenus dans son C:, sur le U:. Cependant, comme par hasard, en accédant au U: pour vérifier son travail, il s’aperçoit d’une erreur. Il la rectifie alors, depuis le U:, puis retourne de suite à son poste. S’il utilise le script à cet instant … Pouf !!! … boulette :oO !! En effet, la commande XCOPY effectue une comparaison au niveau de la date de dernière modification. La machine cliente et le serveur n'ayant pas les mêmes horaires, et la modification ayant été effectuée dans un laps de temps inférieur à 20 minutes, XCOPY croyant bien faire, remplacera certains fichiers qu’elle n’aurait pas du. Elle remplacera le fichier contenu dans le U: par celui du même nom se trouvant sur le C:, puisque c'est celui-ci qui possède la date de dernière modification connue. Schéma récapitulatif:
1: 14h50 sur le client => première sauvegarde du code du programmeur. 15h00 sur le serveur => modification sur le serveur. 2: 2ème sauvegarde. (15h00 - 20min de retard) = 14h40 < 14h50 L'heure de dernière modification connue étant plus récente sur le client que celle du serveur, la modification effectuée sur le serveur n'est pas prise en compte. Il y a donc remplacement et perte de données !! Afin de pallier à ce problème, il faudrait peut être songer, pour les utilisateurs ayant un compte de domaine, à basculer sur un profil itinérant, plutôt que local. Ce qui permettrait aux machines clientes et au serveur d’avoir le même horaire, et d’interdire le réglage de l’heure à l’utilisateur, par Access Control List (ACL : contiennent les permissions associés aux objets « Serveur Windows 2000 »). 2.3. Les Variables
Comme tout langage de programmation, le batch permet d’utiliser des emplacements mémoire pour stocker des informations : les variables. Celles-ci sont nommées, définies, voire modifiées et nous permettent de manipuler facilement des données. En effet, les variables sont très utiles dans les scripts, en allègent l’écriture et facilitent grandement la vie du programmeur. Lors de la définition des variables, il n’est pas indispensable de se casser la tête sur la casse, elle se trouve être non-discriminatoire pour le DOS. Afin de déclarer, initialiser, modifier, supprimer des variables, nous faisons appel à la commande SET. set nom_variable = valeur Exemple: J’aimerais initialiser une variable avec le nom Kathy, … :oO, ce n’est pas trop compliqué: set nom = Kathy rem Nom possède la valeur Kathy. Pour utiliser notre variable dans le script, on lui rajoutera désormais des %. Ainsi, pour afficher la valeur de la variable à l’écran, nous mettrons dans notre batch : rem Petit fichier batch d'affichage de contenu de variable @echo off set nom=Kathy rem affichage d'une ligne vide echo. rem affichage du contenu de la variable echo %nom% Astuce: Pour supprimer celle-ci, nous mettrons rem on initialise avec rien set nom= Voilà :o) . Cependant, le plus intéressant quand nous devons faire des scripts, c’est bien les variables d’environnement. Pour en avoir fait l’expérience, je vous assure qu’elles facilitent nettement le travail du programmeur. Il existe deux types de variables d'environnement, système et locales, qui définissent le comportement de l'environnement de l'interpréteur de commandes ou l'environnement complet du système d'exploitation. Les variables d'environnement système sont prédéfinies dans le système d'exploitation. Les variables d’environnement peuvent être visualisées au moyen de la commande SET, à l’invite de commande. C:>SET Elles sont intéressantes, certes car elles vous permettent de ne pas écrire des chemins d’accès à des fichiers d’une longueur à vous faire pâlir, ou d’accéder au Path pour permettre de lancer des compilations java (par exemple). Néanmoins, lors de la réalisation de votre script en entreprise, il s’avérera qu’il soit compatible avec les operating system de celle-ci. L’évolution vers des systèmes NT, a fait du coup évoluer le nombre de variables
d’environnement disponibles. Ainsi, Windows XP ou 2000 possèdent le double des variables disponibles chez 95/58. C'est-à-dire, la facilité dont vous faîtes preuve pour scripter sur les OS_NT, vous fera grincer des dents en adaptant pour 95/98. Quelques variables d’environnement disponibles: Variable
Fonction
Présent sur:
Renvoie l'emplacement auquel les applications stockent Win 98,NT les données par défaut. Os Renvoie le nom du système d'exploitation. Win NT Spécifie le chemin pour la recherche des fichiers Path Win 98,NT exécutables. Tmp & Temp Renvoie les répertoires par défaut temporaires utilisés. Win 98,NT Username Renvoie le nom de l'utilisateur qui a ouvert une session. Win NT Renvoie l'emplacement du profil de l'utilisateur en Userprofil Win NT cours. Contenant l'adresse du répertoire démarrage de Winbootdir Win 98 Windows. Renvoie l'emplacement du répertoire du système Windir Win NT d'exploitation. Appdata
3. Place à la pratique 3.1. Exemple Afin de rendre plus attractif cet article, nous allons effectuer un script ayant à peu près le même principe que celui réalisé en entreprise. Néanmoins, cet automate ne fonctionne que sur les systèmes NT (FS : NTFS). Vous pourrez appeler ce script, soit à partir de votre terminal en utilisant la commande CALL (permettant d'appeler des fichers batch) et lui rajouter des paramètres (le nom de votre fichier ou dossier contenu dans « Mes Documents », la lettre du lecteur sur lequel vous voulez le sauvegarder), soit en double cliquant sur votre batch ; celuici sauvegardera tout en compressant votre dossier « Mes Documents » dans votre lecteur principal C:. Exemple d'utilisation: Les paramètres se placent derrière la ligne de commande, appelant votre batch et sont séparés par des espaces. Astuces: pour mettre un paramètre contenant des espaces dans son nom, nous lui aposeront des parenthèses. rem il nous faut écrire de la façon suivante: rem ligne de commande paramètre_1 paramètre_2 paramètre_3 call nom_du_batch "votre pseudo" "nom du fichier" lettre_du _lecteur:
Code: rem désactivation de l'affichage des commandes @echo off rem nettoyage de l'écran cls rem saut de ligne echo. rem affichage du titre echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» echo º º echo º BIENVENUE º echo º º echo »ÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ echo. echo. rem test pour connaitre l'OS si la condition rem est vérifiée alors saut vers le label spécifié if (%OS%)==(Windows_NT) goto mouahaha rem sinon affichage du texte echo Ce n'est pas un systŠme NT rem temps d'arrêt pause rem sortie exit rem définition d'un label :mouahaha rem changement de couleur color 1F rem si le premier parametre n'est pas vide rem alors je saute vers le label: nom if ("%~1")==("") goto nom rem changement du titre de la fenêtre
rem avec la valeur du premier paramètre title %~1 rem affichage du pseudo echo Bien le bonjour … toi: %~1 echo. rem temps d'arrêt pause goto saut :nom rem titre de la fenêtre avec le nom rem de l'utilisateur de session title %username% echo Bien le bonjour … toi: %username% pause :saut echo. rem test de tous les paramètres echo pseudo: %~1 echo nom de fichier: %~2 echo lecteur: %3 echo. pause cls rem test de connaissance du paramètre nom de fichier if("%~2")==("") goto tout rem test pour savoir s'il y a un lecteur spécifié else if not (%3)==() cd %3 rem création d'un nouveau dossier if not exist %3\save972 md %3\save972 rem définition et initialisation de variable set ok = %3\save972 cd %userprofile%\"Mes Documents" rem sauvegarde du fichier spécifié xcopy .\%~2 %ok% /y/e/r/h/d rem sauvergarde carnet d'adresse if exist %appdata%\Microsoft\"Address Book" cd %appdata%\Microsoft\"Address Book" xcopy .\%username%.wab %ok% /y/e/r/h/d cls echo phase de compression rem compression compact %ok% /C /S /A /I echo sauvegarde effectu‚e avec succŠs !! echo Aurevoir %~1 ¤_¤ pause>nul rem retour à la fenetre DOS goto :eof :tout if not exist c:\save972 md c:\save972 set save = C:\save972 rem sauvegarde de mes documents
cd %userprofile%\"Mes Documents" xcopy .\*.* %save% /e/y/r/d/h rem sauvergarde carnet d'adresse if exist %appdata%\Microsoft\"Address Book" cd %appdata%\Microsoft\"Address Book" xcopy .\%username%.wab %save% /y/e/r/h/d cls echo phase de compression compact %save% /C /S /A /I echo sauvegarde effectu‚e avec succŠs !! echo Aurevoir %~1 ¤_¤ pause>nul goto :eof Conclusion Pour conclure, le batch est un langage de pogrammation très pratique et simple pour nous permettre d'automatiser certaines tâches. En entreprise, il s'avère très efficace, pour effectuer des tâches de sauvegarde. Cependant, la diversité des Operating System en entreprise, peut représenter un frein lors du déploiement final.
2. Les scripts batchs à coder Basiquement, un fichier batch n'est rien de plus qu'un fichier texte contenant des commandes MS-DOS, et possédant le suffixe ".bat". Nous allons donc faire une bref récapitulatif de quelques commandes avant de nous intéresser aux deux scripts qui vont permettre l’installation centralisée de notre application.
2.1. Les principales commandes batch •
• •
CD : permet de naviguer dans une arborescence. o CD \ : revient à la racine du disque. o CD "c:\start menu" : se place dans le dossier c:\start menu. o CD .. : permet de revenir au dossier précédent. REM ou « :: » : permet de placer des commentaires dans son code. Exemple : REM --Ceci est un commentaire. SET : initialisation d’une variable. Exemple : SET var=titi (la var sera ensuite réutilisée avec %var%)
•
• •
•
•
• • •
•
•
ECHO : permet d’écrire une chaîne de caractère a l’écran ou de la rediriger dans un fichier texte grâce au signe « > ». Exemple : ECHO Texte redirigé dans un txt > c:\temp\test.txt REN : permet de renommer un fichier. Exemple : REN old.txt new.txt ":" : Annonce le début d’un label. Le nom ne doit pas dépasser 8 lettres (si le nom du label dépasse 8 lettres, seules les 8 premières lettres seront prises en compte), et ne pas être composé d'espaces. La différence majuscule/minuscule n’est pas prise en compte pour les labels et les Goto. Exemple : :fontion echo Nous sommes dans la fonction. GOTO : Permet d’aller à la fonction appelée. Exemple : GOTO test :test echo Vous avez été redirigé vers la fonction test Un batch peut recevoir jusqu’à neuf paramètres. Ceux-ci sont stockés dans 9 variables notées %1 à %9. Contrairement aux variables classiques, on observe 3 grosses différences : on ne peut pas les modifier, elles ne sont pas encadrées par 2 « % » (seulement précédés d’un seul « % »), enfin, elles sont spécifiques pour chaque batch. Exemple : Soit le batch suivant : Monbatch.bat @echo off echo Le premier paramètre est %1 echo Le second paramètre est %2 On le lance ensuite avec la commande : C:\Tests\Monbatch.bat /V ABC.EXE Ce qui donne : @echo off echo Le premier parametre est /V echo Le second parametre est ABC.EXE CALL : permet d’appeler un fichier extérieur (un .exe ou un .bat par exemple). Exemple : CALL \banner.bat COPY ou XCOPY: Permet de copier des fichiers et des dossiers (XCOPY a le même rôle que COPY mais possède plus d’options) "Nul" représente un périphérique virtuel inexistant. Utilisé avec ">" et ">>", il permet d'écrire" le résultat de commande vers rien du tout, c’est-à-dire, en clair, de les masquer. La commande à gauche de « > nul: » est exécutée correctement, mais son résultat n’est pas affiché. ">" et ">>" : Les redictions permettent d’envoyer des chaînes de caractères dans des fichiers texte par exemple. Ces deux symboles sont très utilisés pour faire une log lors d’une installation. Le « > » crée le fichier s’il n’existe pas et écrit au début. Le « >> » quant à lui écrit à la suite du fichier texte. "|", "||", "&" et "&&" : Les expressions conditionnelles permettent de simplifier énormément une ligne de code car il peut lier une action e fonction du résultat de la première. o "|" : Permet d’utiliser le résultat de la première opération en entrée pour la seconde Exemple : ECHO y| CACLS %SystemRoot%\%%~nxi /c /p administrators:f system:f users:r > nul: o "||" : Permet d’exécuter la deuxième opération uniquement si la première a échoué. o "&" : Permet d’exécuter la deuxième opération après la première quel que soi le résultat de celle-ci.
"&&" : Permet d’exécuter la deuxième opération uniquement si la première a réussi. DEL : permet de supprimer un ou plusieurs des fichiers. Exemple : DEL c:\temp\test Dans ce cas il faudra ensuite confirmer par y (yes) pour que la commande s’accomplisse. Afin d’éviter cette étape supplémentaire, on peut écrire : @ECHO OFF ECHO o|DEL c:\temp\test > nul: MKDIR : permet de créer un répertoire CACLS : permet de régler les droits d’accès sur des dossiers. Exemple : cacls %SystemRoot%\Winnt /c /p administrators:f system:f users:r > nul: Le batch peut utiliser des boucles for et des actions conditionnelles if comme en langage C qui permet par exemple de gérer l’installation de certaines applications en fonction de l’OS (if %OS% ==nt4...) o
•
• • •
2.2. Le fichier updatelocal.cmd Le fichier updatelocal.cmd local doit être présent sur chaque serveur susceptible d’être mis à jour. Il permet de "mapper" le serveur d’installation et d’aller récupérer les logiciels à l’aide d’une simple commande. "update nom_logiciel" vérifie si le fichier est installé ou non et renvoie un message dans la fenêtre du type : "Administration Kit seems to be already installed" ou "Macromedia Flash Player not installed", "update nom_logiciel on" permet de lancer l’installation (après avoir vérifié que le package n’etait pas déjà présent sur la machine). Il faudra bien entendu se placer dans le dossier ou vous avez placé le fichier avant de lancer la commande sauf si le fichier est présent dans le "path" d’origine (par exemple : C:\Winnt ou C:\Winnt\System32). Voici donc le updatelocal.cmd : @ECHO OFF REM --- Some default settings REM --SET MASTER_DRIVE=X: SET MASTER_SHARE=\\srvinstall\soft SET MASTER_USER=srvinstall\Administrator REM --- Make sure we are not on the %MASTER_DRIVE% drive REM --cd /d %SystemDrive%\ REM --- Unmount %MASTER_DRIVE% drive REM --IF exist %MASTER_DRIVE% NET USE %MASTER_DRIVE% /d > nul: REM --- Mount %MASTER_SHARE% on %MASTER_DRIVE% REM --TITLE NT Setup: Mounting %MASTER_SHARE% on %MASTER_DRIVE%... NET USE %MASTER_DRIVE% %MASTER_SHARE% /user:%MASTER_USER%
/persistent:no REM --- Start update REM --REM --- Stop Norton Services during installation REM --SCLIST -r | FIND /i "Norton Antivirus Server" > nul: && NET STOP "Norton Antivirus Server " > nul: TITLE NT Setup: Running server side script... CALL %MASTER_DRIVE%\updatesrv.cmd %1 %2 %3 %4 %5 REM --- Restart Norton Services after installation REM --SCLIST -s | FIND /i "Norton Antivirus Server" > nul: && NET START " Norton Antivirus Server " > nul: goto :eof Pour que le service Norton puisse se stopper, il est indispensable que le nom du service corresponde au nom renseigné dans le script. Si le service s’appelle "NAV Corporate Edition", celui-ci ne pourra pas être arrêté et il se peut que la mise a jour rencontre des problèmes. De plus, la version ci-dessus est très simplifiée et on peut par exemple rajouter des tests comme un ping du serveur d’installation. Si la machine ne répond plus, ce processus permettrait de basculer sur une machine de secours.
2.2. Le fichier updatesrv.cmd Le fichier updatesrv.cmd du serveur d’installation contient les scripts nécessaires à la mise en place des applications. En voici une brève présentation : • •
•
La variable UPDATE_SOFTWARE correspond à la liste des applications disponibles séparées par un espace. Elle peut être mise à jour très facilement par la suite. Le script va ensuite rechercher un chaîne de caractère dans la version de l’OS et dans un clé de registre particulière ce qui permet par la suite de distinguer une installation en fonction de la version de l’OS et de ses spécificités (srv, tse, etc.). Cette méthode se révèle très pratique lorsque le logiciel n’est compatible qu’avec un seul OS ou que les clés de registre à modifiées sont différentes. Le label :install appelle ensuite le label correspondant au premier argument rentré par l’administrateur (le nom du logiciel à mettre à jour) qui lance ensuite son installation. Dans l’exemple ci-dessous, l’installation consiste simplement à copier le contenu d’un dossier vers C:\Winnt et de redéfinir les droits sur les dossiers copiés par sécurité.
@ECHO OFF REM --- Software list REM ---
SET UPDATE_SOFTWARE=reskit REM --- Which OS ? REM --VER | FIND /i "4.0" > nul: && ( SET OS=NT4 (REG QUERY HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions | FIND /i "ServerNT" > nul:) && (SET NT=srv) (REG QUERY HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions | FIND /i "Enterprise" > nul:) && (SET NT=ese) (REG QUERY HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions | FIND /i "Terminal" > nul:) && (SET NT=tse) ) VER | FIND /i "2000 [Version 5.0" > nul: && ( SET OS=W2K SET COPY_OPTIONS=/y (REG QUERY HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions | FIND /i "ServerNT" > nul:) && (SET NT=srv) (REG QUERY HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions | FIND /i "Enterprise" > nul:) && (SET NT=ase) (REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" | FIND /i "TSAppCompat" | FIND /i "0x1" > nul:) && (SET NT=tse) ) VER | FIND /i "2000 [Version 5.1" > nul: && ( SET OS=2k3 SET COPY_OPTIONS=/y (REG QUERY HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions | FIND /i "ServerNT" > nul:) && (SET NT=srv) (REG QUERY HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions | FIND /i "Enterprise" > nul:) && (SET NT=ase) (REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" | FIND /i "TSAppCompat" | FIND /i "0x1" > nul:) && (SET NT=tse) ) TITLE NT Setup FOR %%i IN (%UPDATE_SOFTWARE%) DO IF /i "%1" == "%%i" GOTO install GOTO help REM --- Beginning install REM --:install SET MSG=Updating software ECHO %MSG% CALL :%1 %2 %3 %4 %5 GOTO :eof :help CLS
TITLE NT Setup ECHO Usage: update [option [suboption...]] ECHO where [option] is one of the following "system" (1/1): ECHO reskit [on] : Resource Kit Utilities ECHO. ECHO. ECHO. ECHO. ECHO. ECHO. ECHO. ECHO. ECHO. ECHO. PAUSE REM --- Resource Kit Utilities REM --:reskit SET MSG=Administration Kit TITLE Updating system: %MSG%... REM --- Check install REM --IF /i "%1" == "on" GOTO install_reskit FOR %%i IN (%MASTER_DRIVE%\ResKit\%OS%\*.*) DO IF not exist %SystemRoot%\%%~nxi GOTO install_reskit FOR %%i IN (%MASTER_DRIVE%\ResKit\%OS%\System32\*.*) DO IF not exist %SystemRoot%\System32\%%~nxi GOTO install_reskit ECHO %MSG% seems to be already installed!... GOTO secure_reskit REM --- Install REM --:install_reskit IF /i not "%1" == "on" (ECHO %MSG% not installed!& GOTO :eof) XCOPY %MASTER_DRIVE%\ResKit\%OS%\*.* %SystemRoot% /e /c /i /q /h /r %COPY_OPTIONS% > nul: 2> nul: ECHO %MSG%... REM --- Secure directory and file permissions REM --:secure_reskit FOR %%i IN (%MASTER_DRIVE%\ResKit\%OS%\*.*) DO ECHO y| CACLS %SystemRoot%\%%~nxi /c /p administrators:f system:f users:r > nul: FOR %%i IN (%MASTER_DRIVE%\ResKit\%OS%\System32\*.*) DO ECHO y| CACLS %SystemRoot%\System32\%%~nxi /c /p administrators:f system:f users:r > nul: GOTO :eof
Voici l’arborescence du serveur d’installation. Il est indispensable que le répertoire soft soit partagé sur le réseau avec les droits appropriés afin que les autres machines puissent y accéder pour leur mise a jour (au moins read et execute pour le compte utilisé pour l’installation). On remarque le fichier "updatesrv.cmd" est mis à la racine de soft tandis que chaque application possède son répertoire propre.