15/11/2024

Déploiement MDT - WDS

CustPE : Comment utiliser un bootstrap générique ?

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.

WPE02-img03
Traitement du fichier "Bootstrap.ini"

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.

WPE02-img04
Mise à jour du fichier bootstrap.ini

 

 

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
WPE02-img05
Création du nouveau script "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.

WPE02-img06
Enregistrement du script "updBootstrap.vbs"

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.

WPE02-img07
Modification du fichier "winpeshl.ini"

 

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.

WPE02-img07b
Boite de dialogue du script "UpdBootStrap.vbs"

Message du script indiquant la modification effectuée :

WPE02-img07c
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.

author avatar
Christophe Mandin Consultant - Formateur indépendant
Consultant/Formateur indépendant en quête de solutions et de moyens alliant efficacement la théorie et la pratique. Fort d’une expérience de plusieurs dizaines années dans l’informatique, j’ai pu apprécier de nombreuses problématiques, développer des qualités rédactionnelles et un esprit de synthèse, tout en me forgeant de solides fondamentaux théoriques, indispensables à toute analyse et mise en œuvre fonctionnelle. Malgré toutes ces années, je ne me lasse pas du plaisir de transmettre mes connaissances en misant sur 3 critères que sont les fondamentaux, la simplicité et le pragmatisme. Bien à vous. Retrouvez-moi sur LinkedIn : Christophe Mandin
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.