CustPE : Comment utiliser un bootstrap générique ?
Sommaire
I. Présentation
Cet exemple est issu d'un retour d'expérience qui m'a conduit à implémenter une petite adaptation particulière, plutôt inédite. En effet, bien que probablement marginale, j'ai pensé que ce serait un bon cas d'étude et de réflexion, voire d'inspiration pour vos propres adaptations 🙂 .
L'idée consiste à banaliser le fichier de configuration "bootstrap.ini" et le modifier "à la volée". Cette approche n'est peut être pas la meilleure, mais cela répondait au cahier des charges... De plus, je pense que cette étude permet d’appréhender le MDT sous un angle différent, histoire d'explorer de nouveaux sentiers pédagogiques 🙂
Pour rappel, la fabrication des clients, "Update Deployment Share", est pilotée par un script Powershell qui effectue l'assemblage selon les réglages définis dans l'onglet "Windows PE" ainsi qu'aux directives contenues au sein des fichiers "LiteTouchPE_x64|x86.xml".
En consultant ces derniers, vous constaterez que le fichier "Bootstrap.ini" est copié dans le ramdrive du noyau WinPE soit "X:\Deploy\Scripts\". C'est principalement ce fichier qui détermine la relation du client LiteTouch avec la ressource partagée MDT.
Cette information peut s'avérer bien pratique à connaitre, dès lors que vous utilisez des points de déploiements multiples. En effet, imaginons que vous disposez de plusieurs sites, avec un serveur MDT sur chaque, vous devez admettre que les noms et adresse IP de la ressource partagée seront nécessairement différents. Le MDT propose bien une notion de "points de déploiement liés" ("Linked Deployment Shares") mais cela implique une action de régénération et de mise à jour des clients LiteTouch sur chaque site.
Bien que cela soit prévu dans la console MDT, on peut aussi considérer un autre mécanisme de réplication et ne pas vouloir utiliser cette relation entre points de déploiement. On peut alors imaginer de réaliser un "client LiteTouch commun" en modifiant le fichier "bootstrap.ini" à la volée.
II. Mise en œuvre
On considère que le dernier octet de l'adresse IP des serveurs MDT est identique d'un site à l'autre, et que le nom de la ressource partagée est identique (ie . "\\w.x.y.201\DeploymentShare$"). Le script aura donc la charge d'identifier le réseau du client, et recomposer le chemin UNC du serveur MDT. (Pour simplifier, la classe d'adressage IP est /24 soit un masque 255.255.255.0)
Je précise qu'il s'agit d'un exemple arbitraire et je vous laisse le soin de l'adapter en fonction de votre plan d'adressage IP, du partage de déploiement et autres identifiants propres à votre environnement de test.
A. Montage du noyau WinPE
Montez l'image d'un noyau LiteTouchPE-x...wim en procédant comme suit :
mkdir c:\Mount dism /Mount-Wim /WimFile:c:\DeploymentShare\Boot\LiteTouchPE_x86.wim /index:1 /MountDir:C:\Mount
B. Modification du fichier Bootstrap.ini
Modifiez le fichier "[MountWIM]\Deploy\Scripts\Bootstrap.ini" via le bloc-notes, afin de remplacer le chemin UNC de la ressource partagée MDT par une chaîne spécifique "DeployRoot=@UNC@" ainsi que le nom du domaine/machine "UserDomain=@SRV@" utilisé pour former l'identifiant de connexion.
Notepad C:\Mount\Deploy\Scripts\bootstrap.ini
Exemple de contenu d'un bootstrap.ini générique
[Settings] Priority=Default [Default] DeployRoot=@UNC@ SkipBDDWelcome=YES UserID=MDT-Depl UserDomain=@SRV@ UserPassword=Pa$$w0rd KeyboardLocalePE=040c:0000040c
Note : Si vous disposez d'un compte de domaine Active Directory, entrez le nom Netbios du domaine au niveau de la variable "UserDomain".
Renseignez vos propres informations, puis enregistrez le fichier modifié et fermez le bloc-notes.
C. Ajouter un script personnalisé
Créez un nouveau script "UpdBootStrap.vbs" dans le dossier "[MountWIM]\Deploy\Scripts"
Notepad C:\Mount\Deploy\Scripts\UpdBootStrap.vbs
Recopiez le contenu ci-après dans ce nouveau fichier
Contenu du UpdBootStrap.vbs
Function UpdateFile (sFile,sBefore,sAfter) Const ForReading = 1 Const ForWriting = 2 Set oFSO = CreateObject("Scripting.FileSystemObject") ' Get-content Set oFile = oFSO.OpenTextFile(sFile, ForReading) sText = oFile.ReadAll oFile.Close sNewText = Replace(sText, sBefore, sAfter) ' Set-content Set oFile = oFSO.OpenTextFile(sFile, ForWriting) oFile.WriteLine sNewText oFile.Close End Function Function CutIP (sIP,iOct) iFirstDot = InStr(1,sIP,".") iSecondDot = Instr(iFirstDot+1,sIP,".") iThirdDot = Instr(iSecondDot+1,sIP,".") iFirstOctet = Left(sIP, iFirstDot-1) iSecondOctet = Mid(sIP, iFirstDot+1, iSecondDot-iFirstDot-1) iThirdOctet = Mid(sIP, iSecondDot+1, iThirdDot-iSecondDot-1) iFourthOctet = Mid(sIP,iThirdDot+1, Len(sIP)-iThirdDot) Select Case iOct Case 1 : CutIP = iFirstOctet Case 2 : CutIP = iSecondOctet Case 3 : CutIP = iThirdOctet Case 4 : CutIP = iFourthOctet Case Else : CutIP = "Indiquez un chiffre entre 1 et 4" End Select End Function '-------------------------- ' Main script '-------------------------- Const sFileName = "X:\Deploy\Scripts\Bootstrap.ini" Const sOctSrv = ".201" ' dernier octet de l'adresse IP du serveur Const sDeployShare="\DeploymentShare$" ' nom du partage MDT ' identification du réseau IP Set oWMIService = GetObject("winmgmts:\\.\root\cimv2") Set IPConfigSet = oWMIService.ExecQuery _ ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE") For Each IPConfig in IPConfigSet If Not IsNull(IPConfig.IPAddress) Then sCurrentIP = IPConfig.IPAddress(0) ' Recomposition du chemin UNC vers la ressource MDT ... sSrvName = CutIP(sCurrentIP,1) & "." & CutIP(sCurrentIP,2) & _ "." & CutIP(sCurrentIP,3) & sOctSrv sDeplUNC = "\\" & sSrvName & sDeployShare Else sDeplUNC = "\\?.?.?.?" & sDeployShare End If Next Confirm = InputBox ("Veuillez confirmer l'emplacement du point de déploiement" & _ vbCrLf & "ou cliquez sur annuler pour redémarrer.","Confirmation",sDeplUNC) If Confirm <> "" Then sKeyword = "@UNC@" ' le chemin UNC (chaine à remplacer) UpdateFile sFileName,sKeyword,sDeplUNC sKeyword = "@SRV@" ' le nom du serveur (chaine à remplacer) UpdateFile sFileName,sKeyword,sSrvName WScript.Echo "Mise à jour " & sFileName & " " & sKeyword & " " & sSrvName Else Set oShell = CreateObject("Wscript.Shell") oShell.Run "wpeutil reboot" End If
Enregistrez ce contenu et fermez le bloc-notes.
D. Modification du fichier winpeshl.ini
Modifiez le fichier "[MountWIM]\Windows\System32\winpeshl.ini"
Notepad C:\Mount\Windows\System32\winpeshl.ini
Contenu du fichier "winpeshl.ini" :
[LaunchApps] %SYSTEMROOT%\System32\wpeutil.exe,InitializeNetwork %SYSTEMROOT%\System32\wpeutil.exe,SetKeyboardLayout 040C:0000040C %SYSTEMROOT%\System32\wscript.exe,X:\Deploy\Scripts\UpdBootStrap.vbs %SYSTEMROOT%\System32\bddrun.exe,/bootstrap
Enregistrez le contenu modifié et fermez le bloc-notes.
Compléments d'information :
Pour votre gouverne, voici quelques éléments qui m'ont conduit à retenir cette modification particulière de ce fichier d'initialisation "winpeshl.ini" .
En fait, ce fichier existe déjà sur un client LiteTouch et a pour charge d'initialiser l'environnement WinPE via le programme spécifique "BDDRun.exe". L’enchaînement de l'initialisation des couches réseaux est une difficulté majeure de cette démonstration, du fait que nous effectuons une modification du fichier "bootstrap.ini" en même temps. L'idée est donc d'ajouter l'exécution du script "UpdBootStrap.vbs", avant le lancement de "BDDRun.exe,/Bootstrap".
Si le script a besoin du réseau, il ne faut pas lancer wpeinit, car il va interpréter le fichier "unattend.xml" dans la foulée et lancer les commandes qu'il contient.
Dans ce cas, je pense que la modification la plus logique est de :
- soit ajouter la commande "wpeutil InitializeNetwork" au début du fichier "\Windows\System32\winpeshl.ini"
- soit supprimer toutes les directives "RunSynchronous" du fichier "\unattend.xml" et les transposer intégralement dans le fichier winpeshl.ini
Je me permets d'ajouter quelques précisions sur l'outil "BDDRun.exe", dont le fonctionnement, je l'avoue, reste à mon avis encore bien obscur. Issues de mon expérience, je vous demanderait donc de ne pas prendre ces informations comme des affirmations et de les considérer avec précaution :
- Modifié depuis MDT2010
- Pas ou très peu documenté. BDDRun.exe est un lanceur de commandes, qui ne semble supporter que 2 options
- /Bootstrap
- /BootstrapNoSF8
- Exécute implicitement "wpeinit" lorsque l'un de ces commutateurs précité est stipulé.
- Reste chargé en mémoire, typiquement pour l'exploitation des variables MDT et la surveillance de l'appui sur [F8]
- Sollicité par les scripts MDT (pour exécuter des programmes avec un minimum d'affichage visible, sauf .bat et .cmd.), comme par exemple :
- Bddrun startnet.cmd
- Bddrun wscript.exe, X:\deploy\scripts\LiteTouch.wsf
- Dans un contexte Windows (hors WinPE), les programmes sont exécutés avec le niveau de privilèges élevés (hors UAC).
- BDDRun garantit également que le dossier de travail est correctement positionné pour les processus lancés. Par exemple, il agit ainsi sur le contexte d'exécution des scripts utilisant des objets WScript.Shell ou les installations de packages .MSI, afin de minimiser les risques d'erreurs.
Pour cette démonstration, j'ai ajouté 2 lignes préliminaires , faisant appel à l'outil spécifique WinPE "wpeutil.exe" afin de :
- Initialiser la couche réseau sans passer par BBDRUN, ni WPEINIT
- Passer le clavier en AZERTY du fait que le fichier "bootstrap.ini" n'est pas encore traité lors de l'ouverture de la boite de dialogue, sinon le clavier reste en QWERTY par défaut.
E. Démontage du noyau WinPE
Démontez l'image du noyau WinPE modifié en enregistrant les modifications, via la commande suivante :
dism /Unmount-Wim /MountDir:C:\Mount /commit
Voilà, la modification est terminée et il ne vous reste plus qu'a injecter ce noyau au sein d'un structure amorçable telle qu'une clé USB, un CDROM ou bien encore un serveur WDS.
Voici un exemple de ce que vous pourriez obtenir lors du démarrage de ce client LTI.
Boite de dialogue du script "UpdBootStrap.vbs" permettant de saisir et/ou valider le chemin d'accès au partage MDT.
Message du script indiquant la modification effectuée :
La suite du scénario, lancement de l'assistant "wizard.hta" dépend bien sur de la configuration de votre MDT ... 😉
Bonne continuation
Christophe M.